[Spring] 예제 1 만들기_3(JAVA)

이전 포스팅에서 만든 회원 도메인이 정상적으로 동작하는지 실행하고 테스트해보자. 이전 포스팅의 "회원 객체 다이어그램"에 해당하는 작업이다. 앞서 설명했지만, 클래스 다이어그램은 정적인 것이고 객체 다이어그램은 동적인 것이다. 


회원 도메인 실행과 테스트

회원 도메인

회원 가입 main

hello.core 아래 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 {

    public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        Member member = new Member(1L, "memberA", Grade.VIP); //Long 타입이므로 1L로 작성
        memberService.join(member);

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

이를 실행하면 다음과 같은 결과가 나올 것이다.

위 코드는 순수한 자바 코드이다. 스프링과 관련된 코드가 하나도 없다. 
애플리케이션 로직으로 메인 메서드를 통해 테스트하는 것은 한계가 있고 좋은 방법이 아니다. 따라서 JUnit이라는 테스트 프레임워크를 사용해보자.

 

회원 가입 테스트(by JUnit)

main 폴더가 아닌 test 폴더의 hello.core 하위에 member 패키지를 생성하자.

package hello.core.member;

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

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.assertThat(member).isEqualTo(findMember);
    }

}

join에 대한 테스트를 실행해보자. given, when, then은 각각 given이 주어지고 when을 했을 때, then이 된다는 의미이다. 

실행했을 때 아래와 같이 되면 테스트에 통과된 것이다. 

 

회원 도메인 설계의 문제점

다른 저장소로 변경할 때 OCP 원칙을 잘 준수하는가? DIP를 잘 지키고 있는가?

의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다.

private final MemberRepository memberRepository = new MemoryMemberRepository(); 만 봐도 메모리 회원 저장소 구현체에 의존하고 있다. 추상화에도 의존하고 구체화에도 의존하는 것이다. 한 마디로 DIP를 위반하고 있는 것!


다음 포스팅에서는 주문과 할인 도메인을 설계하고 개발해보자.