ADR-004: 비동기 콜백
상황 (Context)
Ablecity API(사주 계산)와 OpenAI API(LLM 운세) 호출은 시간이 걸린다 (각각 0.5-2초). 사용자가 "사주 등록" 버튼을 누르면 응답을 기다려야 하는 문제가 발생한다. 이 둘을 순차적으로 호출하면 더 시간이 걸린다.
의사결정 (Decision)
Ablecity 비동기 콜백 패턴 도입
- 사용자가 생년월일 제출 → BFF가 즉시 응답 (사주 객체 with 로딩 상태)
- Ablecity에 비동기 요청 (웹훅 콜백 URL 지정)
- Ablecity 계산 완료 후 BFF 콜백 엔드포인트로 POST
- 콜백 수신 후 DB 업데이트 + LLM 호출 (비동기)
- 클라이언트는 폴링 또는 WebSocket으로 상태 갱신
근거 (Rationale)
- 즉시 응답: 사용자는 로딩 상태를 보면서 대기 (온보딩 이탈 방지)
- 병렬 처리: Ablecity 계산과 LLM 호출을 분리
- 신뢰성: 재시도 로직으로 API 장애 대응
- 비용 절감: 불필요한 폴링 제거
결과 (Consequences)
✅ 긍정
- 사용자 경험 향상 (빠른 응답)
- 서버 부하 분산
- 재시도 로직으로 안정성 향상
⚠️ 위험
- 콜백 URL이 외부 인터넷에 노출되어야 함 (보안 고려 필요)
- 콜백 타이밍 제어 어려움
- 상태 관리 복잡도 증가
구현 디테일
1. POST /api/saju (클라이언트 요청)
↓ (즉시 응답: { sajuId, status: "pending" })
2. BFF → Ablecity API 비동기 호출 (webhook_url 포함)
3. BFF 환기 콜백: POST /api/internal/saju/callback?token=xxx
4. 콜백 수신 후: DB 업데이트 + LLM 호출 (비동기)
5. 클라이언트: GET /api/saju/{sajuId} 폴링 또는 WebSocket 구독
출시 전 확인사항
- Ablecity 콜백 웹훅 신뢰성 확인
- 콜백 토큰 검증 로직 구현
- 콜백 재시도 정책 (최대 3회, 지수 백오프)
- DB 동시성 제어 (중복 업데이트 방지)
- 콜백 타임아웃 설정 (기본 30분)
상태: ✅ 승인됨 | 최종 수정: 2026-06-25