SPRING/INFLEARN

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

ozllzL 2021. 5. 12. 03:05

inf.run/wr1v

 

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

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

www.inflearn.com

์ถœ์ฒ˜:  ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ-  ๊ธฐ๋ณธํŽธ

 

3. ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ์ดํ•ด1 - ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ

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

์ง„์งœ... ์›ƒ๊ฒจ....ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์•„๋‚˜ ์ € ๋งˆ์ง€๋ง‰ ๋ฉ˜ํŠธ๊ฐ€ ์ง„์‹ฌ ์›ƒ๊น€

์ €๋ฒˆ์—” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด๋ฒˆ์—” ์ •๋ฅ  ๊ธˆ์•ก ํ• ์ธ ํด๋ž˜์Šค RateDiscountPolicy๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

 

ํ…Œ์ŠคํŠธ์ฝ”๋“œ

//RateDiscountPolicyTest.java
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
        assertThat(discount).isEqualTo(1000);
    }

    @Test
    @DisplayName("VIP๊ฐ€ ์•„๋‹ˆ๋ฉด ํ• ์ธ์ด ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.")
    void vip_x(){
        //given
        Member member = new Member(1L, "memberVIP", Grade.BASIC);
        //when
        int discount = discountPolicy.discount(member, 10000);
        //then
        assertThat(discount).isEqualTo(1000); // ์˜ค๋ฅ˜๋‚˜์•ผํ•œ๋‹ค. ํ• ์ธ๊ธˆ์•ก์€ 0์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
    }
}

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋งŒ๋“ค ๋•Œ ctrl+alt+t

๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ๋ƒ…๋‹ค alt+enter

์œ„์—๊ฑด ์ž˜๋˜๊ณ  ์•„๋ž˜๊ฑด ์˜ค๋ฅ˜ ์™„-๋ฒฝ

 

- ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ์ ์šฉ๊ณผ ๋ฌธ์ œ์ 

<๋ฌธ์ œ์ >

1. DIP ์œ„๋ฐ˜ 

์ถ”์ƒํ™” & ๊ตฌ์ฒดํ™” ๋ชจ๋‘ ์˜์กด์ค‘

์šฐ๋ฆฌ๋Š” ์ถ”์ƒํ™”๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํฌ๋งํ•จ

2. OCP ์œ„๋ฐ˜

ํ• ์ธ ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, ํด๋ผ์ด์–ธํŠธ์ธ OrderServiceImpl์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

//OrderServiceImpl.java
public class OrderServiceImpl implements OrderService{
    private final MemberRepository memberRepository = new MemoryMemberRepository();//1
    //private final DiscountPolicy discountPolicy = new FicDiscountPolicy();->
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); //2
    /*์ƒ๋žต*/
}

 

<ํ•ด๊ฒฐ>

DiscountPolicy๋งŒ ์ผ๋‹จ ํ•ด๋ณด๊ธฐ

public class OrderServiceImpl implements OrderService{
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    private DiscountPolicy discountPolicy;
    //ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ NULL์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๊ฒƒ
    /*์ƒ๋žต*/
}

์—ญ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋‹ˆ discountPolicy์— fix๋˜ rate๋˜ ๊ณจ๋ผ์„œ ๋„ฃ์–ด์ค„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

- ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

"๊ณต์—ฐ ๊ธฐํš์ž๋ฅผ ๋งŒ๋“ค๊ณ , ๊ณต์—ฐ ๊ธฐํš์ž์™€ ๋ฐฐ์šฐ์˜ ์ฑ…์ž„์„ ํ™•์‹คํžˆ ๋ถ„๋ฆฌํ•˜์ž"

//AppConfig.java
public class AppConfig {
    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService(){
       return new OrderServiceImpl(new MemoryMemberRepository(), new FicDiscountPolicy());
    }
}

์ •๋ง... AppConfig ๋งŒ๋“ค ๋•Œ ์†Œ๋ฆ„๋ผ์ณค์Œ... ์ด๊ฒŒ ์ด๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ....

๊ฐ•์‚ฌ๋‹˜ ์ด๊ฑฐ ๋ง‰ ์„ค๋ช…ํ•˜๋Š”๋ฐ ์‹ ๊ฐ™๊ณ  ๋ง‰

์ •๋ง ์ด๋Ÿฐ๊ฑฐ ๋งŒ๋“ค์–ด๋†“์€ ์‚ฌ๋žŒ๋“ค ๋‹ค ๋Œ€๋ฐ•์  ์ฒœ์žฌ ๋งŒ์žฌ์ž„ ใ„นใ…‡

 

//OrderServiceImpl.java
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    /*์ƒ๋žต*/
}

//MemberServiceImpl.java
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    /*์ƒ๋žต*/
}

์ƒ์„ฑ์ž๋กœ ๊ฝ‚์•„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๊ณ ์นฉ๋‹ˆ๋‹ค..!!

private final๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธํ•˜๊ณ , ๊ตฌ์ฒดํ™” ํด๋ž˜์Šค ๋ฐ›์•„์„œ ์ƒ์„ฑํ•˜๋„๋ก ์ƒ์„ฑ์ž ๋งŒ๋“ค๊ธฐ

AppConfig๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐ

Impl์€ ์‹คํ–‰์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค.

=> ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

 

//MemberApp.java
public class MemberApp {
    public static void main(String[] args){
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        /*์ƒ๋žต*/
    }
}

//OrderApp.java
public class OrderApp {
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();
        /*์ƒ๋žต*/
    }
}

๋กœ์ง์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋˜ ์ฝ”๋“œ์—๋„ AppConfig์—์„œ ๋ฐ›์•„์˜จ ๊ฑธ ๋„ฃ์–ด์„œ ํ…Œ์ŠคํŠธ ํ•ด์ค๋‹ˆ๋‹ค.

ctrl + E ( + ์—”ํ„ฐ) ์ตœ๊ทผ ํŒŒ์ผ

 

//MemberServiceTest.java
public class MemberServiceTest {

    MemberService memberService;

    @BeforeEach
    public void beforeEach(){
        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
    }
    /*์ƒ๋žต*/
}    

//OrderServiceTest.java
public class OrderServiceTest {

    MemberService memberService;
    OrderService orderService;

    @BeforeEach
    public void beforeEach() {
        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
        orderService = appConfig.orderService();
    }
    /*์ƒ๋žต*/
}

jUnit์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•˜๋˜ ์ฝ”๋“œ์—๋„ ํ•ด์ค๋‹ˆ๋‹ค. BeforeEach๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ

 

์˜์กด๊ด€๊ณ„์ฃผ์ž… (DI : Dependency Injection)

 

- AppConfig ๋ฆฌํŒฉํ„ฐ๋ง

ํ˜„์žฌ AppConfig๋ฅผ ๋ณด๋ฉด ์ค‘๋ณต์ด ์žˆ๊ณ , ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ด ์ž˜ ์•ˆ๋ณด์ธ๋‹ค.

//AppConfig.java
public class AppConfig {
    //์—ญํ• ์ด ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }


    public OrderService orderService(){
       return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    //์ค‘๋ณต์ œ๊ฑฐ. ์ˆ˜์ •ํ•  ๋•Œ ์—ฌ๊ธฐ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ
    public MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    
    public DiscountPolicy discountPolicy(){
        return new FicDiscountPolicy();
    }
}

์ค‘๋ณต๋˜๋Š”๊ฑฐ์— ๋Œ€๊ณ  ctrl+alt+M : ์ค‘๋ณต ์ œ๊ฑฐ

์•„ ์ •๋ง ์ด ๋ถ€๋ถ„ ๋„ˆ๋ฌด ๊ฐ๋™์ ์ด์•ผ... ์„ธ์ƒ์— ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์˜ˆ์˜๊ฒŒ ๋˜๋‹ค๋‹ˆ...

๊ฐ•์‚ฌ๋‹˜ ์ •๋ง ์ฒœ์žฌ์•ผ.... 

๊ทผ๋ฐ ๋‚ด๊ฐ€ ์ด๊ฑธ ๋จธ๋ฆฟ์†์— ๋„ฃ๊ณ  ํ˜ผ์ž ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ?? ์ด๋Ÿฐ ์ƒ๊ฐ ๋ชปํ• ๊ฒƒ๊ฐ™์€๋ฐ ใ…‹ใ…‹ใ…‹

 

- ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์™€ ํ• ์ธ ์ •์ฑ… ์ ์šฉ

//AppConfig.java
public class AppConfig {

    /*์ƒ๋žต*/
    
    public DiscountPolicy discountPolicy(){
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

ํ•œ ์ค„๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ํ• ์ธ ์ •์ฑ… ๋ฐ”๋€œ 

๊ตฌ์„ฑ ์˜์—ญ๋งŒ ์†๋Œ€๋ฉด ๋˜๊ณ  ์‚ฌ์šฉ์˜์—ญ์€ ์ „ํ˜€ ์† ๋Œˆ ํ•„์š” ์—†๋‹ค.

์ด์ œ DIP์™€ OCP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค!!

 

๊ตฌ์„ฑ ์˜์—ญ๊ณผ ์‚ฌ์šฉ ์˜์—ญ์œผ๋กœ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค.

๊ตฌ์„ฑ ์˜์—ญ์ธ AppConfig๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

 

- ์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™์˜ ์ ์šฉ

SRP - ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ : ๊ตฌํ˜„ ๊ฐ์ฒด ์ƒ์„ฑ/์—ฐ๊ฒฐ, ์‹คํ–‰

-๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ->

AppConfig : ๊ตฌํ˜„ ๊ฐ์ฒด ์ƒ์„ฑ/์—ฐ๊ฒฐ

ํด๋ผ์ด์–ธํŠธ : ๊ฐ์ฒด ์‹คํ–‰

 

DIP - ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•˜์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์ถ”์ƒํ™” ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌ์ฒดํ™” ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์œผ๋ฏ€๋กœ,

๊ฒ‰๋ณด๊ธฐ์—” ์ถ”์ƒํ™” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ ํด๋ž˜์Šค์—๋„ ์˜์กดํ•˜๋Š” ๊ฒŒ ๋˜์–ด๋ฒ„๋ ธ๋‹ค.

-๊ตฌํ˜„ํด๋ž˜์Šค ํŒŒํŠธ ์ œ๊ฑฐ->

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. 

-์˜์กด๊ด€๊ณ„ ์ฃผ์ž…->

AppConfig๊ฐ€ ๋Œ€์‹  ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…ํ•จ

 

OCP - ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉ ์˜์—ญ๊ณผ ๊ตฌ์„ฑ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ 

๊ตฌ์„ฑ ์˜์—ญ์˜ AppConfig๋งŒ ๊ณ ์น˜๋ฉด ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. 

-> ์‚ฌ์šฉ ์˜์—ญ์˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ๋‹ค.

 

- IoC, DI, ๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ

์ œ์–ด์˜ ์—ญ์ „ (IoC : Inversion of Control)

์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ

ex) ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ํ๋ฆ„์ธ๋ฐ ์ด์ œ AppConfig๊ฐ€ ์ œ์–ด ํ๋ฆ„์„ ๊ฐ€์ ธ๊ฐ„๋‹ค.

 

ํ”„๋ ˆ์ž„์›Œํฌ vs๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๋Œ€์‹  ์‹คํ–‰ํ•˜๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ ์ œ์–ด์˜ ํ๋ฆ„์„ ๋‹ด๋‹นํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI : Dependency Injection)

∨ ์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด ๊ด€๊ณ„

import๋งŒ ๋ณด๊ณ ๋„ ์˜์กด๊ด€๊ณ„๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋ ์ง€๋Š” ๋ชจ๋ฅธ๋‹ค.

ex ) OrderServiceImpl๊ณผ MemberRepository, DiscountPolicy์˜ ๊ด€๊ณ„

 

 ๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด ๊ด€๊ณ„

์‹คํ–‰ ์‹œ์ ์— ๊ฒฐ์ •๋˜๋Š” ๋™์ ์ธ ๊ฐ์ฒด

๋Ÿฐํƒ€์ž„ ๋‚ด์—์„œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌ

์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) DiscountPolicy์™€ FixDiscountPolicy, RateDiscountPolicy์˜ ๊ด€๊ณ„

 

IoC์ปจํ…Œ์ด๋„ˆ, DI์ปจํ…Œ์ด๋„ˆ

AppConfig์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์„

IoC์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” DI์ปจํ…Œ์ด๋„ˆ(ํŠน์„ฑ์— ๋งž๋Š” ์ƒˆ์ด๋ฆ„)๋ผ๊ณ  ํ•œ๋‹ค. 

์Šคํ”„๋ง์ด DI์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ง๊ณ ๋„ ๋งŽ๋‹ค.

 

- ์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋กœ DI๋ฅผ ์ ์šฉํ–ˆ์ง€๋งŒ, ์ด์   ์Šคํ”„๋ง์„ ์ ์šฉํ•ด๋ณธ๋‹ค.

//AppConfig.java
@Configuration // ์„ค์ • ์ •๋ณด์— ์ ์Œ
public class AppConfig {
    //์—ญํ• ์ด ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.
    @Bean //Spring Container์— ๋“ฑ๋ก
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }
    @Bean
    public OrderService orderService(){
       return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    //์ค‘๋ณต์ œ๊ฑฐ. ์ˆ˜์ •ํ•  ๋•Œ ์—ฌ๊ธฐ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ
    @Bean
    public MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public DiscountPolicy discountPolicy(){
        return new FicDiscountPolicy();
    }
}

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ Bean ์ด๋ฆ„์ด ๋“ฑ๋ก๋œ๋‹ค.

//MemberApp.java
public class MemberApp {
    public static void main(String[] args){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
    	/*์ƒ๋žต*/
    }
}

//OrderApp.java
public class OrderApp {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
        OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
    	/*์ƒ๋žต*/
    }
}

์ด๋ ‡๊ฒŒ ์ˆ˜์ •์„ ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋‹ˆ

์˜ˆ์‹œ : MemberApp.java

์š”๋ ‡๊ฒŒ ๋ญ”๊ฐ€ appConfig์™€ ๊ทธ ์•„๋ž˜ ๋ฉ”์†Œ๋“œ๋“ค์˜ ์ด๋ฆ„์ด ๋‚˜์˜ค๋ฉฐ ์ž˜ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑ ์ •๋ณด๋กœ ์‚ฌ์šฉํ•จ.

@Bean์ด ์ ํžŒ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋‘ ํ˜ธ์ถœํ•ด์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•จ.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๊ฐ์ฒด : ์Šคํ”„๋ง ๋นˆ

๋ณดํ†ต ๋ฉ”์†Œ๋“œ ๋ช…์ด ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์ด ๋œ๋‹ค(name = ์–ด์ฉŒ๊ตฌ ํ•ด์„œ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์žˆ๋Š”๋ฐ ๊ตณ์ด..?)

์ด์ „์—” ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ผ์ผ์ด ํ–ˆ๋‹ค๋ฉด,

์ด์   ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์‰ฝ๊ฒŒ applicationContext.getBean() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์•„์ง ์ด๊ฒŒ ์™œ ์ข‹์€์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค!! ๊ทผ๋ฐ ๊ฐ•์‚ฌ๋‹˜์ด ๋‹ค์Œ ๊ฐ•์˜ ๋•Œ ์•Œ๋ ค์ฃผ์‹ ๋‹ค๊ณ  ํ•˜์…จ๋‹ค!!