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를 구현체로 사용

 

※ 본 게시글은 인프런의 스프링 핵심 원리 - 기본편(김영한)을 수강하고 정리한 내용입니다.