[뉴스 APP] 회원 이메일 중복 가입 예외처리

김성수·2023년 5월 4일
1

뉴스어플리케이션

목록 보기
2/5

회원가입 시 가입된 이메일이 존재할 경우 Exception을 터트려준다.

MemberRepository

JPA에선 find엔티티명By컬럼명으로 해당 컬럼을 DB에서 조회하는 기능을 자동으로 제공한다. (엔티티명은 제외 가능)


그런데 나는 내가 직접 쿼리문을 작성해보면서 JPA 감을 익히고 싶다.


따라서 직접 createQuery 메서드를 사용하여 이메일을 조회하는 로직을 구현했다.

아래는 그 구현 코드이다.

    public Member findByEmail(String email){

        List<Member> result = em.createQuery("select m from Member m where m.email = :email", Member.class)
                .setParameter("email", email)
                .getResultList();
                
        if(members.isEmpty()){
            return null;
        }else{
            return members.get(0);
        }
    }

List로 값을 받아도 상관없다.

왜냐하면, DB에는 중복되는 이메일 값이 없거나 (0)

있거나(1)

둘 중 하나이기 때문에 성능 측면에서 이슈가 없다고 판단했다.



MemberService

서비스 클래스에는 실질적인 예외처리 메서드를 구현한다.

회원가입하는 join 메서드 매개변수 Member 객체를

validateDuplicateMember(member)에 담아줌으로써

검증한다.

아래는 그 코드이다.


	@Transactional(readOnly = false)
    public void join(Member member){
        validateDuplicateMember(member);
        memberRepository.save(member);
    }

    private void validateDuplicateMember(Member member){
        List<Member> findMember = memberRepository.findByEmail(member.getEmail());

        if(findMember.size() != 0){
            throw new IllegalStateException("이미 가입된 회원입니다.");
        }
    }

List 객체로 넘겨받은 findMember는

DB안에 중복된 이메일이 존재하지 않을 경우 size가 0으로 존재할 것이다.

따라서, size가 0이 아닐 때는

중복되는 이메일이 존재한다는 의미이다.



MemberServiceTest

아래 코드는 회원 이메일 중복 시 예외처리 테스트 코드이다.

@Test
    @DisplayName("회원 이메일 중복 시 예외처리")
    void test1() throws Exception{
        //given
        Member member = Member.builder()
                .name("kkk")
                .email("1234@naver.com")
                .address("경기도")
                .password("패스워드")
                .build();

        Member member2 = Member.builder()
                .name("kkk")
                .email("1234@naver.com")
                .address("경기도")
                .password("패스워드")
                .build();

        //when
        memberService.join(member);
        DuplicateKeyException exception = assertThrows(DuplicateKeyException.class, 
        () -> {memberService.join(member2);});

        //then
        assertEquals("이미 가입된 회원입니다.", exception.getMessage());

    }

만약 위 코드를 실행할 경우

이메일이 member1member2 모두

1234@naver.com이므로 예외가 발생한다.


당연하게도 반대 케이스를 작성해봐야 한다.

member2의 이메일 값을 1233333@naver.com으로 변경해주면

테스트를 통과하는걸 확인할 수 있었다.

profile
깊이 있는 소프트웨어 개발자가 되고 싶습니다.

0개의 댓글