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건 저장 검증 완료.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions