Spring μ—μ„œ Bean Scope λŠ” Spring Container κ°€ κ΄€λ¦¬ν•˜λŠ” Bean 의 생쑴 λ²”μœ„λ₯Ό μ •μ˜ν•œλ‹€. 더 μ •ν™•ν•˜κ²ŒλŠ” Bean 이 μƒμ„±λ˜κ³  μ†Œλ©Έλ˜λŠ” μ‹œμ κ³Ό κ·Έ λ™μ•ˆμ— μœ μ§€λ˜λŠ” λ²”μœ„λ₯Ό μ„€μ •ν•˜λŠ” 것이닀.

μš°μ„  default scope λŠ” singleton 이닀. μ—¬κΈ°μ„œ Spring μ—μ„œμ˜ singleton 에 λŒ€ν•˜μ—¬ ν•œλ²ˆ 짚고 λ„˜μ–΄κ°€μž.

Singleton
  • Spring Container κ°€ 단 ν•˜λ‚˜μ˜ Bean instance λ§Œμ„ 생성
  • memory 에 cached 됨
  • Bean 에 λŒ€ν•œ λͺ¨λ“  dependency λŠ” λͺ¨λ‘ 같은 Bean 을 reference 함
1. Singleton (κΈ°λ³Έ μŠ€μ½”ν”„)
  • νŠΉμ§•: Application μ „μ²΄μ—μ„œ 단 ν•˜λ‚˜μ˜ instance 만 생성
  • 생쑴 λ²”μœ„: Spring Container μ‹œμž‘λΆ€ν„° μ’…λ£ŒκΉŒμ§€ μœ μ§€
  • μ‚¬μš© μ˜ˆμ‹œ (Explicit): @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
2. Prototype
  • νŠΉμ§•: Request λ§ˆλ‹€ μƒˆλ‘œμš΄ Bean instance λ₯Ό 생성
  • 생쑴 λ²”μœ„: μ΄ˆκΈ°ν™” ν›„ Spring Container κ°€ 더 이상 κ΄€λ¦¬ν•˜μ§€ μ•ŠμœΌλ©°, μ†Œλ©Έ λ©”μ„œλ“œλ„ ν˜ΈμΆœλ˜μ§€ μ•ŠμŒ
  • μ‚¬μš© μ˜ˆμ‹œ: @Scope(ConfigurableBeanFactory.SCOPE_PROTOT) or @Scope("prototype")
3. Request
  • νŠΉμ§•: HTTP Request λ§ˆλ‹€ μƒˆλ‘œμš΄ Bean instance λ₯Ό 생성, 였직 Web App μ—μ„œλ§Œ μ‚¬μš©λ¨
  • 생쑴 λ²”μœ„: μš”μ²­μ΄ 끝날 λ•ŒκΉŒμ§€ μœ μ§€
  • μ‚¬μš© μ˜ˆμ‹œ: @Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS)
4. Session
  • νŠΉμ§•: HTTP session λ§ˆλ‹€ μƒˆλ‘œμš΄ Bean instance λ₯Ό 생성, μ—­μ‹œ Web App μ—μ„œλ§Œ μ‚¬μš©λ¨
  • 생쑴 λ²”μœ„: μ„Έμ…˜ μ’…λ£Œ μ‹œκΉŒμ§€ μœ μ§€
  • μ‚¬μš© μ˜ˆμ‹œ: @Scope("session")
5. Application
  • νŠΉμ§•: ServletContext의 생λͺ… μ£ΌκΈ° λ™μ•ˆ 단일 instance λ₯Ό μœ μ§€, μ—­μ‹œ Web App μ—μ„œλ§Œ μ‚¬μš©λ¨
  • 생쑴 λ²”μœ„: Web Application μ’…λ£Œ μ‹œκΉŒμ§€ μœ μ§€
  • μ‚¬μš© μ˜ˆμ‹œ: @Scope("application")
6. WebSocket
  • νŠΉμ§•: WebSocket μ—°κ²°λ§ˆλ‹€ μƒˆλ‘œμš΄ Bean instance λ₯Ό 생성, μ—­μ‹œ Web App μ—μ„œλ§Œ μ‚¬μš©λ¨
  • 생쑴 λ²”μœ„: WebSocket μ—°κ²° μ’…λ£Œ μ‹œκΉŒμ§€ μœ μ§€
Bean Scope - Test

scope λ₯Ό μ–΄λ–»κ²Œ μ„€μ •ν•˜λŠλƒμ— λ”°λΌμ„œ μ‹€μ œ Bean instance κ°€ μ–΄λ–»κ²Œ μƒμ„±λ˜λŠ”μ§€λ₯Ό ν…ŒμŠ€νŠΈν•΄λ³΄μž.

λ¨Όμ € μ•„λž˜μ™€ 같이 좔가적인 field λ₯Ό μƒμ„±ν•˜κ³ , 이λ₯Ό Qualifier λ₯Ό ν†΅ν•˜μ—¬ footballCoach 의 Bean 을 Injection λ°›λŠ” κ²ƒμœΌλ‘œ ν•˜μž.

// define a private field for the dependency  
private Coach myCoach;  
private Coach anotherCoach;  
  
// define a constructor for dependency injection  
@Autowired  
public DemoController(  
        @Qualifier("footballCoach") Coach theCoach,  
        @Qualifier("footballCoach") Coach theAnotherCoach) {  
    System.out.println("In constructor: " + getClass().getSimpleName());  
    myCoach = theCoach;  
    anotherCoach = theAnotherCoach;  
}

그리고 μ•„λž˜μ™€ 같이, 두 개의 field κ°€ 같은 Bean instance λ₯Ό reference ν•˜λŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜λŠ” ν…ŒμŠ€νŠΈ endpoint λ₯Ό ν•˜λ‚˜ μ„€μ •ν•΄λ‘μ—ˆλ‹€.

@GetMapping("/check")  
public String check() {  
    return "Comparing beans: myCoach == anotherCoach -> " + (myCoach == anotherCoach);  
}

μš°μ„  Default Scope μ—μ„œλŠ” singleton pattern 을 μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— true 둜 λ‚˜μ˜¬ 것이닀.

μ˜ˆμƒλŒ€λ‘œ 잘 λ‚˜μ˜¨ 것을 λ³Ό 수 μžˆλ‹€. μ΄λ²ˆμ—λŠ” Prototype Scope 둜 μ„€μ •ν•˜μ—¬ ν…ŒμŠ€νŠΈν•΄λ³΄μž. Prototype 은 Request λ§ˆλ‹€ μƒˆλ‘œμš΄ Bean instance κ°€ μƒμ„±λ˜λ―€λ‘œ false κ°€ λ‚˜μ˜¬ 것이닀.

μ˜ˆμƒλŒ€λ‘œ false κ°€ 잘 λ‚˜μ˜¨ 것을 λ³Ό 수 μžˆλ‹€.