앞 전에서 핵심 원리의 내용 중 인터페이스 예제를 구현해보자
1. 프로젝트 생성
- 자바가 아닌 스프링 부트로 진행(상관 없음)
- jdk-11이 아닌 jdk-17로 진행(인텔리제이[최신버전] java 17부터 설정 가능)
2. 비즈니스 요구사항 및 설계
- 요구사항
1) 회원 도메인
- 회원 가입 및 조회
- 회원 등급(일반, VIP)
- 회원 데이터 자체DB 구축 또는 외부 시스템 연동 예정 -> 변동성 있음
- 인터페이스 적용
2) 주문과 할인정책
- 상품 주문
- 등급에 따른 할인 정책 적용
- VIP는 할인 금액 1,000원 고정
- 아직 할인 정책 확정난 부분 없음, 할인 적용 정책 폐지 가능성도
있음 -> 변동성이 큼(인터페이스 적용)
3. 회원 도메인 설계
-
회원 도메인 협력 관계
- 클라이언트 : 회원 서비스 호출
- 회원 서비스 기능 : 회원 가입, 회원 조회
- 회원 저장소는 자체 DB를 사용할지, 외부 시스템과 연동할지
정해 지지 않음 인터페이스를 만들어 역할과 구현을 분리
-
회원 클래스 다이어그램
- MemberService(인터페이스) : 역할, MemberServiceImpl(클래스) : 구현체
- MemberRepository(인터페이스) : 역할 MemoryMemberRepository(클래스)/ DbMemberRepository(클래스) : 구현체
-
회원 객체 다이어그램
- 클라이언트 -> 회원 서비스
- 회원 서비스 -> 메모리 회원 저장소
_회원 도메인 설계의 문제점_
- MemberServiceImpl은 MemberRepository 인터페이스와 MemoryMemberRepository 구현체에도 의존 차후 변경 시 문제 발생 할 수 있음
4. 해결방안 제시
-
주문과 할인 도메인 설계
-
주문 도메인의 협력, 역할, 책임
-
클라이언트 : 주문 생성(회원 id, 상품명, 상품 가격) 요청
-
주문 서비스는 회원 저장소에서 회원을 조회
-
주문 서비스는 회원 등급에 따른 할인 가능 여부를 할인 정책에 위임
-
주문 서비스는 주문 결과를 반환
-
주문 도메인 전체 설계
- 역할과 구현을 분리하여 자유롭게 구현 객체를 조립 가능하도록 설계,
회원 저장소 역할과 할인 정책 역할을 유연하게 변경 가능
-
주문 도메인 클래스 다이어그램
- OrderService: 주문 인터페이스
- OrderServiceImpl: 주문 인터페이스 구현체
- MemberRepository: 회원 저장소 인터페이스
- MemoryMemberRepository: 회원 저장소 구현체 (메모리 저장소)
- DbMemberRepository: 회원 저장소 구현체 (DB 저장소)
- DiscountPolicy: 할인 정책 인터페이스
- FixDiscountPolicy: 할인 정책 인터페이스 구현체 (정액 할인 정책)
- RateDiscountPolicy: 할인 정책 인터페이스 구현체 (정률 할인 정책)
-
주문 도메인 객체 다이어그램(메모리, 정액 할인)
-
주문 도메인 객체 다이어그램(DB , 정률 할인)
5. 깃허브 내 코드 확인
https://github.com/JAVANOM/SPRING_CORE/tree/master