본문 바로가기
Java & 스프링/Java

[Java] was가 여러개/멀티스레드 환경에서 중복 id체크

by hjhello423 2020. 1. 29.

어떤 문제?

일반적으로 운영 환경에서는 was가 여러 개인 환경이 대다수입니다. (대다수가 아니라 99% 정도?)

was가 여러 개 이거나 멀티스레드 환경에서 만약 동시에 회원가입을 한다면 id 중복체크를 어떻게 해야 할까요?
아주 간단한 팁(?)을 공유해보겠습니다.


소스코드

아래와 같은 servicer가 있다고 가정해 보겠습니다.

@Service
@Transactional(readOnly = true)
public class MemberService {

    @Autowired
    private MemberRepository memberRepository;

    /**
     * 회원 가입
     *
     * @param member
     * @return
     */
    @Transactional
    public Long join(Member member) {
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }

    /**
     * 중복 회원 검증
     *
     * @param member
     */
    private void validateDuplicateMember(Member member) {
        List<Member> findMembers = memberRepository.findByName(member.getName());
        if (!findMembers.isEmpty()) {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        }

    }

    /**
     * 회원 전체 조회
     */
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

    public Member findOne(Long memberId) {
        return memberRepository.findOne(memberId);
    }
}

join()에서 회원 가입 비즈니스 로직을 실행하고 로직 실행 중간에 validateDuplicateMember()에서 id 중복 체크 기능을 실행합니다.

그런데 만약 2명의 사용자가 각각의 was로 접근해서 동시에 같은 id로 회원가입을 시도하면 validateDuplicateMember()에서 검증하지 못할 가능성이 있습니다.
아직 data를 insert 하고 commit이 이루어지지 않았기 때문에 2명의 사용자가 동시에 가입을 시도하면 중복되지 않은 id로 판별할 수 있는 것입니다.


해결

이럴 때는 id를 저장하는 column에서 unique 제약조건을 설정하여 중복 등록 시 error를 반환하도록 해서 중복체크를 진행하면 됩니다.
DB에 데이터가 insert 될 때 DB의 제약 조건을 이용하여 중복을 체크하는 것입니다.

반응형

댓글