회원가입 동시성 문제

나길진·2024년 3월 12일

문제해결

목록 보기
1/2

예외상황

회원가입에 ID 중복체크를 하는 로직을 넣었지만 같은 ID로 계정이 생성되는 일이 발생했다. 원인은 동시에 회원가입 요청이 들어와서 같이 가입이 되는 것이였다.

이유는 알 수 없지만 앱에서 같은 요청을 여러번 보내는일이 종종 생기다보니 앱에서도 수정을 하겠지만 서버에서도 동시에 들어오는 요청을 막아야겠다고 생각했다.

일반적인 해결방법

해당 문제를 막기위해선 DB에 UniqueKey를 설정해서 insert가 두 건이상 안되도록 막고 DuplicateKeyException을 감지해서 하는게 성능적으로도 편리함적으로도 쉬운방법이다.

문제점

하지만 회사내 운영방침이 회원이 탈퇴해도 회원테이블에서 삭제하는 것이 아닌 삭제유무를 나타내는 컬럼에 상태를 변경해서 운영하기 때문에 UniqueKey를 설정할 수 없었다.

내가 해결한 방법

회원가입을 진행한 이후에 다시 해당 아이디로 select문를 조회해서 2건 이상인건 삭제를 진행하고 CustomException을 발생시켜서 클라이언트에게 알려주는 방식으로 수정했다.

예시)

@PostMapping("/signup")
public ResponseEntity signup(SignupDTO signupDTO){
	memberService.signup(signupDTO);
   	memberService.isDuplicated(signupDTO);
    
    return ResponseEntity.ok()
    	.build();
}

~~~

public void isDuplicated(SignupDTO signupDTO){
	List<Member> members = memberRepository.findAllByUserId(signupDTO.getUserId());
    if(members.size() > 1){
    	for(int i=1; i<members.size(); i++){
        	memberRepository.delete(members.get(i));
        }
        throw new MemberDuplicatedException("동시에 회원가입");
    }
}

대략적으로 이러한 방법으로 회원가입이 중복적으로 발생하는 일을 막았다.

profile
백엔드 개발자

0개의 댓글