λΉ μ€μ½ν
λΉμ΄ μ‘΄μ¬ν μ μλ λ²μ. @Scope("prototype")
λ‘ μ§μ κ°λ₯
- μ±κΈν€ : κΈ°λ³Έ μ€μ½νλ‘ μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό μ’ λ£κΉμ§ μ μ§ λ¨
- νλ‘ν νμ
: μ€νλ§ μ»¨ν
μ΄λλ νλ‘ν νμ
λΉμ μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ
κΉμ§λ§ κ΄μ¬νκ³ λλ κ΄λ¦¬νμ§ μλ λ§€μ° μ§§μ λ²μμ μ€μ½ν
- ν΄λΌμ΄μΈνΈμ λΉμ λ°ννκ³ , μ΄ν μ€νλ§ μ»¨ν
μ΄λλ μμ±λ νλ‘ν νμ
λΉμ κ΄λ¦¬νμ§ μλλ€. νλ‘ν νμ
λΉμ κ΄λ¦¬ν μ±
μμ νλ‘ν νμ
λΉμ λ°μ ν΄λΌμ΄μΈνΈμ μλ€. κ·Έλμ
@PreDestroy
κ°μ μ’ λ£ λ©μλκ° νΈμΆλμ§ μλλ€.
- ν΄λΌμ΄μΈνΈμ λΉμ λ°ννκ³ , μ΄ν μ€νλ§ μ»¨ν
μ΄λλ μμ±λ νλ‘ν νμ
λΉμ κ΄λ¦¬νμ§ μλλ€. νλ‘ν νμ
λΉμ κ΄λ¦¬ν μ±
μμ νλ‘ν νμ
λΉμ λ°μ ν΄λΌμ΄μΈνΈμ μλ€. κ·Έλμ
- μΉ κ΄λ ¨ μ€μ½ν
- request: μΉ μμ²μ΄ λ€μ΄μ€κ³ λκ°λ κΉμ§ μ μ§λλ μ€μ½ν
- session: μΉ μΈμ μ΄ μμ±λκ³ μ’ λ£λ λ κΉμ§ μ μ§λλ μ€μ½ν
- application: μΉμ μλΈλ¦Ώ 컨ν μ€νΈμ κ°μ λ²μλ‘ μ μ§λλ μ€μ½ν
μ±κΈν€ λΉμμ νλ‘ν νμ λΉ μ¬μ© μ λ¬Έμ
μ€νλ§μ μΌλ°μ μΌλ‘ μ±κΈν€ λΉμ μ¬μ©νλ―λ‘, μ±κΈν€ λΉμ΄ νλ‘ν νμ λΉμ μ¬μ©νκ² λλ€. κ·Έλ°λ° μ±κΈν€ λΉμ μμ± μμ μλ§ μμ‘΄κ΄κ³ μ£Όμ μ λ°κΈ° λλ¬Έμ, νλ‘ν νμ λΉμ΄ μλ‘ μμ±λκΈ°λ νμ§λ§, μ±κΈν€ λΉκ³Ό ν¨κ» κ³μ μ μ§λλ κ²μ΄ λ¬Έμ λ€.
μλ§ μνλ κ²μ΄ μ΄λ° κ²μ μλ κ²μ΄λ€. νλ‘ν νμ λΉμ μ£Όμ μμ μλ§ μλ‘ μμ±νλκ² μλλΌ, μ¬μ©ν λ λ§λ€ μλ‘ μμ±ν΄μ μ¬μ©νλ κ²μ μν κ²μ΄λ€.
Providerλ₯Ό μ¬μ©ν΄λΌ
μ±κΈν€ λΉκ³Ό νλ‘ν νμ λΉμ ν¨κ» μ¬μ©ν λ, μ΄λ»κ² νλ©΄ μ¬μ©ν λ λ§λ€ νμ μλ‘μ΄ νλ‘ν νμ λΉμ μμ±ν μ μμκΉ?
1. μ€νλ§ μ»¨ν μ΄λμ μμ²
public int logic() {
PrototypeBean prototypeBean = ac.getBean(PrototypeBean.class); // λ°λ‘ λ°λ‘ κ°μ Έμ΄
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
μ΄λ°μμΌλ‘ μμ‘΄κ΄κ³λ₯Ό μΈλΆμμ μ£Όμ (DI) λ°λκ² μλλΌ μ΄λ κ² μ§μ νμν μμ‘΄κ΄κ³λ₯Ό μ°Ύλ κ²μ Dependency Lookup (DL) μμ‘΄κ΄κ³ μ‘°ν(νμ) μ΄λΌνλ€.
κ·Έλ°λ°, μ΄λ κ² μ€νλ§μ μ ν리μΌμ΄μ 컨ν μ€νΈ μ 체λ₯Ό μ£Όμ λ°κ² λλ©΄, μ€νλ§ μ»¨ν μ΄λμ μ’ μμ μΈ μ½λκ° λκ³ , λ¨μ ν μ€νΈλ μ΄λ €μμ§λ€.
2. ObjectFactory, ObjectProvider
μ§μ ν λΉμ 컨ν μ΄λμμ λμ μ°Ύμμ£Όλ DL μλΉμ€λ₯Ό μ 곡νλ κ²μ΄ λ°λ‘ ObjectProvider μ΄λ€. μ°Έκ³ λ‘ ObjectFactoryμ νΈμ κΈ°λ₯μ μΆκ°ν΄μ ObjectProvider κ° λ§λ€μ΄μ‘λ€.
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject(); // λΉ λ°ν
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
- ObjectFactory: κΈ°λ₯μ΄ λ¨μ, λ³λμ λΌμ΄λΈλ¬λ¦¬ νμ μμ, μ€νλ§μ μμ‘΄
- ObjectProvider: ObjectFactory μμ, μ΅μ , μ€νΈλ¦Ό μ²λ¦¬λ± νΈμ κΈ°λ₯μ΄ λ§κ³ , λ³λμ λΌμ΄λΈλ¬λ¦¬ νμ μμ, μ€νλ§μ μμ‘΄
3. JSR-330 Provider
λ§μ§λ§ λ°©λ²μ javax.inject.Provider λΌλ JSR-330 μλ° νμ€μ μ¬μ©νλ λ°©λ²μ΄λ€.
μ΄ λ°©λ²μ μ¬μ©νλ €λ©΄ javax.inject:javax.inject:1 λΌμ΄λΈλ¬λ¦¬λ₯Ό gradleμ μΆκ°ν΄μΌ νλ€.
//implementation 'javax.inject:javax.inject:1' gradle μΆκ° νμ @Autowired
private Provider<PrototypeBean> provider;
public int logic() {
PrototypeBean prototypeBean = provider.get();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
μ°Έκ³ : μ€λ¬΄μμ μλ° νμ€μΈ JSR-330 Providerλ₯Ό μ¬μ©ν κ²μΈμ§, μλλ©΄ μ€νλ§μ΄ μ 곡νλ ObjectProviderλ₯Ό μ¬μ©ν κ²μΈμ§ κ³ λ―Όμ΄ λ κ²μ΄λ€. ObjectProviderλ DLμ μν νΈμ κΈ°λ₯μ λ§μ΄ μ 곡ν΄μ£Όκ³ μ€νλ§ μΈμ λ³λμ μμ‘΄κ΄κ³ μΆκ°κ° νμ μκΈ° λλ¬Έμ νΈλ¦¬νλ€.
λ§μ½(μ λ§ κ·Έλ΄μΌμ κ±°μ μκ² μ§λ§) μ½λλ₯Ό μ€νλ§μ΄ μλ λ€λ₯Έ 컨ν μ΄λμμλ μ¬μ©ν μ μμ΄μΌ νλ€λ©΄ JSR-330 Providerλ₯Ό μ¬μ©ν΄μΌνλ€.
μ€νλ§μ μ¬μ©νλ€ λ³΄λ©΄ μ΄ κΈ°λ₯ λΏλ§ μλλΌ λ€λ₯Έ κΈ°λ₯λ€λ μλ° νμ€κ³Ό μ€νλ§μ΄ μ 곡νλ κΈ°λ₯μ΄ κ²ΉμΉ λκ° λ§μ΄ μλ€.
λλΆλΆ μ€νλ§μ΄ λ λ€μνκ³ νΈλ¦¬ν κΈ°λ₯μ μ 곡ν΄μ£ΌκΈ° λλ¬Έμ, νΉλ³ν λ€λ₯Έ 컨ν μ΄λλ₯Ό μ¬μ©ν μΌμ΄ μλ€λ©΄, μ€νλ§μ΄ μ 곡νλ κΈ°λ₯μ μ¬μ©νλ©΄ λλ€.
μΉ μ€μ½ν
- μΉ μ€μ½νλ μΉ νκ²½μμλ§ λμνλ€.
- μΉ μ€μ½νλ νλ‘ν νμ κ³Ό λ€λ₯΄κ² μ€νλ§μ΄ ν΄λΉ μ€μ½νμ μ’ λ£μμ κΉμ§ κ΄λ¦¬νλ€. λ°λΌμ μ’ λ£ λ©μλκ° νΈμΆλλ€.
request μ€μ½νμ νλ‘μ
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {}
proxyMode : μ μ© λμμ΄ μΈν°νμ΄μ€κ° μλ ν΄λμ€λ©΄ TARGET_CLASS λ₯Ό μ ν. μ μ© λμμ΄ μΈν°νμ΄μ€λ©΄ INTERFACES λ₯Ό μ ν
μ΄λ κ² νλ©΄ κ°μ§ νλ‘μ ν΄λμ€λ₯Ό λ§λ€μ΄λκ³ HTTP requestμ μκ΄ μμ΄ κ°μ§ νλ‘μ ν΄λμ€λ₯Ό λ€λ₯Έ λΉμ 미리 μ£Όμ ν΄ λ μ μλ€.
λ°©λ² : CGLIB
λΌλ λΌμ΄λΈλ¬λ¦¬λ‘ λ΄ ν΄λμ€λ₯Ό μμ λ°μ κ°μ§ νλ‘μ κ°μ²΄λ₯Ό λ§λ€μ΄μ μ£Όμ
νλ€
κ°μ§ νλ‘μ κ°μ²΄λ μμ²μ΄ μ€λ©΄ κ·Έλ λ΄λΆμμ μ§μ§ λΉμ μμ²νλ μμ λ‘μ§μ΄ λ€μ΄μλ€.
- κ°μ§ νλ‘μ κ°μ²΄λ λ΄λΆμ μ§μ§ myLoggerλ₯Ό μ°Ύλ λ°©λ²μ μκ³ μλ€.
- ν΄λΌμ΄μΈνΈκ° myLogger.logic()μ νΈμΆνλ©΄ μ¬μ€μ κ°μ§ νλ‘μ κ°μ²΄μ λ©μλλ₯Ό νΈμΆν κ²μ΄λ€. κ°μ§ νλ‘μ κ°μ²΄λ request μ€μ½νμ μ§μ§ myLogger.logic() λ₯Ό νΈμΆνλ€.
- κ°μ§ νλ‘μ κ°μ²΄λ μλ³Έ ν΄λμ€λ₯Ό μμ λ°μμ λ§λ€μ΄μ‘κΈ° λλ¬Έμ μ΄ κ°μ²΄λ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈ μ μ₯μμλ μ¬μ€ μλ³ΈμΈμ§ μλμ§λ λͺ¨λ₯΄κ², λμΌνκ² μ¬μ©ν μ μλ€(λ€νμ±)
μ¬μ€ Providerλ₯Ό μ¬μ©νλ , νλ‘μλ₯Ό μ¬μ©νλ ν΅μ¬ μμ΄λμ΄λ μ§μ§ κ°μ²΄ μ‘°νλ₯Ό κΌ νμν μμ κΉμ§ μ§μ°μ²λ¦¬ νλ€λ μ μ΄λ€.