🧑💻 오늘의 개발하면서 생긴 크고 작은 이슈사항을 기록해주세요
💚 어떤 기능인가요?
예약·목록 조회·조회수·요청 제한에서 실제로 데이터가 틀어지거나 성능이 무너지는 지점들을 고칩니다.
예약 중복 검증이 사실상 무효 — 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
🧑💻 오늘의 개발하면서 생긴 크고 작은 이슈사항을 기록해주세요
💚 어떤 기능인가요?
예약·목록 조회·조회수·요청 제한에서 실제로 데이터가 틀어지거나 성능이 무너지는 지점들을 고칩니다.
예약 중복 검증이 사실상 무효 —
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도입ClientIpResolver신설 — XFF 신뢰 여부를 설정으로WebMvcConfig에 인터셉터 등록