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

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ, ์ ์šฉ, ๋ฌธ์ œ์ )

by YeonBu 2023. 10. 20.
728x90

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

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

 

 

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

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

www.inflearn.com

 

 

 

 

 

์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ

 

 

1. ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ์„ค๊ณ„

 

 

โ—พ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ทธ๋ƒฅ RateDiscountPolicy๋งŒ ์ถ”๊ฐ€๋กœ ๊ฐœ๋ฐœํ•˜๋ฉด ๋จ.

 

 

 

 

 

2. RateDiscountPolicy ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ

 

 

RateDiscountPolicy

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;

public class RateDiscountPolicy implements DiscountPolicy{

    private int discountPercent = 10;

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

 

 

Ctrl + Shift + T ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

 

 

 

RateDiscountPolicyTest

 

package hello.core.discount;

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

import static org.junit.jupiter.api.Assertions.*;

class RateDiscountPolicyTest {

    RateDiscountPolicy discountPolicy = new RateDiscountPolicy();

    @Test
    @DisplayName("VIP๋Š” 10% ํ• ์ธ์ด ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.")
    void vip_o(){
        // given
        Member member = new Member(1L, "memberVIP", Grade.VIP);

        // when
        int discount = discountPolicy.discount(member, 10000);

        // then
        Assertions.assertThat(discount).isEqualTo(1000);

    }

    @Test
    @DisplayName("์ผ๋ฐ˜ ํšŒ์›์€ ํ• ์ธ์ด ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.")
    void vip_x(){

        // given
        Member member = new Member(2L, "memberBASIC", Grade.BASIC);

        // when
        int discount = discountPolicy.discount(member, 10000);

        // then
        Assertions.assertThat(discount).isEqualTo(0);

    }
    
}

 

 

โ—พ @DisplayName ์€ JUnit5 ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

โ—พ Assertions๋Š” static import ํ•˜๋Š”๊ฒŒ ์ข‹์Œ (Alt + Enter ๋ˆ„๋ฅด๊ณ  ๋‘๋ฒˆ์งธ๊บผ ์„ ํƒ)

 

 

 

 

3. ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ์ ์šฉ

 

 

OrderServiceImpl

 

package hello.core.order;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
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();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

    @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);

    }

}

 

โ—พ ์›๋ž˜ ์žˆ๋˜ discountPolicy๋ฅผ RateDiscountPolicy๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

โ—พ But, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด OCP, DIP๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.    

 

 

โž” DIP : OrderServiceImpl์€ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ฉฐ DIP๋ฅผ ์ง€ํ‚จ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ž์„ธํžˆ ๋ณด๋ฉด ๊ตฌํ˜„ ํด๋ž˜์Šค์—๋„ ์˜์กดํ•˜๊ณ  ์žˆ์Œ. DIP ์œ„๋ฐ˜

 

 

โž” OCP : ๊ทธ๋ž˜์„œ RateDiscountPolicy๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด OrderServiceImpl์˜ ์†Œ์Šค์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. OCP ์œ„๋ฐ˜

 

 

 

 

4. ๋ฌธ์ œ์  ํ•ด๊ฒฐ

 

 

OrderServiceImpl

 

public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    private DiscountPolicy discountPolicy;

    @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);

    }

}

 

โ—พ ๊ตฌ์ฒด์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ถ”์ƒํ™”์ธ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ฒŒ ์ฝ”๋“œ ๋ณ€๊ฒฝ

โ—พ But ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด?  NullPointerException ๋ฐœ์ƒ (discountPoliy๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜์ง€ ์•Š์•˜๊ธฐ๋•Œ๋ฌธ)

โž” ํ•ด๊ฒฐ๋ฐฉ์•ˆ : ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์ธ 'OrderServiceImpl'์— 'DiscountPolicy'์˜ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋Œ€์‹  ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์ž…ํ•ด์ฃผ์–ด์•ผ ํ•จ. 

 

 

 

๋‹ค์Œ ๊ฐ•์˜์— ๊ณ„์†!

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•

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

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