개발자

DB 저장 시 중복 체크 어떻게 하시나요?

2022년 11월 11일조회 792

Spring에 mssql을 사용한 사이트를 운영중인데 고객이 회원가입 할 때 가끔씩 요청이 중복되어 들어와서 중복 저장 되는 경우가 생깁니다. Insert 쿼리 전에 select 쿼리로 조회해서 동일한 아이디가 있으면 가입을 막는 코드는 넣어 두었는데 거의 동시에 요청이 들어오면 select 쿼리에서 걸러지지 않았습니다. DB의 회원 테이블 아이디 컬럼에 유니크 제약 조건을 걸어볼까 했는데 탈퇴한 회원의 경우 로우를 남겨놓고 탈퇴 여부 컬럼만 변경하는 구조라서 아이디 값이 유일하지는 않아 제약조건도 걸지 못하고 있습니다. select 쿼리와 insert 쿼리를 트랜젝션으로 묶어볼까 했는데 insert시에 키 생성(identity)하는 부분 때문인지 테이블 락이 걸려서 데드락이 발생하는 것 같아 묶지 못하였습니다. 보통 이런 식으로 DB에 특정 조건에서 중복을 막아야 하는 경우는 어떻게 처리하시나요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

유근수님의 프로필 사진

으흠. 저라면 탈퇴 회원을 별도 테이블로 관리하도록 로직을 변경하고 유니크를 걸 것 같습니다; 더 좋은 방법이 있는지는 잘 모르겠네요. 🙃

profile picture

익명

작성자

2022년 11월 12일

같은 생각입니다. 정통망법이나 개보법에서도 휴면회원이나 탈퇴회원은 분리하도록 되어 있습니다.

profile picture

익명

작성자

2022년 11월 12일

답변 감사드립니다!

자비스님의 프로필 사진

락을 관리하는 별도 테이블을 두어 트렌젝션을 관리할 수도 있을거 같습니다. 락과 관련된 기능을 검색해보면 될거 같습니다. 스프링에서는 스케쥴 중복 실행을 막기위해 shedlock을 사용합니다.

profile picture

익명

작성자

2022년 11월 20일

락을 관리하는 테이블을 별도로 만들기도 하는 군요! 답변 감사드립니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!