1. 클래스를 먼저 만든다. (생성자, 게터&세터)
2. (Repository)구현할 기능의 인터페이스를 생성
3. (Repository)구현 클래스를 생성해서 인터페이스를 implements를 한다.
4. 기능을 구현한다.
(먼저 Repository 쪽부터 구현함)
5. 서비스 기능의 인터페이스 생성
6. 서비스 기능의 구현 클래스 생성, 상속
(인터페이스와 구현 클래스가 하나일 경우 구현 클래스의 이름을 ~~~Impl이라고 많이 쓴다.)
클래스 순서 (ENUM)Grade - (Class)Member - (Interface)MemberRepository - (Class) MemoryMemberRepository - (Interface)MemberService - (Class)MemberServiceImpl
7. MemberApp 생성 (기능 동작하는지 보기 위해)
하지만 위 방법보단 JUnit의 테스트 코드를 사용
(단일 테스트 만드는 것 중요)
MemberServiceImpl.java
private final MemberRepository memberRepository = new MemoryMemberRepository();
위 코드의 문제점은 인터페이스인 MemberRepository를 잘 의존함 하지만 실제 할당하는 부분인 구현체 MemoryMemberRepository를 의존함
즉, 추상화에도 의존하고 구체화에도 의존함 따라서 DIP 위반
주문 과정
역할(Interface)과 구현(Class)을 분리해서 자유롭게 구현 객체를 조립할 수 있게 설계했다.(회원 조회, 할인 적용)
주문 서비스 구현 부분에서 상품 세일에 관해 "나는 몰라! 내가 멤버 정보와 가격을 보내줄게 너가 알아서 해줘"
이런 식으로 구현하는 게 잘 짠 코드이고 이게 곧 단일 체계 원칙(SRP)이다.
(만약 할인율이 바뀔 경우 할인 구현부에서만 고치면 되기 때문이다.)
discount도 인터페이스 생성 - 구현 클래스
order도 order 클래스 생성 - 인터페이스 생성 - 구현 클래스 생성
'공부일지 > 메모' 카테고리의 다른 글
AWS의 클라우드 형태(IaaS, PaaS, SaaS) (0) | 2022.11.11 |
---|---|
[메모] 윈도우 IntelliJ 단축키 정리 (0) | 2022.08.31 |