회원가입에 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("동시에 회원가입");
}
}
대략적으로 이러한 방법으로 회원가입이 중복적으로 발생하는 일을 막았다.