본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해1 - 예제 만들기]주문과 할인 도메인 개발

JAVA만 사용한 할인정책

package hello.core.discount;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

import hello.core.member.Member;
// 'Member' 클래스를 import합니다. 이 클래스는 동일 프로젝트의 다른 패키지에 정의되어 있으며, 'DiscountPolicy' 인터페이스에서 사용됩니다.

public interface DiscountPolicy {
// 'DiscountPolicy'라는 이름의 public 인터페이스를 선언합니다. 인터페이스는 메서드의 시그니처만을 정의하며, 구현은 이 인터페이스를 구현하는 클래스에서 이루어집니다.

    /*
    * @return 할인 대상금액
    * */
    // 이 주석은 'discount' 메서드가 반환할 값에 대한 설명을 제공합니다. 여기서는 할인 대상 금액을 반환한다고 설명하고 있습니다.

    int discount(Member member, int price);
    // 'discount' 메서드를 선언합니다. 이 메서드는 'Member' 객체와 정가를 의미하는 'int price'를 매개변수로 받습니다. 
    // 메서드는 할인 금액을 정수형으로 반환해야 합니다. 실제 할인 로직은 이 인터페이스를 구현하는 클래스에서 정의됩니다.
}

 

이 클래스는 DiscountPolicy 인터페이스를 구현하여 VIP 회원에게 고정된 할인 금액을 제공하는 할인 정책을 정의합니다.

package hello.core.discount;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

import hello.core.member.Grade;
import hello.core.member.Member;
// 'Grade' 열거형과 'Member' 클래스를 import합니다. 이들은 회원의 등급과 회원 정보를 나타내는 클래스입니다.

public class FixDiscountPolicy implements DiscountPolicy {
// 'FixDiscountPolicy'라는 클래스를 선언하며, 'DiscountPolicy' 인터페이스를 구현합니다. 이 클래스는 인터페이스에서 정의된 'discount' 메서드를 구현하여 할인 로직을 제공합니다.

    private int discountFixAmount = 1000; // 1000원 정액 할인
    // 'discountFixAmount'라는 private 변수를 선언하고 1000으로 초기화합니다. 이 변수는 고정 할인 금액을 저장하며, VIP 회원에게 적용됩니다.

    @Override
    public int discount(Member member, int price) {
    // 'discount' 메서드를 오버라이드합니다. 이 메서드는 'Member' 객체와 상품의 가격을 매개변수로 받습니다.

        if (member.getGrade() == Grade.VIP) {
            // 회원의 등급이 VIP인지 확인합니다.
            return discountFixAmount;
            // 등급이 VIP일 경우, 고정 할인 금액 'discountFixAmount'를 반환합니다.
        } else {
            return 0;
            // VIP가 아닐 경우, 할인 금액으로 0을 반환합니다.
        }
    }
}

VIP 회원에게만 1000원의 고정 할인을 제공하는 간단한 할인 정책을 구현합니다. 회원 등급에 따라 할인 여부를 결정하며, 할인 정책을 변경하고자 할 때 다른 클래스로 쉽게 대체 가능하도록 인터페이스를 사용합니다.

 

JAVA만 사용한 주문

package hello.core.order;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public class Order {
// 'Order'라는 public 클래스를 선언합니다. 이 클래스는 주문 정보를 관리합니다.

    private Long memberId;
    // Long 타입의 private 변수 'memberId'를 선언합니다. 이 변수는 회원의 ID를 저장합니다.

    private String itemName;
    // String 타입의 private 변수 'itemName'을 선언합니다. 이 변수는 주문한 상품의 이름을 저장합니다.

    private int itemPrice;
    // int 타입의 private 변수 'itemPrice'를 선언합니다. 이 변수는 상품의 가격을 저장합니다.

    private int discountPrice;
    // int 타입의 private 변수 'discountPrice'를 선언합니다. 이 변수는 할인된 가격을 저장합니다.

    public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
    // 'Order' 클래스의 생성자를 선언합니다. 이 생성자는 주문을 생성할 때 회원 ID, 상품 이름, 상품 가격, 할인 가격을 매개변수로 받습니다.

        this.memberId = memberId;
        // 'this.memberId'는 클래스의 인스턴스 변수 'memberId'를 가리키며, 생성자의 매개변수로 받은 'memberId' 값을 할당합니다.

        this.itemName = itemName;
        // 'this.itemName'은 클래스의 인스턴스 변수 'itemName'을 가리키며, 생성자의 매개변수로 받은 'itemName' 값을 할당합니다.

        this.itemPrice = itemPrice;
        // 'this.itemPrice'는 클래스의 인스턴스 변수 'itemPrice'를 가리키며, 생성자의 매개변수로 받은 'itemPrice' 값을 할당합니다.

        this.discountPrice = discountPrice;
        // 'this.discountPrice'는 클래스의 인스턴스 변수 'discountPrice'를 가리키며, 생성자의 매개변수로 받은 'discountPrice' 값을 할당합니다.
    }

    public int calculatePrice() {
    // 'calculatePrice' 메서드를 선언합니다. 이 메서드는 실제 결제 금액을 계산하여 반환합니다.

        return itemPrice - discountPrice;
        // 상품 가격에서 할인 가격을 빼서 최종 결제 금액을 계산하고 반환합니다.
    }

    public Long getMemberId() {
    // 'memberId' 값을 반환하는 getter 메서드를 선언합니다.

        return memberId;
        // 'memberId' 인스턴스 변수의 값을 반환합니다.
    }

    public void setMemberId(Long memberId) {
    // 'memberId' 값을 설정하는 setter 메서드를 선언합니다.

        this.memberId = memberId;
        // 'memberId' 인스턴스 변수에 매개변수로 받은 'memberId' 값을 할당합니다.
    }

    public String getItemName() {
    // 'itemName' 값을 반환하는 getter 메서드를 선언합니다.

        return itemName;
        // 'itemName' 인스턴스 변수의 값을 반환합니다.
    }

    public void setItemName(String itemName) {
    // 'itemName' 값을 설정하는 setter 메서드를 선언합니다.

        this.itemName = itemName;
        // 'itemName' 인스턴스 변수에 매개변수로 받은 'itemName' 값을 할당합니다.
    }

    public int getItemPrice() {
    // 'itemPrice' 값을 반환하는 getter 메서드를 선언합니다.

        return itemPrice;
        // 'itemPrice' 인스턴스 변수의 값을 반환합니다.
    }

    public void setItemPrice(int itemPrice) {
    // 'itemPrice' 값을 설정하는 setter 메서드를 선언합니다.

        this.itemPrice = itemPrice;
        // 'itemPrice' 인스턴스 변수에 매개변수로 받은 'itemPrice' 값을 할당합니다.
    }

    public int getDiscountPrice() {
    // 'discountPrice' 값을 반환하는 getter 메서드를 선언합니다.

        return discountPrice;
        // 'discountPrice' 인스턴스 변수의 값을 반환합니다.
    }

    public void setDiscountPrice(int discountPrice) {
    // 'discountPrice' 값을 설정하는 setter 메서드를 선언합니다.

        this.discountPrice = discountPrice;
        // 'discountPrice' 인스턴스 변수에 매개변수로 받은 'discountPrice' 값을 할당합니다.
    }

    @Override
    public String toString() {
    // 'toString' 메서드를 오버라이드합니다. 이 메서드는 객체의 상태를 문자열로 반환하는 데 사용됩니다.

        return "Order{" +
                "memberId=" + memberId +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
        // 객체의 각 속성을 문자열 형태로 구성하여 반환합니다. 이는 객체의 정보를 쉽게 확인할 수 있게 해줍니다.
    }
}
package hello.core.order;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public interface OrderService {
// 'OrderService'라는 이름의 public 인터페이스를 선언합니다. 인터페이스는 클래스가 구현해야 하는 메서드를 정의하며, 여기서 선언된 모든 메서드는 public이고 추상적입니다.

    Order createOrder(Long memberId, String itemName, int itemPrice);
    // 'createOrder' 메서드를 선언합니다. 이 메서드는 주문을 생성하기 위해 필요한 회원 ID, 상품 이름, 상품 가격을 매개변수로 받습니다.
    // 메서드는 생성된 'Order' 객체를 반환해야 합니다. 실제 주문 생성 로직은 이 인터페이스를 구현하는 클래스에서 정의됩니다.
}
public class OrderServiceImpl implements OrderService {
// 'OrderServiceImpl'라는 클래스를 선언하고, 'OrderService' 인터페이스를 구현합니다. 이 클래스는 인터페이스에서 정의된 메서드를 구현해야 합니다.

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    // 'MemberRepository' 인터페이스의 구현체인 'MemoryMemberRepository'의 인스턴스를 'memberRepository'라는 final 변수로 선언하고 초기화합니다. final 키워드는 변수가 초기화된 후 변경될 수 없음을 의미합니다.

    private final DiscountPolicy discountPolicy= new FixDiscountPolicy();
    // 'DiscountPolicy' 인터페이스의 구현체인 'FixDiscountPolicy'의 인스턴스를 'discountPolicy'라는 final 변수로 선언하고 초기화합니다. 이 변수는 할인 정책을 정의하며, 할인 금액 계산에 사용됩니다.

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
    // 'createOrder' 메서드를 오버라이드합니다. 이 메서드는 주문을 생성하기 위한 정보(회원 ID, 상품 이름, 상품 가격)를 매개변수로 받습니다.

        Member member = memberRepository.findById(memberId);
        // 'memberRepository'에서 'findById' 메서드를 사용하여 매개변수로 받은 'memberId'에 해당하는 'Member' 객체를 조회합니다.

        int discountPrice = discountPolicy.discount(member, itemPrice);
        // 'discountPolicy'의 'discount' 메서드를 호출하여, 조회한 'member'와 상품 가격 'itemPrice'를 기반으로 할인 금액을 계산합니다.

        return new Order(memberId, itemName, itemPrice, discountPrice);
        // 생성자를 통해 'Order' 객체를 생성하고 반환합니다. 이 객체는 주문 ID, 상품 이름, 상품 가격 및 할인 금액 정보를 포함합니다.
    }
}