Skip to content

Conversation

@Ogu1208
Copy link
Contributor

@Ogu1208 Ogu1208 commented Jan 6, 2026

관련 Issue (필수)

주요 변경 사항 (필수)

1. 승차권 조회 API 시간 필터링 추가

GET /api/v1/bookings?status={filter} 엔드포인트에 시간 기반 필터 추가

  • upcoming: 앞으로 이용 가능한 승차권 (BOOKED 상태 + 현재 시간 이후 출발)
  • history: 이용 완료 및 취소된 승차권 (BOOKED/CANCELLED + 현재 시간 이전 출발)
  • all: 전체 조회 (BOOKED 상태만, 기본값)
  • BookingTimeFilter enum 및 BookingTimeFilterConverter 추가

2. SeatBooking → Ticket 기반 조회로 변경

  • 조회 쿼리가 SeatBooking 대신 Ticket 테이블 기반으로 변경
  • 변경 이유: SeatBooking은 좌석 충돌 감지용으로 배치 삭제될 수 있지만, Ticket은 영수증/감사 목적의 영구 기록
  • DTO 변경: SeatBookingProjection → TicketProjection, SeatBookingDetail → TicketDetail
  • TicketDetail에 ticketNumber, status 필드 추가

3. TicketStatus 정리

  • REFUNDED 상태 삭제 → CANCELLED로 통합 (취소 시 즉시 환불 처리되므로)

4. Ticket 상태 필터링 추가

  • UPCOMING 조회 시 ISSUED 상태 티켓만 조회 (취소된 티켓 제외)
  • HISTORY, ALL 조회 시 전체 티켓 조회 (취소 이력 포함)

5. 네이밍 정리

  • BookingDetail → BookingResponse
  • findBookingDetail() → findBookings()
  • convertToBookingDetail() → convertToBookingResponse()
  • 메시지에서 "예약" → "예매"로 용어 통일

6. Ticket 도메인 모델 로직 추가

  • Ticket 엔티티 내부에 티켓 상태를 변경하는 cancel(), use() 메서드 추가
  • 취소 가능 여부를 확인하는 canBeCancelled() 메서드 추가
  • 사용 가능 여부를 확인하는 canBeUsed() 메서드 추가

7. 조회 필터링 비즈니스 로직 검증 (테스트 코드 추가)

BookingServiceSearchFilterTest를 통해 시간 및 상태 필터링 정책이 정확히 동작하는지 검증하는 통합 테스트를 추가했습니다.
BookingServiceTest에 추가하기에는 너무 클래스가 길어져 따로 분리했습니다.

  • UPCOMING: 미래 일정의 예매만 조회되며, 그중 CANCELLED된 티켓은 결과에서 제외됨을 확인.
  • HISTORY: 과거 일정의 예매를 조회하며, 취소된 티켓 및 예매 내역이 모두 포함됨을 확인.
  • ALL: 출발 시간과 관계없이 BOOKED 상태인 모든 예매 내역이 조회됨을 확인.

리뷰어 참고 사항

Import 정리

  • 일부 클래스는 optimize import로 import문만 정리되었습니다. 가볍게 넘겨봐 주세요!

TicketServiceTest 변경사항

  • BookingTestHelper에서 Booking 생성 시 Ticket도 자동 생성되도록 변경됨
  • 기존 테스트가 @beforeeach에서 Booking 생성 + 각 테스트에서 Ticket 수동 생성하는 구조여서 중복 생성 문제 발생
  • 각 테스트에서 builder()로 직접 Booking + Ticket 생성하도록 수정

TODO

  • TicketService.createTicket() 메서드의 외부 호출 케이스 확정 필요

    • Booking 내부에서 Ticket 생성을 담당하게 되면 해당 메서드 및 테스트 삭제 검토
    • 부분 추가 발권 등 외부 호출이 필요하면 현재 테스트 유지
  • 티켓 취소 서비스 로직 구현: 현재 Ticket.cancel() 도메인 로직은 추가되었으나, 이를 호출하는 서비스 레이어의 개별 티켓 취소 API 구현 필요.

  • 테스트 최적화: 티켓 취소 로직 구현 후, em.flush()@Transactional에 의존하는 테스트 방식을 서비스 호출 방식으로 리팩토링 예정.

추가 정보

없음

PR 작성 체크리스트 (필수)

  • 제목이 Issue와 동일함을 확인했습니다.
  • 리뷰어를 지정했습니다.
  • 프로젝트를 연결했습니다.

Copy link
Contributor

@chanwonlee chanwonlee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

변경 내용 전부 확인했습니다!
Ticket 생성 로직이 작성 안 된 상태에서 조회 로직을 구현하는 게 어려웠을 텐데 잘 작성해 주셨네요!
또한 중간에 회의 내용으로 인해 추가된 내용도 잘 반영해 주셔서 감사합니다.

BookingTestHelper는 지금 이 상태로 유지하고 이후 Ticket 생성/삭제 로직이 추가되면 전반적으로 손봐야 할 것 같네요.

시간 필터와 컨버터 등록 등 여러 부분에서 고민을 많이 하신 것 같아 좋은 구조가 나온 것 같습니다!
정말 고생하셨습니다 👍👍

+ CLAUDE.md 파일을 .gitignore에 추가할지 아니면 모두 공통으로 유지할지 다음 회의 시간에 정하면 어떨까요?

Copy link
Contributor

@Jimin730 Jimin730 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구현해주신 로직 모두 확인했습니다!
컨트롤러에서 converter를 어떤 경우에 사용되는 것인지, 또 어떻게 사용할 수 있는지 궁금했었는데 민아님이 구현해주신 로직이 공부하는데 많은 도움이 되었습니다! 🥹
확실히 DB 단에서 필터를 적용해 필요한 데이터만 조회하니 불필요한 데이터를 메모리에 올리지 않아도 되어 효율적이네요 👍
고생하셨습니다!! 👍 👍 👍

@Ogu1208 Ogu1208 merged commit 3559ba4 into develop Jan 6, 2026
3 checks passed
@Ogu1208 Ogu1208 deleted the feature/95-booking-ticket-filter branch January 6, 2026 16:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[FEATURE] 승차권 조회 로직을 Booking, Ticket 기준으로 변경

4 participants