Q. 예약 부분에서 왜 Redis랑 DB 유니크 제약조건을 둘 다 쓰는지 모르겠다 DB 유니크 제약조건만 써도 되는데 왜 굳이 Redis를 사용했는가?
현재 코드에서 둘 다 사용하는 이유:
// createReservation 메서드에서
String lockKey = String.format("reservation:lock:%d:%s:%s", trainerId, reservationDate, reservationTime);
RLock lock = redissonClient.getLock(lockKey);
여러 서버(인스턴스)에서 동시에 같은 시간대 예약을 시도할 때 사전에 차단
락을 획득하지 못한 요청은 즉시 실패 처리 가능
불필요한 DB 트랜잭션을 방지
모든 요청이 DB까지 진행 → 트랜잭션 시작 → 제약조건 위반 시 롤백
DB 부하 증가 및 불필요한 리소스 사용
동시에 1000명이 같은 트레이너의 같은 시간을 예약 시도:
현재 코드는 이중 체크를 하고 있습니다:
// Redis 락 내에서도 한번 더 체크
boolean alreadyExists = reservationRepository.existsByTrainerAndReservationDateAndReservationTime(
trainer, reservationDate, reservationTime
);
DB 유니크 제약조건만으로도 데이터 정합성은 보장됩니다.
Redis 락은 성능 최적화를 위한 선택사항이다.
트래픽이 적다면 → DB 유니크 제약조건만 사용
고트래픽이라면 → 현재처럼 Redis 락 + DB 제약조건
중간 단계 → Redis 락만 사용하고 DB 제약조건 제거