FlightSearchService
항공편 검색의 핵심 비즈니스 로직을 담당하는 서비스. GDS/NDC 어댑터를 호출하여 운임을 조회하고, 다양한 필터링 규칙을 적용하여 최종 검색 결과를 생성한다.
의존성
| 서비스 | 용도 |
|---|---|
| AdapterClient | GDS/NDC 운임 조회 |
| AirConsoleService | 검색 조건 조회 |
| AirportService | 공항 정보 조회 |
| PricingClient | 프로모션/TASF 조회 |
| FlightSearchRepository | 검색 결과 캐싱 |
| FlightItemRepository | 항공편 아이템 캐싱 |
| AirRecommendationService | 추천 데이터 생성 |
| RecommendationService | 추천 점수 조회 |
메서드
searchFlights
fun searchFlights(
searchInfo: SearchInfo,
onlyDirect: Boolean,
listKey: UUID,
useMultiTicket: Boolean,
funnels: List<Funnel>,
onlyRepresentativeCardPromotion: Boolean = false,
): List<FlightItem>AirConsole에서 검색 조건을 조회한 후 searchFlightsBySearchConditions를 호출한다.
| Caller | Callee |
|---|---|
| UseCase들 | AirConsoleService.findSearchCondition |
| FlightSearchService.searchFlightsBySearchConditions |
searchFlightsBySearchConditions
fun searchFlightsBySearchConditions(
searchConditions: List<SearchCondition>,
excludeMarketingAirlines: List<String>,
excludeOperatingAirlines: List<String>,
searchInfo: SearchInfo,
onlyDirect: Boolean,
listKey: UUID,
useMultiTicket: Boolean,
funnels: List<Funnel>,
onlyRepresentativeCardPromotion: Boolean = false,
): List<FlightItem>실제 검색 로직. 병렬로 어댑터를 호출하고, 필터링 후 FlightItem으로 변환한다.
savePolling
fun savePolling(listKey: UUID, result: FlightSearch)비동기 검색 결과를 Redis에 저장한다.
| Caller | Callee |
|---|---|
| StandardFlightSearchUseCase.init | FlightSearchRepository.save |
| ReissueFlightSearchUseCase.searchFlights |
getFlightSearch
fun getFlightSearch(listKey: UUID): FlightSearch폴링용 검색 결과를 조회한다.
getFlightItem
fun getFlightItem(detailKey: String): FlightItemdetailKey로 단일 항공편 아이템을 조회한다.
| Caller | Callee |
|---|---|
| FlightDetailService.getFlightDetail | FlightItemRepository.find |
| SplitFlightSearchUseCase | FlightSearchService.getFlightSearch |
getFlightItems
fun getFlightItems(listKey: UUID): List<FlightItem>listKey로 전체 항공편 아이템 목록을 조회한다.
| Caller | Callee |
|---|---|
| FlightDetailService.getDetailKeys | FlightItemRepository.findAll |
| SplitFlightSearchUseCase.searchFlights | FlightSearchService.getFlightSearch |
existFlightSearch
fun existFlightSearch(listKey: UUID)검색 결과 존재 여부를 확인한다. 없으면 예외 발생.
applyRecommendationScores
fun <T : CommonFlightItem> applyRecommendationScores(
searchInfo: SearchInfo,
flightItems: List<T>,
)항공편 아이템에 추천 점수를 적용한다.
| Caller | Callee |
|---|---|
| StandardFlightSearchUseCase.searchFlights | RecommendationService.findScoreMap |
| CombineFlightSearchUseCase.searchFlights | CommonFlightItem.withRecommendation |
필터링 규칙
검색 결과에 적용되는 필터링 규칙들:
| 필터 메서드 | 설명 |
|---|---|
isViaTLVAirport | 텔아비브(TLV) 경유 스케줄 제외 |
isExcludeAirlinesSchedule | 제외 항공사 스케줄 필터링 |
isUnKnownAirport | 미등록 공항 스케줄 제외 |
isNonBookableScheduleByValidatingCarrier | VC별 예약 불가 조건 체크 |
isStopOver | StopOver 경유편 제외 |
isDisabledSotoAirline | SOTO 비활성 항공사 제외 |
isUnverifiedTGSchedule | TG 652/653편 비검증 스케줄 제외 |
isChangedTransitAirport | 환승 공항 변경 스케줄 제외 |
hasASCarrier | AS 항공 스케줄 제외 (HA VC 제외) |
hasAZCarrier | AZ 마케팅 캐리어 제외 (TW VC 제외) |
hasNoAvailability | 좌석 없는 스케줄 제외 |
항공사별 특별 처리
isNonBookableScheduleByValidatingCarrier 메서드에서 처리하는 항공사별 규칙:
| VC | 규칙 | JIRA |
|---|---|---|
| VJ | 출발 3일 이내 제외 | - |
| VN, ZA | 검색일+2일 이후만 | INTAIROP-311, INTAIROP-557 |
| 8M | K7 공동운항편 제외 | INTAIR-647 |
| SQ | TR 마케팅 캐리어 제외 | AIRPLF-817 |
| CX | PUS 출발/도착 비즈니스 제외 | INTAIR-380 |
| HA | FUK 경유 또는 26.4.22 이후 제외 | AIRINTG- |
| PR | PR 40% 미만 제외 | - |
| QR | G3 마케팅 캐리어 제외 | INTAIROP-470 |
| OZ | TP 스케줄 제외 | INTAIROP-798 |
| UA | AC 마케팅 캐리어 제외 | INTAIROP-674 |
| AI | 인도 국내선 7일 이내 제외 | INDAI-829 |