Spring/SpringCore

스프링 핵심 원리 이해1 - 회원 도메인 실행과 테스트

느리지만 꾸준하게 2022. 3. 24. 17:48

이제 실제 동작하는지 실행하고 테스트를 해보자.

hello.core 하위 객체에 MemberAPP을 만든다.

 

순수한 자바코드로 작성

// MemberApp


package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;

public class MemberApp {

	// psvm = public static void main을 이용하자. / command option v도 활용
    public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        // id값은 1번(1L => Long type)이라고 치고 이름은 memberA, 등급은 VIP라고 해준다.
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        // soutv실행
        System.out.println("new member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
    }
}

 

Run시키면 아래와 같다.

 

 

이제는  위와 같은 방법 말고 Junit이라는 Test framework을 써보자.

 

// test - member - MemberServiceTest class

package hello.core.member;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class MemberServiceTest {

    MemberService memberService = new MemberServiceImpl();

    @Test
    void join() {
        // given
        Member member = new Member(1L, "memberA", Grade.VIP);

        // when
        memberService.join(member);
        Member findMember = memberService.findMember(1L);



        // then
        // 검증은 Assertions라는 api를 쓴다.
        Assertions.assertThat(member).isEqualTo(findMember);

    }
}

Run 시키면 아래와 같이 동작

 

아래 부분의 findMember(1L)을 (2L)으로 하게되면 오류가 났다고 뜨면서 터미널에 뜨게된다.

// test - member - MemberServiceTest class

package hello.core.member;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class MemberServiceTest {

    MemberService memberService = new MemberServiceImpl();

    @Test
    void join() {
        // given
        Member member = new Member(1L, "memberA", Grade.VIP);

        // when
        memberService.join(member);
        Member findMember = memberService.findMember(2L);



        // then
        // 검증은 Assertions라는 api를 쓴다.
        Assertions.assertThat(member).isEqualTo(findMember);

    }
}

 

 

이러한 방법에는 큰 문제점이 존재하는데 MemberServiceImpl을 보면

아래 MemberRepository / MemoryMemberRepository 둘 다 의존하게 된다.

추상화에도 의존하고 구체화에도 의존하는 것(DIP를 위반)

package hello.core.member;

public class MemberServiceImpl implements MemberService{


	// MemberRepository는 인터페이스를 의존하지만  
    // 오른쪽 실제할당하는 부분 MemoryMemberRepository는 구현체를 의존한다.
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 핵심 원리 - 기본편 >

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com