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

Bean์€ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•˜์ž

by Soono991 2023. 3. 27.
๐Ÿ’ก์ด ํฌ์ŠคํŒ…์€ Spring Bean์˜ ๋ฌด์ƒํƒœ(stateless)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

Spring Bean stateless์— ๋Œ€ํ•ด ํ•™์Šตํ•œ GitHub Repository์ž…๋‹ˆ๋‹ค.

 

 

GitHub - kiekk/test-spring-bean-stateless

Contribute to kiekk/test-spring-bean-stateless development by creating an account on GitHub.

github.com

 

Spring Bean์— ๊ด€ํ•ด ์ฐพ์•„๋ณด๋ฉด ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ƒํƒœ๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ์ƒํƒœ๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๋œปํ•˜๋ฉฐ Bean์ด ํŠน์ • ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ๋ถ€๋ถ„์„ ์กฐ๊ธˆ ๋” ์„ค๋ช…ํ•ด ๋ณด๋ฉด Bean์ด๋ผ์„œ ๋ฌด์ƒํƒœ(statelss)์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , Spring์—์„œ Bean์€ ๊ธฐ๋ณธ์ ์œผ๋กœ singleton ์Šค์ฝ”ํ”„๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— IoC ์ปจํ…Œ์ด๋„ˆ์— ๋‹จ ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Spring์—์„œ Bean์ด singleton์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ •๋ฆฌํ•ด ๋ณด๋ฉด singleton ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ํ•ญ์ƒ ๋ฌด์ƒํƒœ(statelss)๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

singleton

singleton ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Spring์˜ ๊ฒฝ์šฐ IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด Bean๋“ค์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋“ค์ด Bean์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์š”์ฒญํ•  ๊ฒฝ์šฐ IoC ์ปจํ…Œ์ด๋„ˆ ์žˆ๋Š” Bean์„ ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋กœ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์—์„œ Bean์— ํŠน์ • ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ Bean์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์„ '๋™์‹œ์„ฑ' ์ด์Šˆ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ณต์œ ๋œ ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฐ˜๋“œ์‹œ ๋’ค๋”ฐ๋ผ ์˜ค๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

// StatefulService Bean ๋“ฑ๋ก ์‹œ Singleton scope ๋กœ ๋“ฑ๋กํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
// UserA, UserB๊ฐ€ ๊ฐ๊ฐ StatefulService ์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด
// ๋™์‹œ์„ฑ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒ
@Test
void statefulServiceSingleton() {
    ApplicationContext ac = new AnnotationConfigApplicationContext(StatefulService.class);
    StatefulService statefulService1 = ac.getBean(StatefulService.class);
    StatefulService statefulService2 = ac.getBean(StatefulService.class);

    //ThreadA: A์‚ฌ์šฉ์ž 10000์› ์ฃผ๋ฌธ
    statefulService1.order("userA", 10000);
    //ThreadB: B์‚ฌ์šฉ์ž 20000์› ์ฃผ๋ฌธ
    statefulService2.order("userB", 20000);

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

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

    // UserA์˜ statefulService1, UserB์˜ statefulService2 ๋น„๊ต
    System.out.println("statefulService1 : " + statefulService1);
    System.out.println("statefulService2 : " + statefulService2);
    System.out.println("statefulService1 == statefulService2 : " + (statefulService1 == statefulService2));
    Assertions.assertThat(statefulService1.getPrice()).isEqualTo(10000); // ์—๋Ÿฌ๋ฐœ์ƒ
}

static 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;
    }
}

์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” StatefulService ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์— price๋ผ๋Š” ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, statefulServiceSingleton() ๋ฉ”์„œ๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์‚ฌ์šฉ์ž A์™€ ์‚ฌ์šฉ์ž B๊ฐ€ statefulService๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ(price)๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

์œ„์˜ ํ…Œ์ŠคํŠธ๋กœ ๋ณด๋ฉด ์‚ฌ์šฉ์žB๊ฐ€ ๋งˆ์ง€๋ง‰์— statefulService๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž B์˜ ์ƒํƒœ(price)๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์žA๊ฐ€ ๋‹ค์‹œ ์ƒํƒœ(price)๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ์ž์‹ ์ด ์ €์žฅํ–ˆ๋˜ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž B์˜ ์ƒํƒœ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์ด ์ƒํƒœ๊ฐ€ ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ ์ •๋ณด๋ผ๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ณด์•ˆ์—๋„ ๊ต‰์žฅํžˆ ์ทจ์•ฝํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋จผ์ € scope๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Scope ๋ณ€๊ฒฝ - prototype

 

singleton์˜ ๊ฒฝ์šฐ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, prototype์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ Bean์„ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ฐ˜ํ™˜ํ•œ ํ›„์—๋Š” IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋” ์ด์ƒ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ์œผ๋กœ์จ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋”๋ผ๋„ ์œ„์™€ ๊ฐ™์ด '๋™์‹œ์„ฑ' ์ด์Šˆ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

// scope๋ฅผ prototype์œผ๋กœ ์„ค์ •ํ•˜๋ฉด
// UserA์˜ statefulService, UserB์˜ statefulService๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น์ด ๋˜์–ด
// singleton์—์„œ์˜ ๋™์‹œ์„ฑ ์ด์Šˆ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
// ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ์‹์€ Spring์ด ์ง€ํ–ฅํ•˜๋Š” ๊ฒƒ๊ณผ ์ •๋ฐ˜๋Œ€๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ์˜ณ์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
@Test
void statefulServicePrototype() {
    ApplicationContext ac = new AnnotationConfigApplicationContext(StatefulServiceV2.class);
    StatefulServiceV2 statefulService1 = ac.getBean(StatefulServiceV2.class);
    StatefulServiceV2 statefulService2 = ac.getBean(StatefulServiceV2.class);

    //ThreadA: A์‚ฌ์šฉ์ž 10000์› ์ฃผ๋ฌธ
    statefulService1.order("userA", 10000);
    //ThreadB: B์‚ฌ์šฉ์ž 20000์› ์ฃผ๋ฌธ
    statefulService2.order("userB", 20000);

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

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

    // UserA์˜ statefulService1, UserB์˜ statefulService2 ๋น„๊ต
    System.out.println("statefulService1 : " + statefulService1);
    System.out.println("statefulService2 : " + statefulService2);
    System.out.println("statefulService1 == statefulService2 : " + (statefulService1 == statefulService2));

    Assertions.assertThat(statefulService1.getPrice()).isEqualTo(10000);
    Assertions.assertThat(statefulService2.getPrice()).isEqualTo(20000);
    Assertions.assertThat(statefulService1.getPrice()).isNotEqualTo(statefulService2.getPrice());
}

@Scope("prototype")
static class StatefulServiceV2 {
    private int price; // ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•„๋“œ

    public void order(String name, int price) {
        System.out.println("name = " + name + " price = " + price);
        this.price = price;
        // ์ด์ œ Bean ์„ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋–„๋ฌธ์—
        // ๋” ์ด์ƒ ๋™์‹œ์„ฑ ์ด์Šˆ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
        // ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์ด ์ƒ์„ฑ๋œ๋‹ค.
    }

    public int getPrice() {
        return price;
    }
}

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์ด best๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์‚ฌ์šฉ์ž์˜ Bean ์š”์ฒญ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์ธ๋ฐ, ์‚ฌ์šฉ์ž์˜ ์ˆ˜๊ฐ€ 100๋งŒ ๋ช…, 1000๋งŒ ๋ช…์ด๋ผ๊ณ  ๊ทน๋‹จ์ ์œผ๋กœ ๊ฐ€์ •์„ ํ•ด๋ณด๋ฉด ๊ทธ๋งŒํผ์˜ Bean์ด ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ ธ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๊ฑฐ๋‚˜ ์‹ฌํ•  ๋•Œ๋Š” ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์€ ์ด๋ ‡๊ฒŒ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜๊ฐ€ ์žˆ๊ตฌ๋‚˜. ์ •๋„๋กœ๋งŒ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ Spring์˜ ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์ด์ž ์ด ํฌ์ŠคํŒ…์˜ ์ œ๋ชฉ์ธ Bean์„ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” price๋ฅผ ์ œ๊ฑฐํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ Bean์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ธก์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

// ์œ„ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•˜๋ ค๋ฉด Bean ์ด ๋” ์ด์ƒ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.
// ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋„๋ก ํ•˜์—ฌ Spring ์ด ์ง€ํ–ฅํ•˜๋Š” singleton ๋ฐฉ์‹๋„ ํ•ด๊ฒฐํ•˜๊ณ  ๋™์‹œ์„ฑ ์ด์Šˆ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
@Test
void statelessService() {
    ApplicationContext ac = new AnnotationConfigApplicationContext(StatelessService.class);
    StatelessService statelessService1 = ac.getBean(StatelessService.class);
    StatelessService statelessService2 = ac.getBean(StatelessService.class);

    //ThreadA: A์‚ฌ์šฉ์ž 10000์› ์ฃผ๋ฌธ
    int priceOfUserA = statelessService1.order("userA", 10000);
    //ThreadB: B์‚ฌ์šฉ์ž 20000์› ์ฃผ๋ฌธ
    int priceOfUserB = statelessService2.order("userB", 20000);

    System.out.println("priceOfUserA = " + priceOfUserA);
    System.out.println("priceOfUserB = " + priceOfUserB);

    // UserA์˜ statelessService1, UserB์˜ statelessService2 ๋น„๊ต
    System.out.println("statelessService1 : " + statelessService1);
    System.out.println("statelessService2 : " + statelessService2);
    System.out.println("statelessService1 == statelessService2 : " + (statelessService1 == statelessService2));

    Assertions.assertThat(priceOfUserA).isEqualTo(10000);
    Assertions.assertThat(priceOfUserB).isEqualTo(20000);
}

static class StatelessService {
    public int order(String name, int price) {
        System.out.println("name = " + name + " price = " + price);
        return price;
    }
}

์ด ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ์ ์€ StatelessService์—์„œ price๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋” ์ด์ƒ ์ด ๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ์ „๋‹ฌ ๋ฐ›์€ price๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์ด์ œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ Bean์ด ์•„๋‹Œ Bean์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ชฝ์œผ๋กœ ๋˜๊ฒŒ๋” ํ•˜์—ฌ ์•ž์„œ 2๊ฐœ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์™€ ๊ฐ™์€ ์ด์œ ๋กœ ํ•ญ์ƒ Bean์€ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, Bean์„ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€