PROJECT/항해플러스 Lite 백엔드

5주차 - WIL (Weekly I Learned)

yong_ღ'ᴗ'ღ 2025. 6. 21. 21:00

🧐 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 공부하고 적용해야함!!