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 κ° μ λμ¨ κ²μ λ³Ό μ μλ€.