๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ์‹คํ–‰, ํ…Œ์ŠคํŠธ)

by YeonBu 2023. 10. 20.
728x90

 

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

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

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

www.inflearn.com

 

 

 

 

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

 

 

 

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

 

 

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

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

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

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

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

                               (์‹ค์ œ๋กœ๋Š” DB์— ์ €์žฅํ•˜๊ฒ ์ง€๋งŒ, ์˜ˆ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜)

 

 

 

 

 

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

 

โ—พ ์—ญํ• ์„ ๋จผ์ € ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„์„ ๋‹ค์Œ์— ๋งŒ๋“ค๋ฉด ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์„œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•จ.

โ—พ ๋ถ„๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์› ์ €์žฅ์†Œ, ํ• ์ธ ์ •์ฑ…์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ.

โ—พ ์ •์•ก ํ• ์ธ ์ •์ฑ… = 1,000์› ํ• ์ธ / ์ •๋ฅ  ํ• ์ธ ์ •์ฑ… = 10% ํ• ์ธ

 

 

 

 

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

 

 

 

 

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

โ—พ ํšŒ์›์„ ๋ฉ”๋ชจ๋ฆฌ/DB์—์„œ ์กฐํšŒํ•˜๊ณ  ์ •์•ก/์ •๋ฅ  ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•ด๋„ ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋จ.

 

 

 

 

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

 

 

Order

 

package hello.core.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 +
                '}';
    }

}

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 1

: toString() ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 

toString ์ด๋ž€ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. Object ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๋ชจ๋“  ์ž๋ฐ” ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ `toString()` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฉด ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์›ํ•˜๋Š” ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

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);
        int discountPrice = discountPolicy.discount(member, itemPrice);

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

}

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 1

: ๋‚ด๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜๊ฑด ์•„๋‹Œ๋ฐ ์ธํ”„๋Ÿฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋ฐœ๊ฒฌํ•œ ์งˆ๋ฌธ๊ธ€๊ณผ ๊น€์˜ํ•œ๋‹˜ ๋‹ต๋ณ€

 

Q. Member์˜ ๊ฒฝ์šฐ Memberํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๋Š”๋ฐ Order๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š”์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ  createOrder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

 

A. ์ด๊ฒƒ์„ static factory ํŒจํ„ด์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. https://johngrib.github.io/wiki/static-factory-method-pattern/ ์—ฌ๊ธฐ ๋งํฌ ์ฐธ์กฐ.

์ถ”๊ฐ€๋กœ Member๊ฐ™์ด ์ƒ์„ฑ์ด ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ข‹์Œ!

 

 

โญ ๊นจ๋‹ฌ์€ ์  1

int discountPrice = discountPolicy.discount(member, itemPrice);

: ๊ฐ•์˜๋ฅผ ๋ณด๊ธฐ ์ „ ๋‚˜๋ผ๋ฉด ํ• ์ธ์ •์ฑ…์„ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์ฃผ๋ฌธ ๊ตฌํ˜„ ๋‹จ๊ณ„์—์„œ if ์–ด์ฉŒ๊ตฌ else ์–ด์ฉŒ๊ตฌ~ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋‚˜์ค‘์— ํ• ์ธ ์ •์ฑ… ๋“ฑ์ด ๋ฐ”๋€Œ๋ฉด ํ• ์ธ์ชฝ๋„ ์ˆ˜์ •ํ•˜๊ณ  ์ฃผ๋ฌธ์ชฝ๋„ ์ˆ˜์ •ํ•˜๊ณ  ์ด๋žฌ์„ํ…๋ฐ 

์•„์˜ˆ ํ• ์ธ๊ณผ ์ฃผ๋ฌธ์˜ ํ•  ์ผ์„ ๋‚˜๋ˆ ์„œ ์„ค๊ณ„ํ•˜๋‹ˆ๊นŒ ๋ณ€๊ฒฝ์ด๋‚˜ ์ˆ˜์ •์ด ๋งŽ์ด ์šฉ์ดํ•ด์ง„๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๊ณ 

์ด๋Ÿฐ๊ฒŒ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ์ง€ํ‚จ ์„ค๊ณ„๋ผ๋Š”๊ฑธ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค!

 

 

 

 

3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

 

 

OrderServiceTest

 

package hello.core.order;

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

public class OrderServiceTest {

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

    @Test
    void createOrder(){

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

        Order order = orderService.createOrder(memberId, "itemA", 10000);
        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);

    }

}

 

 

์„ฑ๊ณต์ด์ฅฌ~

 

 

 

๋ฐ˜์‘ํ˜•

'IT > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ)  (0) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ, ์ ์šฉ, ๋ฌธ์ œ์ )  (2) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ์‹คํ–‰, ํ…Œ์ŠคํŠธ)  (1) 2023.10.18
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ, ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์„ค๊ณ„)  (0) 2023.10.18
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ SOLID, ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง)  (0) 2023.10.17