Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix(#114): 중복 회원가입 문제 수정 #115

Merged
merged 2 commits into from
Sep 5, 2024

Conversation

tmddus2
Copy link
Collaborator

@tmddus2 tmddus2 commented Sep 5, 2024

작업 사항

close #114

고민한 점들

동시성 이슈를 해결할 수 있는 방법은 다음과 같다.

  • 데이터베이스 수준에서 제약 설정

    • 데이터베이스에서 특정 필드에 대해서 unique 제약조건을 설정해서 중복된 값이 들어오지 않도록 함
    • 중복된 값을 저장하려는 요청이 들어와도 데이터베이스 차원에서 방지
  • Lock을 걸기

    • 비관적 락
      • DB단에서 Lock
      • row에 락을 걸기 때문에 성능 저하 우려
    • 낙관적 락
      • 애플리케이션 레벨에서 버전을 활용한 Lock
      • 실패할 시에 예외처리+재시도 해줘야하기에 성능저하 우려
    • 분산락
      • 임계영역에 접근할 때 Lock을 획득한 프로세스/스레드만이 접근할 수 있음.
      • 한번에 한 프로세스/스레드만 Lock을 받아서 실행하기 때문에 동시성 문제 해결
      • 서버 분산 환경에서 좋음.
    • 성능 저하의 우려가 있고 deadlock 발생 가능

찾아보았을 때 Lock을 거는건 성능저하와 deadlock의 우려도 있기에 DB column에 Unique 제약조건을 걸어두고 에러가 터졌을 때 이를 핸들링해주는 방식 선택


수정한 코드

⬇️⬇️⬇️⬇️⬇️

    Long savedUserId = null;
    try {
        User savedUser = userRepository.save(user);
        savedUserId = savedUser.getId();
    } catch (DuplicateKeyException e) {
        throw new RuntimeException("try to save duplicated user");
    }
    return savedUserId;

중복된 키 에러가 save 할 때 발생하면 RuntimeException 에러를 throw 한다. 그럼 GlobalExceptionHandler가 메시지로 서버 log 찍고 Internal Server Error를 응답한다.

[Spring Data JPA] JPQL 사용 방법(@Query & nativeQuery & DTO Mapping & function)


참고

@tmddus2 tmddus2 self-assigned this Sep 5, 2024
@tmddus2 tmddus2 merged commit 3038e50 into main Sep 5, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant