본문 바로가기
스프링/핵심 원리

[Spring] 회원 도메인 실행과 테스트

by drCode 2022. 1. 17.
728x90
반응형

MemberApp에 main 함수

 

MemberApp.java 를 만든다

 

psvm을 입력하면 main함수 자동 완성 문구가 나온다.

 

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();
        // Ctrl + ALT + V >> 좌항의 변수 완성
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

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

 

new Member(1L, "memberA", Grade.VIP); 까지 입력하고 맨 왼쪽에 Ctrl + ALT + V를 누르면 타입과 변수명이 자동완성된다.

 

이클립스의 sysout 기능은 soutv 하면 System.out.println("findMember = " + findMember); 까지 자동 완성 된다.

 

위의 코드 실행 결과, 결과가 똑같이 나온다.

 

 

근데 위처럼 main 문을 작성하여 테스트하기엔 너무 일일이 다 테스트케이스를 작성해야하는 문제가 있다.

 

좋지 않은 방법이다. 매번 눈으로 위의 출력문처럼 확인해야하기도 하다.

 

그래서, 아래와 같은 경로에 MemberServiceTest 클래스를 만들어준다.

 

Junit이라는 API를 써서 테스트를 하면 좋다.

 

 

 

 

 

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);
    }
}

 

 

회원 도메인 설계의 문제점

  • 이 코드의 설계상 문제는 무엇일가?
  • 다른 저장소로 변경할 때 OCP 원칙을 잘 준수할까?
  • DIP를 잘 지키고 있나?
  • 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제가 있음
    • 주문까지 만들고나서 문제점과 해결 방안을 설명

 

package hello.core.member;

public class MemberServiceImpl implements MemberService{

    // Ctrl + Shift + Enter : 세미콜론까지 완성
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    //      인터페이스에 의존하는 memberRepository(추상화된) = 구체화된 호출
    // 추상화 구체화 둘다 사용중이므로 좋은 코드가 아니다.
    // 변경 시 문제가 된다. DIP를 위반하고 있는 코드이다.

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

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

 

private final MemberRepository memberRepository = new MemoryMemberRepository();

 

부분에서

 

memberRepository는 추상화된 인터페이스를 의존하고있고

 

우항에서는 new MemoryMemberRepository() 생성자를 호출함으로써 구체화를 하고있다

 

추상화, 구체화를 둘다 사용하고 있으므로, 굉장히 좋지 못한 코드이다.

728x90
반응형

댓글