※ 본 포스팅은 Inflearn - 김영한 강사님의 '스프링 핵심 원리 - 기본편' 을 참고,공부하여 만들었습니다.
비즈니스 요구사항과 설계
회원
- 회원을 가입하고 조회할 수 있다.
- 회원은 일반과 VIP 두 가지 등급이 있다.
- 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)
주문과 할인 정책
- 회원은 상품을 주문할 수 있다.
- 회원 등급에 따라 할인 정책을 적용할 수 있다.
- 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있 다.) 할인 정책은 변경 가능성이 높다.
- 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정)
회원 도메인 설계 -> 회원가입 조회 등 회원정보를 다루는 영역에 대한 설계
도메인이란 무엇일까..?
내가생각하는 도메인의 개념은
하나의 기능을 실행하는 프로그램들의 단위체이다.
위에서 설계한 회원 도메인을 보면 회원가입과 회원 조회를 하기 위하여 회원서비스와 메모리저장소(DB)는
서로 연결되어있는 , 협력하는 관계를 볼 수 있는데 이러한 협력과정을 거쳐 회원가입,조회를 할 수 있게 되는것이며
이것을 통틀어서 도메인설계라고 부른다고 생각한다.(7월7일 내용수정)
도메인에서 클래스끼리 협력관계를 설계할땐 객체지향적 설계를 해야한다.
회원 클래스 다이어그램을 보면 MemberService를 상속받은 MemberServiceImpl 박스에서 화살표를 가리키고 있다.
화살표가 가리키는 곳은 MemberRepository이다. 이를 MemberServiceImpl은 MemberRepository 에 의존한다고 한다.
쉽게 말하면 MemberServiceImpl을 실행할때 MemberRepositoey , 데이터베이스가 필요하다는 뜻 알고나면 당연한것
MemberServiceImpl에 MemberRepository를 구현한 객체를 선언 및 생성
(생성자는 AppConfig로 부터 MemoryMemberRepository를 받아 할당 -> 객체지향을 위해서! AppConfig는 나중에 따로 정리할 예정)
이렇게 외부에서 저장소(DB혹은 메모리 저장소)를 받아주는식으로 설계하는 이유는 앞서 회원도메인 설계시 어떤 DB를 쓸지 결정이 되지 않았기 때문이다.
정리해보자면 MemberServiceImpl은 회원가입, 회원조회등의 일을 처리해야하고 그러기 위해선 DB가 필요하다 현재는 정해진 DB가 없기에 MemberRepository라는 메모리 저장소를 이용하고있고 이러한 관계를 MemberServiceImpl는 MemberRepository 에 의존적이라고 한다. DB는 언제든 바뀔수 있기 때문에 AppConfig라는 App의 전반적인 설정과 구성요소를 책임지는 클래스를 생성하는데 이곳에서 생성자에 memberRepository를 주입할것이다. 이는 나중에 자세히 포스팅을 해볼테니 MemberServiceImpl 와 MemberRepository 의 의존적인 관계를 이해하고 넘어가자.
주문과 할인 도메인 설계
클라이언트(이용자,프로그램 등등)가 주문서비스에 주문을 요청한다.
주문을 요청하면 우리는 클라이언트의 회원을 조회하여 그 회원의 등급에 따라 알맞은 할인적용을 해줘야하는것이 바로 주문도메인에서 이뤄져야 할 일인것.
클래스 다이어그램을 살펴보자
주문서비스는 2개의 의존관계를 형성해야한다. 정확히는 주문 서비스 구현체가 말이다.
주문을 받고 회원을 조회하고 알맞은 할인정책을 부여한다.
OrderServiceImpl 도 AppConfig를 이용하여 MemberServiceImpl 과 같이 객체지향적 설계로 코드를 짜주었다.
할인정책도 DB도 언제든 바뀔수 있는것이기에 위와 같이 설계를 한것이다.
'Spring > Spring Study' 카테고리의 다른 글
[Inflearn] 스프링 컨테이너와 빈 (0) | 2021.07.01 |
---|---|
[Inflearn] AppConfig 리팩터 + (7월7일 내용 수정 및 보강) (0) | 2021.06.30 |
[Inflearn] 좋은 객체 지향 설계 원칙 (0) | 2021.06.29 |
[Inflearn] AppConfig (0) | 2021.06.28 |
스프링의 핵심 개념, 컨셉은 무엇인가? (0) | 2021.06.02 |