Phase 3: 아마데우스 발권 API 심층 분석
1. API 엔드포인트 개요
1.1 발권 관련 엔드포인트
| 엔드포인트 | 메서드 | 기능 | 위치 |
|---|---|---|---|
/internals/AMADEUS/ticketing/ready | POST | 발권 준비 및 검증 | AmadeusTicketingController.kt:21-31 |
/internals/AMADEUS/ticketing | POST | 실제 발권 실행 | AmadeusTicketingController.kt:33-49 |
2. 발권 준비 (Ready)
2.1 발권 준비 플로우
flowchart TD A[발권 준비 요청] --> B[PNR 정보 조회] B --> C{Carrier Time<br/>Limit 확인} C -->|2분 미만| D[예외 발생<br/>TICKETING_FAILED] C -->|충분| E{Carrier PNR<br/>확인} E -->|AB 항공사| F[체크 생략] E -->|기타 & null| G[예외 발생<br/>carrier pnr is null] E -->|정상| H{티켓 존재<br/>확인} F --> H H -->|있음| I[예외 발생<br/>ticket exists] H -->|없음| J{스케줄 상태<br/>확인} J -->|HK/KK 아님| K[예외 발생<br/>NON_RETRIEVABLE_SCHEDULE_STATUS] J -->|정상| L{확정 필요<br/>확인} L -->|KK 존재| M[PNR 확정<br/>savePnrWithRetrieve] L -->|모두 HK| N[운임 재계산 필요 확인] M --> N N -->|필요| O[Repricing 수행] N -->|불필요| P[결과 반환] O --> P 예외 처리 F --> ERR{예외 발생} ERR --> K[5초 대기] K --> L[Void 시도<br/>3회 반복] L --> M[결제 취소] M --> N{keepPnr} N -->|false| O[PNR 취소] N -->|true| P[PNR 유지] O --> Q[예외 재발생] P --> Q 다크/라이트 모드 호환 색상 style C fill:#F4E4B1,stroke:#333,stroke-width:2px,color:#000 style G fill:#95D5A6,stroke:#333,stroke-width:2px,color:#000
제거 대상 요소
- 기존 커미션 (변경 필요 시)
- FOP (Form of Payment) (재생성을 위해)
- Tour Code (필요시)
5.2 개별 승객 발권
위치: AmadeusTicketingService.kt:383-409
passengerPrices.forEach { passengerPrice ->
inSeries {
val retryCount = amadeusClient.ticketing(
identificationKey = passengerPrice.identificationKey,
isInfant = passengerPrice.type == PassengerType.INFANT,
hasInfant = hasInfant(passengerPrice, passengerPrices),
statefulBuilder = this,
timeoutCallback = {
slackService.sendTicketingTimeout(...)
}
).second
}
}6. 재시도 메커니즘
6.1 발권 재시도
위치: AmadeusClient.kt:888-891
@Retryable(
maxAttempts = 3,
backoff = Backoff(delay = 2000),
exceptionExpression = "@amadeusClient.shouldTicketingRetryable(#root)",
)- 최대 시도: 3회
- 백오프: 2초
- 재시도 조건:
shouldTicketingRetryable메서드 판단
6.2 Void 재시도
위치: AmadeusCancelService.kt:262-309
flowchart TD A[Void 시작] --> B[1차 시도] B --> C{성공?} C -->|예| D[완료] C -->|아니오| E[2차 시도] E --> F{성공?} F -->|예| D F -->|아니오| G[3차 시도] G --> H{성공?} H -->|예| D H -->|아니오| I[Slack 알림] I --> J[실패] 다크/라이트 모드 호환 색상 style B fill:#9FB4CE,stroke:#333,stroke-width:2px,color:#000 style F fill:#F4E4B1,stroke:#333,stroke-width:2px,color:#000
9.2 타임아웃 설정
- 발권 타임아웃: 60초 (기본)
- 결제 타임아웃: 상황별 설정
- PNR 락 방지: 5초 대기
10. 트러블슈팅
10.1 일반적인 문제
| 문제 | 증상 | 원인 | 해결 방법 |
|---|---|---|---|
| Carrier Time Limit 부족 | 발권 실패 | 시한 임박 | 즉시 발권 또는 재예약 |
| Carrier PNR 없음 | 발권 불가 | 항공사 미확정 | 예약 재확인 필요 |
| 티켓 중복 | 발권 실패 | 이미 발권됨 | 티켓 조회 후 처리 |
| NO ALLOCATION | 발권 실패 | 좌석 부족 | 재예약 필요 |
| NO QUOTA | 발권 실패 | 할당량 초과 | 항공사 문의 |
10.2 항공사별 주의사항
- MU: 비성인 포함 시 특별 endorsement 필요
- CZ: 성인 티켓 번호 별도 저장 필요
- KE: 전용 결제 승인 프로세스 사용
- AB: Carrier PNR 없어도 발권 가능
11. 주요 코드 위치 참조
| 기능 | 파일 | 라인 |
|---|---|---|
| 발권 준비 | AmadeusTicketingService.kt | 37-125 |
| 발권 실행 | AmadeusTicketingService.kt | 178-229 |
| CZ 특별 처리 | AmadeusTicketingService.kt | 200-202, 231-254 |
| KE 결제 처리 | AmadeusTicketingService.kt | 265-273 |
| MU 특별 발권 | AmadeusTicketingService.kt | 378-380 |
| 발권 프로세스 | AmadeusTicketingService.kt | 292-427 |
| 에러 처리 | AmadeusTicketingService.kt | 213-227 |
| 재시도 설정 | AmadeusClient.kt | 888-891 |
다음 Phase
Phase 4: 운임 계산 API 심층 분석으로 진행