본문 바로가기
스프링 로드맵/스프링 입문

[인프런 스프링 입문] 회원서비스

by kancho24 2023. 8. 28.

하위 내용은 인프런 김영한님 강의를 바탕으로 작성되었음을 밝힙니다.

강의는 인프런을 통해 구매 가능하며, 링크 걸어두겠습니다.

https://www.inflearn.com/course/스프링-입문-스프링부트

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

 

지난 포스팅에서 회원도메인 & 레포지토리 생성에 대해서 다뤄보았다.

도메인, 레포지토리 생성단은 개발(서비스 제공자)에 가까웠다면, 회원서비스는 말그대로 회원(서비스 이용자)를 위한 코드이다.

 

우리가 이전에 임시저장공간에 회원정보저장, 회원조회를 구현해냈다. (MemoryMemberRepository.class)

이번에는 같은 기능을 구현할 것이다. 

 

1. 회원정보저장

사실 정보를 저장하는 코드는 두줄이면 완성된다.

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

우리는 여기에 추가로 '같은 이름을 중복해서 등록할 수 없다'라고 가정하고, 예외처리를 진행할 것이다.

그 결과 아래와 같은 코드로 바꿔줄 수 있다.

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

 

2. 회원조회

회원을 조회하는 기능 구현도 .findAll method, findById method를 불러오면 간단히 완성된다.

public List<Member> findMembers(){
    return memberRepository.findAll();
}

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

 

이렇게 MemberService.class를 완성했다.
여기서 command + shift + T 단축키를 이용해, TestCase작성할 클래스 틀을 쉽게 만들 수 있다.

 

1. 회원정보저장 테스트

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

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

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

우리에게 필요한 테스트 케이스는 사실 단순히 회원정보를 저장하는 것이 아니다.

우리는 중복 회원이 등록되었을 때, 우리가 지정해둔 IllegalStateException 예외가 올바르게 터지는지 확인해야한다.

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

    Member member2 = new Member();
    member2.setName("jammin");

    memberService.join(member1);
    //assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    try
    {
        memberService.join(member2); //여기서 예외 터져야 함
        fail();
    }
    catch (IllegalStateException e)
    {
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }
}

코드를 간단히 설명해보면,

member1 객체와 member2 객체를 (동일한 이름)을 생성한다.

같은 이름을 join method를 이용해 회원정보를 등록한다.

첫번째 member1이 등록되었을 때는 문제없이 등록되어야한다.
단, member2가 등록되었을 때는, 같은 이름이므로 IllegalStateException이 터져야한다.

이때, 이전 memberService.class에서 설정해둔 "이미 존재하는 회원입니다."라는 에러메세지가 나오는지
Assertions.assertThat(기대값).isEqualTo(결과값) 구문을 이용해 확인할 수 있다.

 

사실, 강의에서 이외에도 AfterEach를 통해 Repository Clear 작업,

매개변수를 통해 생성자를 통해서 MemoryMemberRepository 받아오는 작업등이 추가되었다.

 

하지만, 하나하나 꼼꼼히 짚고 넘어가는것이 아닌 '초심자가 스프링 프로젝트를 할 수 있게 하자'라는 목표를 잡고,

최대한 간단하게 설명하려 해당 내용은 포스팅에서 제외하였다.

자세하게 학습하기 위해선 해당 강의 수강 혹은 생성자 + 매개변수 (:base 문법)을 공부해 보는것을 추천한다.