배달대행사 API 연동과 장애 대응 - 오늘드림 서비스 개발기
올리브영이 배달대행사 콜백 API를 12개에서 4개로 통합하고 트랜잭션 전파옵션 오류로 인한 Connection Pool 고갈 장애를 해결한 사례
AI 요약
Context
배달대행사와의 연동이 확대되면서 각 배달대행사마다 동일 기능을 수행하는 서로 다른 API를 별도로 운영하게 되었다. 동일 기능을 하는 API가 여러 개 존재하면서 기능 수정 시 모든 API를 일일이 변경해야 했고, 누락 가능성이 증가했으며, 각 API별로 테스트를 개별 수행해야 하는 관리 오버헤드가 발생했다. 또한 리뉴얼 과정에서 UPDATE 쿼리의 트랜잭션 전파옵션을 REQUIRED에서 REQUIRES_NEW로 변경하면서 특정 시간대에 동시 트랜잭션 수가 Connection Pool 크기를 초과하는 장애가 발생했다.
Technical Solution
- 배달대행사 콜백 API 통합: 라이더 배차, 상품 픽업, 상품 배송완료, 배달 취소의 4가지 기능으로 통합하여 기존 12개 API를 4개로 축소
- API 요청 오류 처리 세분화: Read Timeout/Connection Timeout은 재시도, 서버 에러는 재시도 횟수 제한, 클라이언트 에러는 재시도 없이 처리하는 단계별 핸들링 전략 적용
- 중복 요청 처리: 배달대행사의 동일 주문번호 중복 접수 응답 기능을 활용하여 Read Timeout 발생 시에도 중복접수 응답으로 판단하면 내부적으로 접수 성공으로 처리
- 트랜잭션 전파옵션 조정: 메소드의 트랜잭션 전파옵션을 REQUIRES_NEW에서 REQUIRED로 변경하여 동일 트랜잭션 재사용으로 메소드 호출당 트랜잭션 수 2배 증가 문제 해결
- MSA 기반 장애 격리: MSA 적용으로 일시적 장애를 특정 서비스에 격리하여 전체 올리브영 서비스 장애 확대 방지
Impact
배달대행사 콜백 API가 12개에서 4개로 감소하여 관리 대상 API 숫자 66.7% 감소. 운영상 봐야 할 지표 및 로그 종류도 동일 비율로 감소.
Key Takeaway
외부 시스템 연동 시 각 파트너별 맞춤 API 대신 공통 인터페이스로 통합하면 관리 오버헤드와 오류 가능성을 줄일 수 있다. 트랜잭션 전파옵션과 같은 단순한 설정이 Connection Pool 고갈로 이어질 수 있으므로 변경 전 부하 테스트를 필수적으로 수행해야 한다.
실천 포인트
외부 API 연동을 하는 백엔드 서비스에서 webClient의 onStatus 핸들러를 활용하여 HTTP 상태코드별(2xx, 409 충돌, 4xx 클라이언트 에러, 5xx 서버 에러)로 다른 재시도 전략을 적용하면, 일시적 오류로 인한 불필요한 재시도를 줄이고 명백한 오류는 빠르게 실패 처리할 수 있다. 또한 데이터베이스 트랜잭션 처리 시 전파옵션 변경 전에 Connection Pool 크기와 예상 동시 트랜잭션 수를 계산하여 부하 테스트를 진행하면 프로덕션 장애를 사전에 방지할 수 있다.