# Spring / Single-ton Pattern, Single-ton Container
Study Repository

Spring / Single-ton Pattern, Single-ton Container

by rlaehddnd0422

์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ - ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‹ฑ๊ธ€ํ†ค

 

์˜ˆ๋ฅผ๋“ค์–ด, ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์‹œ์— memberService๋ฅผ ์š”์ฒญํ•œ๋‹ค๊ณ  ํ•  ๋•Œ,  ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ์†Œ๋ฉธ๋œ๋‹ค.

 

โ–ถ๏ธŽ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•จ.

 

TestCode

public class SingletonTest {

    @Test
    @DisplayName("์Šคํ”„๋ง ์—†๋Š” ์ˆœ์ˆ˜ํ•œ DI Container")
    void pureContainer()
    {
        AppConfig appConfig = new AppConfig();

        MemberService memberService1 = appConfig.memberService();

        MemberService memberService2 = appConfig.memberService();

        System.out.println("memberService1 = " + memberService1);
        System.out.println("memberService2 = " + memberService2);

        assertThat(memberService1).isNotSameAs(memberService2);

    }
}

 

Solution โ–ท ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค

์ด๋ฅผ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 


์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด

 

package hello.core.singleton;

public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance()
    {
        return instance;
    }

    // ์ƒ์„ฑ์ž๋ฅผ private๋กœ ์„ ์–ธํ•ด์„œ ์™ธ๋ถ€์—์„œ new keyword๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰์Œ
    private SingletonService(){}

    public void logic()
    {
        System.out.println("์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ๋กœ์ง ํ˜ธ์ถœ");
    }
}

1. static์˜์—ญ์— ๊ฐ์ฒด instance๋ฅผ ๋ฏธ๋ฆฌ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ ์˜ฌ๋ ค๋‘”๋‹ค.

2. ์ƒ์„ฑ์ž๋Š” private๋กœ ์™ธ๋ถ€์ƒ์„ฑ์„ ๋ง‰์•„๋‘๊ณ  

 

3. getinstance() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด static์˜์—ญ์— ์ƒ์„ฑํ•ด๋‘” ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ํ•œ๋‹ค.

 

 

TestCode

ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ getinstance()๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ–ˆ๊ณ , getinstance()๋Š” static level์— ์žˆ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค€๋‹ค.

 

MemoryMemberRepository๋ฅผ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

์ด ์ „ ํฌ์ŠคํŒ…์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ Service (OrderService, MemberService) ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ MemoryMemberRepository๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด static ์˜์—ญ์— instance๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋‘๊ณ  getinstance() ๋ฉ”์†Œ๋“œ๋กœ ํ•ด๋‹น instance๋งŒ ๋ฆฌํ„ดํ•˜๋„๋ก ์„ค์ •ํ•ด์ฃผ์—ˆ๊ณ ,

๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ private๋กœ ์„ค์ •ํ•˜์—ฌ ์™ธ๋ถ€์—์„œ new๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ–ˆ๋‹ค.

 

 

OrderServiceTest

OrderServiceTest ๋‹จ๊ณ„์—์„œ ๊ฐ ์„œ๋น„์Šค์˜ MemoryMemberRepository์˜ ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ํ”„๋ฆฐํŠธํ•˜๋Š” TestCode๋ฅผ ๋งŒ๋“ค์–ด๋ณธ ๊ฒฐ๊ณผ ๋‘ ์„œ๋น„์Šค๊ฐ€ ๊ฐ™์€ MemoryMemberRepository๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ์„ค์ •์ด ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๋ฌธ์ œ์ 

1. ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ž์ฒด๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ„๋‹ค. 

2. ์˜์กด๊ด€๊ณ„์ƒ ํด๋ผ์ด์–ธํ‹€๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์—( ์œ„์™€ ๊ฐ™์€ case์—์„œ๋Š” ๊ตฌ์ฒด์˜ getinstance()์— ์˜์กดํ•จ ) DIP๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.

3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•ด์„œ OCP ์›์น™์„ ์œ„๋ฐ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ

4. ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค.

5. ๋‚ด๋ถ€ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

6. private ์ƒ์„ฑ์ž๋กœ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค.

7. ๊ฒฐ๋ก ์ ์œผ๋กœ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง.

8. ๊ทธ๋ž˜์„œ ์•ˆํ‹ฐํŒจํ„ด์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•จ.

 

 


์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ

 

์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ , ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

์•ž์„œ ๋ฐฐ์šด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ๋กœ, ์Šคํ”„๋ง ๋นˆ์ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ผ ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ , 

DIP, OCP, Test, private ์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กœ์›Œ์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

 

Testcode

@Test
@DisplayName("์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์‹ฑ๊ธ€ํ†ค")
void springContainer()
{
    ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    MemberService memberService1 = ac.getBean(MemberService.class);
    MemberService memberService2 = ac.getBean(MemberService.class);

    System.out.println("memberService1 = " + memberService1);
    System.out.println("memberService2 = " + memberService2);

    assertThat(memberService1).isSameAs(memberService2);
}

์œ„์™€ ๊ฐ™์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋•๋ถ„์— ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ—๏ธ ์Šคํ”„๋ง์˜ ๊ธฐ๋ณธ ๋นˆ ๋“ฑ๋ก ๋ฐฉ์‹์€ ์‹ฑ๊ธ€ํ†ค์ด์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์š”์ฒญํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค

 

 


์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ์ฃผ์˜์ 

 

์˜ˆ์‹œ๋ฅผ ์šฐ์„  ์‚ดํŽด๋ณด์ž

public class StatefulService {

    private int price;

    public void order(String name, int price)
    {
        System.out.println("name = " + name + " price =" + price);
        this.price = price;
    }

    public int getPrice()
    {
        return price;
    }
}

 

TestCode

class StatefulServiceTest {

    static class TestConfig
    {
        @Bean
        public StatefulService statefulService()
        {
            return new StatefulService();
        }
    }

    @Test
    void statefulServiceSingleton()
    {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
        StatefulService statefulService1 = applicationContext.getBean(StatefulService.class);
        StatefulService statefulService2 = applicationContext.getBean(StatefulService.class);

        //Thread A : A์‚ฌ์šฉ์ž 1000์› ์ฃผ๋ฌธ
        statefulService1.order("userA",1000);

        //Thread B : B์‚ฌ์šฉ์ž 2000์› ์ฃผ๋ฌธ
        statefulService2.order("userB",2000);

        //Thread A : A์‚ฌ์šฉ์ž ์ฃผ๋ฌธ ๊ธˆ์•ก ์กฐํšŒ
        int price = statefulService1.getPrice();
        System.out.println("price = " + price);


    }
}

 

price 

/ expected : 1000

/ result : 2000

 

ThreadA๊ฐ€ ์‚ฌ์šฉ์žA ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ThreadB๊ฐ€ ์‚ฌ์šฉ์žB ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค ๊ฐ€์ •ํ•˜์ž.

  • StatefulService ์˜ price ํ•„๋“œ๋Š” ๊ณต์œ ๋˜๋Š” ํ•„๋“œ์ธ๋ฐ, ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
    ์‚ฌ์šฉ์žA์˜ ์ฃผ๋ฌธ๊ธˆ์•ก์€ 1000์›์ด ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, 2000์›์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.
  • ์‹ค๋ฌด์—์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ, ์ •๋ง ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ํฐ ๋ฌธ์ œ๋“ค์ด ํ„ฐ์ง„๋‹ค.
    ๊ณต์œ  ํ•„๋“œ๋Š” ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.  ๋”ฐ๋ผ์„œ ์Šคํ”„๋ง ๋นˆ์€ ํ•ญ์ƒ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•˜์ž.

์ฃผ์˜์ 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋“ , ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋“ , ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋Š” ์œ„์™€ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ์œ ์ง€(stateful)ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

 

  1. ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
  2. ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ์˜์กด์ ์ธ ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ.
  3. ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ.
  4. ๊ฐ€๊ธ‰์  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  5. ํ•„๋“œ ๋Œ€์‹ ์— ์ž๋ฐ”์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ThreadLocal ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  6. ์Šคํ”„๋ง ๋นˆ์˜ ํ•„๋“œ์— ๊ณต์œ  ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ์ •๋ง ํฐ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ MemoryMemberRepository

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberServiceImp(getMemberRepository());
    }

    @Bean
    public MemberRepository getMemberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService()
    {
        return new OrderServiceImp(getMemberRepository(), getPolicy());
    }

    @Bean
    public DiscountPolicy getPolicy() {
        return new RateDiscountPolicy();
    }
}

์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” OrderService์™€ MemberService์—์„œ์˜ MemoryMemberRepository๊ฐ€ ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์ฝ”๋“œ๋งŒ ๋ดค์„๋•Œ๋Š” ๊ฐ๊ฐ new๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์งˆ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ,

 

ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด

 

ํ™•์ธํ•ด๋ณด๋ฉด memberRepository ์ธ์Šคํ„ด์Šค๋Š” ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค.

์‹ฑ๊ธ€ํ†ค์ด ์•ˆ ๊นจ์ง„๋‹ค.. ์™œ?

 

๋‘ ๋ฒˆ ํ˜ธ์ถœ์ด ์•ˆ๋˜๋Š” ๊ฑด๊ฐ€??? ํ˜ธ์ถœ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ์„œ ์‚ดํŽด๋ณด์ž.

 

 

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImp;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImp;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImp(getMemberRepository());
    }

    @Bean
    public MemberRepository getMemberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService()
    {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImp(getMemberRepository(), getPolicy());
    }

    @Bean
    public DiscountPolicy getPolicy() {
        return new RateDiscountPolicy();
    }
}


 

๊ฒฐ๊ณผ

1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ @Bean์„ ํ˜ธ์ถœํ•ด์„œ ์Šคํ”„๋ง ๋นˆ์„ ์ƒ์„ฑํ•  ๋•Œ ํ•œ ๋ฒˆ

2. orderService()๋กœ์ง์—์„œ ํ•œ ๋ฒˆ

3. memberService()๋กœ์ง์—์„œ ํ•œ ๋ฒˆ

 

getMemberRepository๊ฐ€ ์ด ์„ธ ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋”ฑ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ AppConfig์— ์–ด๋…ธํ…Œ์ด์…˜ @Configuration์„ ๋นผ๊ณ  ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์•˜๋”๋‹ˆ,

getmemberRepository()๊ฐ€ ์ด 3๋ฒˆ ํ˜ธ์ถœ๋œ๋ฐ๋‹ค๊ฐ€, ์‹ฑ๊ธ€ํ†ค๋„ ๊นจ์ ธ๋ฒ„๋ ธ๋‹ค.

์•„๋งˆ๋„ @Configuration์ด ์ด ๋™์ž‘๋“ค์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.


@Configuration์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘

์Šคํ”„๋ง์€ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


@Test
void configurationDeep()
{
    ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    AppConfig bean = ac.getBean(AppConfig.class);
    System.out.println("bean = " + bean.getClass());
    // -> bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$ad8aea39
}

์ˆœ์ˆ˜ํ•œ ํด๋ž˜์Šค๋ผ๋ฉด class hello.core.AppConfig๋กœ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ,

ํด๋ž˜์Šค๋ช…์— xxxCGLIB๊ฐ€ ๋ถ™์œผ๋ฉด์„œ ๋ณต์žกํ•ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํ”„๋ง์ด CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ AppConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ.

 

๊ทธ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋˜๋„๋ก ํ•ด์ค€๋‹ค. ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด์„œ ์ž‘์„ฑ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.(์‹ค์ œ๋กœ๋Š” CGLIB์˜ ๋‚ด๋ถ€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค.)

 

 

<์ •๋ฆฌ>

@Bean๋งŒ ์‚ฌ์šฉํ•ด๋„ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค

์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํ”„๋ง ์„ค์ •์ •๋ณด๋Š” ํ•ญ์ƒ @Configuration์„ ์‚ฌ์šฉํ•˜์ž!


<์ฐธ๊ณ ์ž๋ฃŒ>

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

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ