๐Ÿซ˜ ๋นˆ ์Šค์ฝ”ํ”„ (Bean Scopes in Spring)

 

1. Overview

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋นˆ ์Šค์ฝ”ํ”„๋ž€ IoC ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ์ •์˜๋œ ๋นˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

2. Bean Life Cycle

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
๐Ÿ‘‰ ๋นˆ ์ƒ์„ฑ
๐Ÿ‘‰ DI
๐Ÿ‘‰ ์ปค์Šคํ…€ ์ดˆ๊ธฐํ™” ๋ฉ”์†Œ๋“œ(@PostConstructor)
๐Ÿ‘‰ ๋นˆ ์‚ฌ์šฉ
๐Ÿ‘‰ ์ปค์Šคํ…€ ์†Œ๋ฉธ ๋ฉ”์†Œ๋“œ(@PreDestroy)

3. 6 Types of Scopes

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” 6๊ฐ€์ง€์˜ ๋นˆ ์Šค์ฝ”ํ”„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

  • Singleton Scope: ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋กœ ์ •์˜๋œ ๋นˆ์„ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์š”์ฒญ์— ๋™์ผํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„ ๋นˆ์ด ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ €์žฅํ•  ๊ณต๊ฐ„์ด ํ•˜๋‚˜์ธ๋ฐ ์„œ๋กœ ๋ฎ์–ด์“ฐ๊ณ  ์ฝ์œผ๋ฉด ์œ„ํ—˜ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฌด์ƒํƒœ(stateless) ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ฌ๋ฆฌ ์„ค์ •์„ ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋นˆ์€ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„(default)๋ฅผ ๊ฐ€์ง„๋‹ค.
// Java ์„ค์ •
// ์„ค์ • ์ •๋ณด ํ™œ์šฉ
@Configuration
public class AppConfiguration {
    @Bean
    @Scope(โ€œsingletonโ€)
    public MyBean getMyBean() {
        return new MyBean();
    }
}
// ComponentScan ํ™œ์šฉ
@Component
@Scope(โ€œsingletonโ€)
public class MyBean {
    ...
}

// xml ์„ค์ •
<bean id=โ€œmyBeanโ€ class=โ€œorg.bean.scope.MyBeanโ€ scope=โ€œsingletonโ€ />
  • Prototype Scope: ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„๋กœ ์ •์˜๋œ ๋นˆ์€ ์ปจํ…Œ์ด๋„ˆ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋กœ ์ •์˜๋œ ๋นˆ ๋‚ด๋ถ€์— ์ฃผ์ž…๋˜๋Š” ์Šคํ”„๋ง ๋นˆ์ด ํ”„๋กœํ† ํƒ€์ž…์ผ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋Š” ๋นˆ์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ๋  ๊ฒƒ์ด๋ผ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ณ„์† ์œ ์ง€๋˜๋ฉฐ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.

  • Web Aware Scopes

    • Request Scope: ์›น ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค. Request ์Šค์ฝ”ํ”„ ๋นˆ์„ ์ •์˜ํ•  ๋•Œ๋Š” proxyMode ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ผญ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋  ๋•Œ ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ์„ฑ ํ›„ ์ดˆ๊ธฐํ™” ๋ฐ ์˜์กด ๊ด€๊ณ„ ์„ค์ • ์ž‘์—…์ด ์ง„ํ–‰๋˜์ง€๋งŒ, request ์Šค์ฝ”ํ”„ ๋นˆํ›„ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์™€์•ผ๋งŒ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      @Bean
      @Scope(value = โ€œrequestโ€, proxyMode = ScopedProxyMode.TARGET_CLASS)
      public MyBean requestScopedBean() {
          return new MyBean();
      }
    
      @Bean
      @RequestScope
      public MyBean requestScopedBean() {
          return new MyBean();
      }
    
    • Session Scope: ์„ธ์…˜์ด ์‚ด์•„์žˆ์„ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค. Request Scope์™€ ๋™์ผํ•˜๊ฒŒ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • Application Scope: ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ์™€ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ํ•จ๊ป˜ ํ•œ๋‹ค.

    • WebSocket Scope: ์›น์†Œ์ผ“๊ณผ ๋™์ผํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ€์ง„๋‹ค.



References
https://catsbi.oopy.io
https://www.baeldung.com