Post

Spring - 3 회원 관리 예제 (2)

해당 자료는 인프런 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹MVC, DB 접근 기술 강의 노트입니다.

전 포스팅을 참고하시길 바랍니다.


1. 회원 서비스 만들기


service package를 만든 후 MemberService.java파일을 만들어줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package hello.hellospring.service;

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

import java.util.List;
import java.util.Optional;

public class MemberService {
    private final MemberRepositroy memberRepositroy = new MemoryMemberRepository();

    /*
    *회원가입 1. 중복 회원 고려
     */
    public Long join(Member member){
        validateDuplicateMember(member);//중복회원 검증 Method refactoring 했음. 
        //밑의 함수를 간단하게 위의 메소드로 작성한 것입니다.
        /*
        Optional<Member> result = memberRepositroy.findByName(member.getName());
        result.ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });
         */
        memberRepositroy.save(member);


        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepositroy.findByName(member.getName())
                .ifPresent(m ->{
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }
    
    /*
    * 전체 회원 조회
     */
    public List<Member> findMembers(){
        return memberRepositroy.findAll();
    }

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

}

2. 회원 서비스 테스트

먼저 위의 코드에서 수정할 부분이 있습니다.
이유는 전 포스트에서 했던 방식으로 테스트부분에서 객체를 새로 생성해서 쓰는 방법은 테스트의 목적을 충족시키기 애매하기 때문입니다.
MemberRepository의 메소드에 접근해야하는데 새로운 객체를 생성해서 메소드를 사용하기 보다는 객체를 이어받아서 하는게 더 깔끔해보입니다.


MemberRepository의 clearstore() Method를 사용한다고 가정하면

  1. 기존 방법
    • MemberRepository 객체생성
    • MemberService 객체생성
    • MemberRepository 객체의 clearstore() 메소드 호출.
    • 저장소를 비웠으니 MemberService 함수들을 호출.
      이 방식은 저장소와 service가 독립적으로 작동한다는 것입니다.
  2. 해야할 방법
    • MemberRepository 객체생성
    • MemberService 객체를 생성할 때 위에서 생성한 MemberRepository 객체를 이어준다.
      저장소와 service가 이어져 있게 된다.

위의 방식으로 해야하기 때문에 객체를 Service에서 생성해줘야합니다.

1
private final MemberRepositroy memberRepositroy = new MemoryMemberRepository();

코드를

1
2
3
4
5
//기존의 객체를 사용하기 위해 해당 방법을 쓴다.
    private final MemberRepositroy memberRepositroy;
    public MemberService(MemberRepositroy memberRepositroy){
        this.memberRepositroy = memberRepositroy;
    }

로 바꿔줍니다.

그리고

처럼 드래그를 해줍니다. window 환경 기준 ctrl + shift + t를 누르게 되면 자동으로 Test 파일이 생깁니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

class MemberServiceTest {

    //테스트는 과감하게 한글로 바꿔도 된다. 빌드될 때 포함되지 않음.
    MemberService memberService;
    MemoryMemberRepository memberRepository;

    //실행하기 전 해줘야할 것들 명세
    @BeforeEach
    public void beforeEach(){
        //객체들을 생성하고 이어주는 과정
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    //밑의 방식은 객체가 유지되지 않는 다른 방법
    //MemoryMemberRepository memberRepository = new MemoryMemberRepository();
    @AfterEach
    public void afterEach(){
        //객체를 지워준다. 안지워주면 테스트순서에따라 객체를 잘못 조회하여 오류가 난다.
        memberRepository.clearStore();
    }




    @Test
    void 회원가입() {
        //given 무언가 주어졌을 때
        Member member = new Member();
        member.setName("spring");
        //when 어떤 상황에서
        Long saveId = memberService.join(member);
        //then 무언가 나와야한다.
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외(){
        //given
        //중복을 확인하기 위해 Name에 같은 값을 넣어준다.
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");
        //when
        memberService.join(member1);

        //오류를 검출하기 위한 방법. 변수 e에 메시지를 넣어주고 같은지 학인하는 과정
        IllegalStateException e = assertThrows(IllegalStateException.class,()-> memberService.join(member2));

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

        /*방법 2 이 방법은 상대적으로 직관적이지 않다.
        memberService.join(member1);
        try {
            memberService.join(member2);
            fail();
        }catch (IllegalStateException e){
            org.assertj.core.api.Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
         */
        //then

    }


    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

이렇게 해주고 마지막으로 테스트를 돌립니다.

가 뜨면 성공.

This post is licensed under CC BY 4.0 by the author.