728x90
반응형
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
반응형
'스프링 > 핵심 원리' 카테고리의 다른 글
[Spring] 주문과 할인 도메인 개발 (0) | 2022.01.20 |
---|---|
[Spring] 주문과 할인 도메인 설계 (0) | 2022.01.20 |
[Spring] 회원 도메인 개발 (0) | 2022.01.17 |
[Spring] 비즈니스 요구사항과 설계 & 회원 도메인 설계 (0) | 2022.01.12 |
[Spring] 프로젝트 생성 (0) | 2022.01.12 |
댓글