연운(年運) 조회
개요
연간 운세 흐름을 조회하는 기능입니다. Ablecity의 연운 분석은 수 초~수십 초가 소요되는 서버 사이드 AI/ML 연산이기 때문에, 비동기 웹훅 방식으로 처리합니다.
왜 비동기인가?
동기 방식으로 처리할 경우 두 가지 문제가 발생합니다.
- 클라이언트 타임아웃 — 모바일/웹 브라우저는 30~60초 안에 응답이 없으면 연결을 끊습니다.
- DB 커넥션 고갈 — Spring 트랜잭션이 열린 채로 대기하면 커넥션 풀이 빠르게 소진됩니다.
처리 흐름
클라이언트 서버 Ablecity
│ │ │
│ GET /api/saju/year-fortune │
│ ───────────────────────>│ │
│ │ POST /request-analysis/... │
│ │ Header: X-Callback-URL │
│ │ ─────────────────────────────────>│
│ │ (202 Accepted) │
│ │ <─────────────────────────────── │
│ │ [Ablecity 내부 분석 중] │
│ │ POST [콜백 엔드포인트] │
│ │ <─────────────────────────────────│
│ 응답 (complete / PENDING) │
│ <──────────────────────-│ │
핵심 구현 포인트
1. 커넥션 풀 보호
대기 구간에서 DB 커넥션을 점유하지 않도록 트랜잭션을 의도적으로 중단한 채로 대기합니다. 커넥션을 보유한 채 장시간 대기하면 동시 사용자 수가 커넥션 풀 크기를 넘는 순간 전체 서비스가 중단됩니다.
2. DB 커밋 완료 후 응답 보장
콜백 수신 시 DB 저장이 완전히 커밋된 이후에만 대기 중인 요청에 결과를 전달합니다. 커밋 전 응답이 나가면 클라이언트가 미완성 데이터를 읽게 됩니다.
응답 상태
| 상태 | 조건 | 클라이언트 동작 |
|---|---|---|
complete | 타임아웃 이내 콜백 수신 | 결과 데이터 포함, 즉시 표시 |
pending | 타임아웃 초과 | 로딩 UI 표시 후 재요청 |
궁합 조회도 동일한 비동기 웹훅 패턴으로 구현되어 있습니다. 상세 구조는 트러블슈팅 — 비동기 웹훅 브리지를 참고하세요.