5주차 - WIL (Weekly I Learned)
🧐 5주차 과제
1. 동시성문제 - ① 좌석 임시배정 (중복예약)
2. 동시성문제 - ② 포인트 차감/충전
3. 동시성문제 - ③ 결제, 스케줄러 간 좌석 상태 충돌
✅ Keep (잘한 점 / 유지할 점)
- 멀티스레드 테스트를 통해 실제 동시성 문제를 재현하고, 문제를 해결할 수 있는 전략(비관적 락 / 조건부 UPDATE)을 각각 상황에 맞게 적용함
- 스케줄러와 결제 로직 간의 상태 충돌 가능성을 인지하고, 이를 테스트 코드로 검증
- 예외 상황에서도 결제 실패 이력을 남길 수 있도록 별도 트랜잭션 분리를 적용 (REQUIRES_NEW)
- 요청 DTO에 검증 애노테이션(@NotBlank, @Min 등)을 활용해 잘못된 요청을 조기 차단할 수 있도록 개선
❗️ Problem (문제점)
- SeatStatusScheduler 테스트 작성 시 releasedAt 조작이 제대로 반영되지 않아 EXPIRED 상태로 변경되지 않는 문제 발생 → save 이후 releasedAt을 명시적으로 변경 후 saveAndFlush로 해결
💡 Try (해결을 위한 시도)
- 비관적 락은 중복 예약이 절대 발생해선 안 되는 좌석 예약에, 조건부 UPDATE는 충돌이 빈번하지만 유연하게 처리 가능한 포인트 트랜잭션에 적용
- Seat 엔티티의 상태 변경 시점을 정확히 조작하기 위해 테스트 코드 내에서 releasedAt을 과거로 설정하여 스케줄러 즉시 작동 유도
💬 이번 주 알게 된 것들
- 낙관적 락, 비관적 락, 조건부 UPDATE 각각의 특성에 대해 파악하고 활용
- 스케줄러와 같은 배치성 작업과 실시간 요청(결제)이 동시에 상태를 변경하는 경우에는 선행 처리 여부에 따라 결과가 달라질 수 있어 테스트로 반드시 검증해야 함
🔁 지난 주 목표 회고
[✔] 좌석 임시배정 중복 예약 문제 해결 (비관적 락 적용)
[✔] 포인트 차감 시 음수 잔액 문제 해결 (조건부 UPDATE 적용)
[✔] 포인트 충전 시 초과 충전 방지 로직 적용 (조건부 UPDATE 적용)
[✔] 스케줄러와 결제 간 상태 충돌 테스트 작성
[✔] DTO 입력값에 대한 검증 로직 추가 (@Valid 활용)
[✔] 결제 실패/성공 이력 저장 시, 트랜잭션 분리(REQUIRED_NEW) 적용
[❌] 좌석 상태 변경 스케줄러 수정: @ ConfigurationProperties, Retry, metric
[❌] 대기열토큰/대기열: 콘서트와 연관짓지 말고, 예약서비스 접근을 위한 걸로 (서버 과부하 막기 위한 용도)
🎯 다음 주 목표
- 피드백 받았던거 보완해보기
- Redis 공부하고 적용해야함!!