TIL - JAVA spring DAY 7 (회원 테스트 完)

jihan kong·2022년 1월 11일
0

JAVA spring 입문

목록 보기
9/20
post-thumbnail

지난 시간까지 회원 서비스 테스트 코드를 거의 다 개발하였지만 몇 가지 부족한 점들이 있다.

앞서 개발한 코드를 다시 살펴보자.

 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
     Member member1 = new Member();
     member1.setName("spring");

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

     // when
     memberService.join(member1);

회원가입 메소드에서 member의 이름을 "spring"으로 지정하였는데, 중복 회원 예외 메소드에서 member1과 member2의 이름을 똑같이 "spring"으로 지정하게 되면 memberService를 join할때, 이미 누적된 데이터로 인해 문제가 발생하게 되는 것이다. 저장된 데이터를 비워줌으로 독립적으로 실행되게끔 해야할 필요가 있는 것이다. 이를 위해,

class MemberServiceTest {

	MemberService memberService = new MemberService();
    	MemoryMemberRepository memberRepository = new MemoryMemberRepository();

MemberServiceTest class에 MemberRepository를 가져왔고, Repository를 clear하기 위해

class MemberServiceTest {

    MemberService memberService = new MemberService();
    MemoryMemberRepository memberRepository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }

at notation 이하의 코드를 추가하였다. 이렇게 한다면, 동일한 이름의 변수라도 각 method에서 테스트할 수 있게 된다.
(실제 테스트 실행 시, pass 하는 것을 볼 수 있다.)

그런데.... 우리가 한 가지 간과한 사항이 있다. memberService class 에 있는 memberRepository 가 어떻게 이루어져 있는지를 다시 한번 체크해보자.

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

MemberService class 는 new 로 객체를 생성한다. 그렇다면 우리가 만든 MemberService를 테스트하는 코드인 MemberServiceTest class 는...?

class MemberServiceTest {

    MemberService memberService = new MemberService();
    MemoryMemberRepository memberRepository = new MemoryMemberRepository();

당연한 이야기겠지만 new로 객체를 생성한다. 결과적으로 서로 다른 인스턴스이다. 서로 다른 repository를 이용하고 있는 셈이다.

따라서, 같은 인스턴스를 참조하게끔 하기 위해서 MemberService class에

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

를 추가한다. 이는 newmemberRepository 객체를 새로 생성하는것이 아니라 외부에서 직접 넣어주는 방식으로 바꾼것이다. 그렇게 된다면, MemberServiceTest class에서 MemberService 객체를 생성할 때, MemoryMemberRepository를 직접 넣어줄 수가 있게 된다. 이를 @BeforeEach를 통해 구현할 수 있다.

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

즉, BeforeEach 이므로 각 테스트를 실행하기전에 memberRepository 가 생성되고 memberService에서는 memberRepository 에 넣어주게 된다. 즉, 같은 Repository를 사용하게 되는 것이다. memberService 의 입장에서 보면, 자신이 직접 객체를 생성하지 않고 외부에서 this 생성자를 통해 memberRepository 를 넣어주게 되므로 이와 같은 것을 Dependency Injection (의존관계 주입, 줄여서 DI) 라고 한다는 것을 강사님께서 가르쳐주셨다.

마침내, 회원 Service Test 개발이 끝났다! 강사님께서 설명해주신대로 따라하면서 해봤지만 내것으로 만들려면 복습하고 또 다시 정리하는 과정이 필요하다는 것을 느꼈다. 강의를 들으면서 스프링의 기본 개념들을 하나씩 배우게 되었고 다시 한번 java의 강력한 기능들을 공부할 수 있는 기회가 되었다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글