SPRING 핵심 원리 [ 기본편 ]

[스프링 핵심 원리] 섹션 2.5 예제만들기 (회원 도메인 실행과 테스트)

wlalsu_u 2023. 1. 24. 14:51

2.5.1  회원 도메인 테스트 -  main 메소드 사용

 

 

 

앞선 섹션 2.4에서 작성한 회원 도메인이 정상적으로 작동하는지 테스트 해보자.

 

 

 

먼저, main  >  java  >  hello.coreorder 패키지를 생성하고,

 

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);
        memberService.join(member);

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

 

 

 

public static void main(String[] args)

 

 

: pvsm 을 작성하면 자동으로 main 메소드가 작성된다.

 

 

 

Member member = new Member(1L, "memberA", Grade.VIP)

 

 

: 회원 아이디가 1, 이름이 memberA , 등급이 VIP 인 회원 객체를 생성한다.

 

 

 

 

memberService.join(member)

 

 

: 생성한 회원 객체를 회원가입하도록 한다.

 

 

 

 

Member findMember = memberService.findMember(1L)

 

 

: 회원 아이디를 이용하여 찾은 회원 객체를 반환한다.

 

 

 

 

 

 

 

메인 메소드를 실행해보면, 다음과 같이 회원가입된 객체와 메모리에서 찾은 객체가 같은 것을 확인해 볼 수 있다.

 

 

 

 

 

 

 

하지만, 애플리케이션 로직으로 테스트 하는 것은 좋은 방법이 아니다.
따라서, 아래의 JUnit 테스트 방법을 사용하는것이 더 좋다. 

 

 

 

 


 

 

2.5.2  회원 도메인 테스트 -  JUnit 사용

 

 

 

JUnit 테스트 프레임을 사용하여 회원 도메인 코드를 test 해보자.

 

 

 

 

먼저, test  >  java  >  hello.core member 패키지를 생성하고,

 

MemberServiceTest 클래스를 다음과 같이 작성한다.

 

 

 

(test 패키지 아래에 작성된 파일은 빌드할 때, 배포되지 않는다.)

 

 

 

 

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

 

 

@Test

 

 

: 테스트 코드의 경우 test annotaion 사용한다. 

 

 

 

Member member = new Member(1L, "memberA", Grade.VIP)

 

 

: 회원 아이디가 1, 이름이 memberA , 등급이 VIP 인 회원 객체를 생성한다.

 

 

 

memberService.join(member)

 

 

: 앞서 생성한 객체를 저장소에 저장한다.

 

 

Member findMember = memberService.findMember(1L)

 

 

: id 가 1인 회원 객체를 저장소에서 찾아 반환한다.

 

 

 

Assertions.assertThat(member).isEqualTo(findMember)

 

 

: assertions api 를 사용하여 간편하게 저장한 회원 객체와 찾은 회원 객체가 같은지 확인한다.

 

 

 

 

 

 

 

테스트를 실행해보면 다음과 같이 정상적으로 동작하는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 


 

 

2.5.3  회원 도메인 설계상 문제점

 

 

 

앞서 작성한 회원 도메인 설계상 문제점은 다음과 같다. 

 

 

 

1) 다은 저장소로 변경할 때 OCP 원칙이 지켜지는가?

 

2) DIP 원칙은 지켜지고 있는가?

 

 

 

 

다음의 코드를 살펴보자.

 

 

MemberService memberService = new MemberServiceImpl();

 

 

 

memberService 는 MemberService 인터페이스 뿐만 아니라

 

MemberServiceImpl 구현체까지 모두 의존하고 있는 것을 볼 수 있다.

 

 

 

이렇듯, 인터페이스(추상화) 와 구현체(구체화) 에 모두 의존할 경우, 
DIP 를 위반하여 나중에 변경사항이 있을 시 문제가 될 수 있다.

 

 

 

따라서, 이를 해결하기 위한 추가적인 코드가 필요할 것으로 보인다.

 

 

 

 

 

 

 

 

 

 

김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.

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