Study/Spring
[스프링 핵심 원리 - 기본편] 스프링 핵심 원리 이해1 - 예제 만들기(주문과 할인 도메인 개발)
black6765
2022. 12. 4. 17:55
hello.core.discount 패키지 생성
- DiscountPolicy 인터페이스와 그 구현체들이 위치
DiscountPolicy
- discount 메소드
package hello.core.discount;
import hello.core.member.Member;
public interface DiscountPolicy {
/**
* @return 할인 대상 금
*/
int discount(Member member, int price);
}
FixDiscountPolicy
- 정액 할인 정책
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
public class FixDiscountPolicy implements DiscountPolicy {
private int discountFixAmount = 1000;
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return discountFixAmount;
} else {
return 0;
}
}
}
- ※ enum의 비교는 ==로 비교하는 것이 올바름
hello.core.order 패키지 생성
- 주문과 관련된 클래스들이 위치
OrderService
- 주문 서비스에 대한 인터페이스
package hello.core.order;
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
OrderServiceImpl
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
// OrderService 입장에서는 할인 정책에 대해서 모르고, discountPolicy에 위임함 -> 단일 책임 원칙 준수
// 할인이 변경되어도 OrderService는 바뀌지 않음
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
- MemoryMemberRepository와 FixDiscountPolicy를 구현체로 사용
※ 본 게시글은 인프런의 스프링 핵심 원리 - 기본편(김영한)을 수강하고 정리한 내용입니다.