백엔드/Spring
[스프링 핵심 원리] 섹션 2 예제 만들기
까루카라
2023. 2. 28. 10:40
비즈니스 요구사항과 설계
- 회원
- 회원 가입 & 조회
- 일반 & VIP 두 가지 등급이 있음
- 데이터 DB는 미확적
- 주문과 할인 정책
- 회원은 주문 가능
- 회원 등급에 따라 할인 정책
- VIP 고정 1000원 할인(이후 변경 가능)
회원 서비스와 회원 저장소는 interface를 사용할 것. 구현 내용을 사용자가 몰라도 된다.
회원 클래스 다이어 그램
구현
회원 등급
💡 enum : 관련이 있는 상수들의 집합.
회원 엔티티
💡 엔티티 : 데이터의 집합 / 데이터베이스의 테이블
회원 저장소
회원 저장소 인터페이스 (메모리, 자체 DB, 외부 시스템 사용할 지 미확정)
메모리 회원 저장소 구현체
- 자바 컬렉션 (Map)Map의 특징 : Key-Value 의 쌍으로 이루어진 테이터의 집합으로, 순서는 유지되지 않으며, 키를 기준으로 값을 저장하고 가져오기 때문에 중복된 키를 가질 수 없다.
- Map의 구현클래스 HashMap
- store를 정의하고, 아이디를 키로, 멤버를 값으로 저장한다.
회원 서비스
회원 서비스 인터페이스
회원 서비스 구현체
역할과 구현을 구분함.
회원 도메인 설계
메인 메소드로 테스트 하는 것은 효율적이지 않음. 콘솔 보면서 확인해야 함.
JUnit으로 테스트 하기 (어노테이션 주의)
오류가 뜨기 때문에 캐치가 빠르게 가능함.
설계상 문제점
- 다른 저장소로 변경할 때, OCP 잘 준수할까?
- DIP를 잘 지키고 있을까?
⇒ 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음
MemberRepository memberRepository = new MemoryMemberRepository(); 에서 추상화와 구체화 모두에 의존하고 있음. 저장소를 변경하면 코드를 변경해야 함!
주문과 할인 도메인 설계
역할과 구현을 분리함. 유연하게 관리 가능함.
- 메모리가 외부 서비스로, 정액이 정률으로 바뀌어도 주문 서비스를 변경하지 않아도 된다.
- 역할들의 협력관계를 그대로 사용 가능함 : 객체 지향의 사실과 오해
할인정책 인터페이스
할인정책 구현클래스 (정액 할인 정책)
주문 인터페이스
주문서비스 구현클래스
할인 정책 클래스에 멤버 아이디와 가격만 넘겨주면 할인 금액을 알 수 있다. 이후에 할인 정책이 바뀌어도 주문 서비스는 고칠 필요가 없음