본문 바로가기
Back/Spring

[Spring] 회원 관리 (2) - 서비스 개발 / test

by 오엥?은 2023. 4. 28.
반응형

회원 서비스 개발

  • hello.hellospring > service > MemberService

- 회원가입기능

package hello.hellospring.service;

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

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

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

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

회원가입은 save로 해줄 수 있지만, 그 전에 생각해야 할 것이 중복된 이름이 있을 때는 회원가입이 되면 안 되는 것이다.

그래서 memberRepository에서 회원가입을 시도하려는 이름을 찾은 뒤, 같은 이름이 있으면 IllegalStateException에 "이미 존재하는 회원입니다." 를 넣는다.

 

근데! 이런 경우에는 메서드를 따로 뽑는 게 좋다.

 

Ctrl + Alt + m 을 누르면 (맥은 command + option + m)

이렇게 따로 떨어져 나온다. 이름은 extracted 에서 validateDuplicateMember 로 바꾼다.

 

- 회원 조회 기능

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

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

 

 회원 서비스 테스트

테스트를 하려는 클래스에서 (여기선 MemberService) Ctrl + shift + t 를 누르면 (맥은 Command + shift + t) 바로 테스트를 생성할 수 있다.

모두 체크하고 확인버튼을 누르면 된다. 그럼 테스트의 뼈대가 자동으로 작성된다.

 

@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());
}

join 테스트다. 테스트는 그냥 한국어 적어도 된다. 그래서 회원가입으로 적어줬다. 

회원가입에서는 save되는 것도 중요하지만 중복된 이름이 있는 지 확인하는 것도 중요하다. 

 

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

    Member member2 = new Member();
    member2.setName("spring");      // member1 과 이름이 같음

    // when
    memberService.join(member1);
    try {
        memberService.join(member2);
        fail();  // 위 줄에서 그 다음줄로 실행되면 실패 (중복이니까)
    } catch (IllegalStateException e) {
        // 여기로 오면 예외가 터진 거기 때문에 정상적으로 성공한 거임
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }

    // then
}

중복 회원 테스트도 만들어준다. 저렇게 하면

성공한다. 근데 저 메세지를

assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.123123");

이렇게 바꿔버리면

이런 에러가 떠 버린다. 

private void validateDuplicateMember (Member member) {
    memberRepository.findByName(member.getName())
            .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
}

MemberService 의 이 부분과 같지 않아서 그렇다. 아마도 

 

아 솔직히 진짜 뭔말인지 알 수 없다 다음에 다시 듣겠다

반응형