Coding/Spring(Boot)

[Spring]회원 서비스 개발(+ test case)

민톨이 2024. 6. 10. 18:52
728x90

중복 회원 방지 

package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MemoryMemberRepository;

import java.util.Optional;

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    // 회원가입 !!!!!!
    public Long join(Member member) {
        //같은 이름이 있는 중복 회원 X
        Optional<Member> result = memberRepository.findByName(member.getName());
        result.ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        } );

        memberRepository.save(member);
        return member.getId();
    }
}

- Null일 가능성이 있으면 Optional로 한 번 감싸서 반환

- Optional<Member> result = 부분을 지우고 받아줄 수도 있다.

이런식으로!

 

이 코드를 메서드로 변환하려면?

control + T 단축키를 이용하여 Refactor This // Extract Method 사용

 

메서드명은 validateDuplicateMember로 설정해줬다.

 

회원 조회

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

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }

 


회원 서비스 Test 

이전 글에서 작성했던 테스트 케이스보다 더 용이하게 하는 방법

 

단축키 : command + shift + T(mac기준)

 

하면 이렇게 Create New Test가 뜬다.

 

 

그럼 요로코롬 뜬다.

테스트할 것들 다 체크해두고 OK버튼 누르기

 

그럼 이렇게 자동으로 테스트케이스 틀이 만들어진다~~~

 

 @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("hello");

        //when
        Long saveId = memberService.join(member);

        //then(검증)
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

(참고로 테스트 케이스에서 메서드명을 한글로 써도 된다.)

given/when/then 3단계로 나누어 쓰면 식별이 좀 더 용이하다.

 

여기까지는 일반 테스트 검증이고, 예외처리 테스트도 있다.

 

예외 테스트

 // MemberService.java
 private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                }); // null일 가능성이 있으면 Optional로 한 번 감싸서 반환
    }

 

테스트하려는 파일에 이러한 IllegalStateException이 있다.

 

1. try / catch 

  // 예외 처리
    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring"); // 일부러 중복되게 만들어봄

        //when
        memberService.join(member1);
        try {
            memberService.join(member2);
            fail("예외가 발생해야 합니다.");
        } catch (IllegalStateException e){
            // 예외처리성공
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }

 

2. assertThrows(IllegalStateException.class, () -> ~~~~~~

 // 예외 처리
    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring"); // 일부러 중복되게 만들어봄

        //when
        memberService.join(member1);
        assertThrows(IllegalStateException.class, () -> memberService.join(member2));

 

IllegalStateException이 터져야함

여기서 IllegalStateException이 NullpointerException이 된다면 오류 발생.