Phase 3: 아마데우스 발권 API 심층 분석

1. API 엔드포인트 개요

1.1 발권 관련 엔드포인트

엔드포인트메서드기능위치
/internals/AMADEUS/ticketing/readyPOST발권 준비 및 검증AmadeusTicketingController.kt:21-31
/internals/AMADEUS/ticketingPOST실제 발권 실행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

제거 대상 요소

  1. 기존 커미션 (변경 필요 시)
  2. FOP (Form of Payment) (재생성을 위해)
  3. 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.kt37-125
발권 실행AmadeusTicketingService.kt178-229
CZ 특별 처리AmadeusTicketingService.kt200-202, 231-254
KE 결제 처리AmadeusTicketingService.kt265-273
MU 특별 발권AmadeusTicketingService.kt378-380
발권 프로세스AmadeusTicketingService.kt292-427
에러 처리AmadeusTicketingService.kt213-227
재시도 설정AmadeusClient.kt888-891

다음 Phase

Phase 4: 운임 계산 API 심층 분석으로 진행