Spring/Spring ๊ธฐ๋ณธ

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 6. ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ

hello_u 2023. 1. 31. 16:04

 

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„

 

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ…

  • ํšŒ์›์€ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ• ์ธ ์ •์ฑ…์€ ๋ชจ๋“  VIP๋Š” 1000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ์ ์šฉํ•ด๋‹ฌ๋ผ. (๋‚˜์ค‘์— ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ๋‹ค.)
  • ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํšŒ์‚ฌ์˜ ๊ธฐ๋ณธ ํ• ์ธ ์ •์ฑ…์„ ์•„์ง ์ •ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ์˜คํ”ˆ ์ง์ „๊นŒ์ง€ ๊ณ ๋ฏผ์„ ๋ฏธ๋ฃจ๊ณ  ์‹ถ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ• ์ธ์„ ์ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ๋„ ์žˆ๋‹ค. (๋ฏธํ™•์ •)

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ํ˜‘๋ ฅ, ์—ญํ• , ์ฑ…์ž„

1. ์ฃผ๋ฌธ ์ƒ์„ฑ: ํด๋ผ์ด์–ธํŠธ๋Š” ์ฃผ๋ฌธ ์„œ๋น„์Šค์— ์ฃผ๋ฌธ ์ƒ์„ฑ์„ ์š”์ฒญํ•œ๋‹ค.

2. ํšŒ์› ์กฐํšŒ: ํ• ์ธ์„ ์œ„ํ•ด์„œ๋Š” ํšŒ์› ๋“ฑ๊ธ‰์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ํšŒ์› ์ €์žฅ์†Œ์—์„œ ํšŒ์›์„ ์กฐํšŒํ•œ๋‹ค.

3. ํ• ์ธ ์ ์šฉ: ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ฅธ ํ• ์ธ ์—ฌ๋ถ€๋ฅผ ํ• ์ธ ์ •์ฑ…์— ์œ„์ž„ํ•œ๋‹ค.

4. ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜: ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ํ• ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•œ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ์ „์ฒด

 

์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์„œ ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ํ–ˆ๋‹ค.

 

ํ• ์ธ ์ •์ฑ… ์—ญํ•  

๊ตฌํ˜„ -> ์ •์•ก ํ• ์ธ ์ •์ฑ…

๊ตฌํ˜„ -> ์ •๋ฅ  ํ• ์ธ ์ •์ฑ… 

 

๋•๋ถ„์— ํšŒ์› ์ €์žฅ์†Œ๋Š” ๋ฌผ๋ก ์ด๊ณ , ํ• ์ธ ์ •์ฑ…๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

์—ญํ• (interface)๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ

 

ํ• ์ธ ์ •์ฑ… ์—ญํ• (DiscountPolicy) 

๊ตฌํ˜„ -> ์ •์•ก ํ• ์ธ ์ •์ฑ… FixDiscountPolicy

๊ตฌํ˜„ -> ์ •๋ฅ  ํ• ์ธ ์ •์ฑ… RateDiscountPolicy

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ 11

ํšŒ์›์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์กฐํšŒํ•˜๊ณ , ์ •์•ก ํ• ์ธ ์ •์ฑ…(๊ณ ์ • ๊ธˆ์•ก)์„ ์ง€์›ํ•ด๋„ ์ฃผ๋ฌธ ์„œ๋น„์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์—ญํ• ๋“ค์˜ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ2

ํšŒ์›์„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ DB์—์„œ ์กฐํšŒํ•˜๊ณ , ์ •๋ฅ  ํ• ์ธ ์ •์ฑ…(์ฃผ๋ฌธ ๊ธˆ์•ก์— ๋”ฐ๋ผ % ํ• ์ธ)์„ ์ง€์›ํ•ด๋„ ์ฃผ๋ฌธ ์„œ๋น„์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ

 

ํ• ์ธ ์ •์ฑ… ์ธํ„ฐํŽ˜์ด์Šค

 

๋”๋ณด๊ธฐ
package hello2.demo.discount;

import hello2.demo.member.Member;

public interface DiscountPolicy {

    /**
     * @return ํ• ์ธ ๋Œ€์ƒ ๊ธˆ์•ก
     */
    int discount(Member member, int price);
}

 

์ •์•ก ํ• ์ธ ์ •์ฑ… ๊ตฌํ˜„์ฒด

VIP๋ฉด 1000์› ํ• ์ธ, ์•„๋‹ˆ๋ฉด ํ• ์ธ ์—†์Œ

 

๋”๋ณด๊ธฐ
package hello2.demo.discount;

import hello2.demo.member.Grade;
import hello2.demo.member.Member;

public class FixDiscountPolicy implements DiscountPolicy{

    private int discountFixAmount = 1000; // 1000์› ํ• ์ธ

    @Override
    public int discount(Member member, int price) {
        if (member.getGrade() == Grade.VIP) {
            return discountFixAmount;
        } else {
            return 0;
        }

    }
}

 

์ฃผ๋ฌธ ์—”ํ‹ฐํ‹ฐ

 

๋”๋ณด๊ธฐ
package hello2.demo.order;

public class Order {
    private Long memberId;
    private String itemName;
    private int itemPrice;
    private int discountPrice;

    public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
        this.memberId = memberId;
        this.itemName = itemName;
        this.itemPrice = itemPrice;
        this.discountPrice = discountPrice;
    }

    public int calculatePrice(){   // ์ตœ์ข… ๊ณ„์‚ฐ๋œ ๊ธˆ์•ก
        return itemPrice - discountPrice;
    }

    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public int getItemPrice() {
        return itemPrice;
    }

    public void setItemPrice(int itemPrice) {
        this.itemPrice = itemPrice;
    }

    public int getDiscountPrice() {
        return discountPrice;
    }

    public void setDiscountPrice(int discountPrice) {
        this.discountPrice = discountPrice;
    }

    @Override
    public String toString() {
        return "Order{" +
                "memberId=" + memberId +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    }   // ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด toString ํ˜ธ์ถœ(๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ)
}

 

 

์ฃผ๋ฌธ ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค

๋”๋ณด๊ธฐ

 

package hello2.demo.order;

public interface OrderService {
    Order createOrder(Long memberId, String itemName, int itemPrice);
}

 

์ฃผ๋ฌธ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด

 

๋”๋ณด๊ธฐ
package hello2.demo.order;

import hello2.demo.discount.DiscountPolicy;
import hello2.demo.discount.FixDiscountPolicy;
import hello2.demo.member.Member;
import hello2.demo.member.MemberRepository;
import hello2.demo.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);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}

 

์ฃผ๋ฌธ ์ƒ์„ฑ ์š”์ฒญ์ด ์˜ค๋ฉด (createOrder())

ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  (findById(memberId)

ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•œ ๋‹ค์Œ discount(member, itemPrice).   // discountPrice --> member์˜ id๊ฐ€ vip์ด๋ฉด   1000 

์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ( return new Order() ) 

 

๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€, ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ ์ •์ฑ…์„ ๊ตฌํ˜„์ฒด๋กœ ์ƒ์„ฑํ•œ๋‹ค.

 

 

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์‹คํ–‰๊ณผ ํ…Œ์ŠคํŠธ

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ… ์‹คํ–‰

๋”๋ณด๊ธฐ
package hello2.demo;

import hello2.demo.discount.DiscountPolicy;
import hello2.demo.discount.FixDiscountPolicy;
import hello2.demo.member.*;
import hello2.demo.order.Order;
import hello2.demo.order.OrderService;
import hello2.demo.order.OrderServiceImpl;

public class OrderApp {
    public static void main(String[] args) {

        OrderService orderService = new OrderServiceImpl();
        MemberService memberService = new MemberServiceImpl();

        Long memberId = 1L;
        Member member = new Member(1L,"memberA",Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId,"itemA",10000);

        System.out.println("order = " + order);
        System.out.println("order.calculatePrice = " + order.calculatePrice());

    }
}

 

 

ํ• ์ธ ๊ธˆ์•ก์ด ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์œผ๋กœ ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. JUnit ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

 

์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ… ํ…Œ์ŠคํŠธ

๋”๋ณด๊ธฐ
package hello2.demo.order;

import hello2.demo.member.Grade;
import hello2.demo.member.Member;
import hello2.demo.member.MemberService;
import hello2.demo.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class OrderServiceTest {

    OrderService orderService = new OrderServiceImpl();
    MemberService memberService = new MemberServiceImpl();

    @Test
    void createOrder() {
        Long memberId = 1L;
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "itemA", 10000);

        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
    }

}

  

 

 

 

 

 

 

 

 

์ถœ์ฒ˜ : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com