이제 실제 동작하는지 실행하고 테스트를 해보자.
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);
}
}
<출처 김영한: 스프링 핵심 원리 - 기본편 >
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
'Spring > SpringCore' 카테고리의 다른 글
스프링 핵심 원리 이해1 - 주문과 할인 도메인 개발 (0) | 2022.03.24 |
---|---|
스프링 핵심 원리 이해1 - 주문과 할인 도메인 설계 (0) | 2022.03.24 |
스프링 핵심 원리 이해1 - 회원 도메인 설계 (0) | 2022.03.24 |
스프링 핵심 원리 이해1 - 비즈니스 요구사항 설계 (0) | 2022.03.24 |
스프링 핵심 원리 이해1 - 프로젝트 생성 (0) | 2022.03.23 |