Skip to content

[Feature]: 이메일 동시 가입 경쟁 상태(Race Condition) 방어 및 DB UNIQUE Safety #5

Description

@devikae

Package Scope

  • Add to an existing package
  • New package
    Package name: backend

Overview
동일한 이메일로 동시에 가입 요청이 발생할 때 애플리케이션 레벨의 중복 검사를 통과하여 발생하는 데이터 중복 저장을 방지하기 위해, DB 레벨의 UNIQUE 제약조건을 구축하고 예외 처리

Describe the solution you'd like
고민했던 방식:

  • 애플리케이션 레벨 검사 단독: memberRepository.existsByEmail(email) 사전 조회 검사만 수행.
  • Redis 분산 락 (Redlock): 회원가입 시 이메일 키 단위로 Redis 분산 락을 획득 후 회원가입 진행.
    선택한 방식:
  • DB UNIQUE 제약조건 + Exception Translation: RDBMS 물리 유니크 인덱스 적용 및 saveAndFlush() 예외 캐치.
    이 방식을 선택한 이유:
  • 동시 요청 발생 시 두 스레드 모두 애플리케이션 existsByEmail 조회를 통과(둘 다 false 리턴)하여 동일 이메일이 중복 저장되는 경쟁 상태(Race Condition)가 발생함.
  • Redis 분산 락 방식은 단순 회원가입 기능 대비 불필요한 인프라 제어 오버헤드 발생
    트레이드오프 및 극복 방안:
  • Trade-off: 동시 가입 시 DB 수준에서 DataIntegrityViolationException 예외가 발생함.
  • 해결 방안: DB 레벨 UNIQUE(email) 제약조건을 최종 방어선으로 두고, 서비스 레이어에서 saveAndFlush() 호출 시 발생하는 예외를 캐치하여 사용자 친화적인 409 Conflict / DUPLICATE_EMAIL 응답으로 변환함.

Additional context
Multi-thread CountDownLatch 및 ExecutorService 기반 10개 스레드 동시 가입 테스트로 1건 성공, 9건 예외 차단 및 DB 1건 저장 검증 완료.

Metadata

Metadata

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions