Skip to content

[ Booking ] 예약 겹침 판정·페이징·조회수 동시성 개선 #56

Description

@RosieOh

🧑‍💻 오늘의 개발하면서 생긴 크고 작은 이슈사항을 기록해주세요

💚 어떤 기능인가요?

예약·목록 조회·조회수·요청 제한에서 실제로 데이터가 틀어지거나 성능이 무너지는 지점들을 고칩니다.

예약 중복 검증이 사실상 무효validateBookingTime 이 시작 시각 ±1시간만 비교합니다. 기존 예약의 endTime 을 보지 않아 09:00~18:00 종일 예약이 있어도 11:00 예약이 통과하고, 취소(CANCELLED) 예약도 충돌로 계산해 해당 시간대가 영구히 막힙니다. 시설 정원도 고려하지 않고, 검사-저장 사이 경쟁 조건에 DB 유니크 제약도 없습니다.

페이징 부재 — 컨트롤러 21개 중 Pageable 을 받는 곳이 0개입니다. CareFacilityApiController 는 전체를 조회한 뒤 메모리에서 subList 라 범위를 넘기면 IndexOutOfBoundsException 이 납니다.

조회수 lost update — 정책·시설·게시글 3곳이 read-modify-write 라 동시 요청 시 증가분이 유실됩니다.

Rate limiting 우회 및 메모리 릭X-Forwarded-For 를 무조건 신뢰해 헤더만 바꾸면 우회됩니다. 인메모리 맵은 eviction 이 없고 다중 인스턴스에서 무의미하며, 초과 시 400 을 반환합니다. 게다가 RateLimitInterceptor 는 등록조차 되지 않은 죽은 코드였습니다.

✅ To Dos

  • 실제 구간 겹침 판정 + 취소 예약 제외 + 정원 비교 + PESSIMISTIC_WRITE
  • PageRequestUtil 로 상한 적용(기본 100, 최대 200), 어드민에도 Pageable 도입
  • 조회수를 원자적 UPDATE 쿼리로 전환
  • ClientIpResolver 신설 — XFF 신뢰 여부를 설정으로
  • Redis INCR 기반 rate limit 으로 교체, 429 반환, WebMvcConfig 에 인터셉터 등록

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions