Skip to content

Conversation

@khyaejin
Copy link
Contributor

@khyaejin khyaejin commented Dec 18, 2025

연관 이슈

작업 내용

1. Booking 엔티티에 @Version 필드 추가

  • JPA 낙관적 락을 위한 버전 필드 추가
  • 동시 수정 시 자동으로 충돌 감지
@Version
private Long version; // 추가

2. BookingServiceImpl에서 synchronized 블록 제거 및 격리 수준 설정

  • BOOKING_LOCK 상수 제거
  • synchronized 블록 제거
  • @Transactional(isolation = Isolation.REPEATABLE_READ) 적용하여 DB 레벨 격리 수준 설정

3. OptimisticLockException 처리 로직 추가

  • BookingErrorCodeBOOKING_CONFLICT 에러 코드 추가
  • BookingConflictException 예외 클래스 생성
  • GlobalExceptionHandlerOptimisticLockException 핸들러 추가
  • 동시 예매 충돌 시 409 Conflict 응답 반환

4. 동시 예매 테스트 작성

  • BookingConcurrencyTest 클래스 생성
    • 100개 동시 요청 테스트
    • 중복 예매 방지 검증
    • 버전 필드 증가 확인 테스트

논의하고 싶은 내용

충돌 발생 시 재시도 프로세스 검토 필요

현재는 OptimisticLockException 발생 시 409 Conflict를 반환, 프론트엔드에서 재시도하도록 구현했습니다.

대안:

  • 백엔드에서 자동 재시도 (최대 3회) 등

공유하고 싶은 내용

낙관적 락 vs 비관적 락 선택 이유

낙관적 락을 선택한 이유:

  1. 예매 시스템 특성상 충돌 빈도가 높지 않음 (분산된 시간대 예매)
  2. 비관적 락 대비 성능 우수 (락 대기 시간 없음)
  3. 멀티 서버 환경에서 안전하게 작동

Before vs After:

구분 Before (synchronized) After (낙관적 락)
동시성 제어 레벨 JVM DB
멀티 서버 지원 x o
성능 락 대기 발생 충돌 시에만 재시도
확장성 제한적 우수
-> 추후 확장성을 위해 개선해주었습니다.

테스트 결과

  • 100개 동시 요청 시 중복 예매 0건
  • 버전 필드 정상 증가 확인
  • 충돌 발생 시 적절한 예외 처리

기타

  • 기존 3초 이내 중복 체크 로직은 유지 (이중 안전장치)
  • DB 마이그레이션 필요: booking 테이블에 version 컬럼 추가

@khyaejin khyaejin self-assigned this Dec 18, 2025
@khyaejin khyaejin added enhancement 기존 기능의 개선, 성능 최적화, 사용자 경험 향상 feat 새로운 기능 또는 요구사항을 추가 labels Dec 18, 2025
@github-actions
Copy link

1. @Version 필드 추가

근거: 낙관적 락을 구현하기 위해 @Version 필드를 추가한 것은 적절한 접근입니다. 이로 인해 동시 수정에 대한 충돌 감지가 가능해집니다.

수정 제안: 추가적인 주석이나 문서화가 필요없어 보입니다. 현재 코드에서 매우 잘 구현되었습니다.


2. synchronized 블록 제거

근거: 추가된 격리 수준 설정과 낙관적 락으로 인해 synchronized 블록을 제거한 것은 성능 개선에 기여할 것으로 보입니다. 다만, 이 부분에서 동시성 문제를 처리를 더 명확하게 할 수 있는 기회가 있습니다.

수정 제안: synchronized를 제거한 이유(낙관적 락 사용을 통한 성능 개선)를 주석으로 남기면 향후 코드 변경 시 이해도에 도움이 될 것입니다.


3. OptimisticLockException 처리 로직 추가

근거: 새로운 예외 클래스 BookingConflictException을 만들고, GlobalExceptionHandler에서 처리하는 로직은 잘 구성되어 있습니다. 이를 통해 충돌 상황에서 사용자에게 적절한 피드백을 제공할 수 있습니다.

수정 제안: GlobalExceptionHandler의 예외 처리 로직도 잘 작성되었지만, 각 예외의 로그에 더 많은 정보를 포함시킬 수 있다면 좋겠습니다. 예를 들어, 어떤 사용자의 요청인지, 어떤 공연의 예매인지 로그에 남기면 더욱 효과적인 디버깅에 도움이 됩니다.


4. 동시 예매 테스트 작성

근거: BookingConcurrencyTest 클래스를 작성하여 동시성 관련 시나리오를 포함한 것은 테스트 커버리지 향상에 큰 도움이 됩니다.

수정 제안: 다양한 사용자의 요청 형태에 대한 커버리지를 늘리는 것도 좋은 방법입니다. 예를 들어, 동일 사용자로 빠르게 요청하는 경우와 서로 다른 사용자의 예매 요청을 동시에 시뮬레이션해 보는 것이 추가적인 신뢰도를 높일 수 있습니다.


핵심 평가

낙관적 락을 통한 동시성 제어 개선이 잘 구현되었습니다. 코드 구조와 예외 처리도 명확하여 전반적으로 잘 작성된 PR입니다. 일부 주석 보완과 추가 테스트 케이스 제안으로 더 향상될 수 있습니다.

@khyaejin khyaejin merged commit aa7ee45 into develop Dec 18, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement 기존 기능의 개선, 성능 최적화, 사용자 경험 향상 feat 새로운 기능 또는 요구사항을 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 낙관적 락 적용으로 동시성 제어 개선

2 participants