λΉ μ€μ½ν
π‘ λΉ μ€μ½ν
* μ€νλ§ λΉμ μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό ν¨κ» μμ±λμ΄μ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λ κΉμ§ μ μ§λλ€
-> μ΄κ²μ μ€νλ§ λΉμ΄ κΈ°λ³Έμ μΌλ‘ μ±κΈν€ μ€μ½νλ‘ μμ±λκΈ° λλ¬Έμ΄λ€
- μ€μ½ν : μ€νλ§ λΉμ΄ μ‘΄μ¬ν μ μλ λ²μλ₯Ό λ§νλ€
1. μ±κΈν€ : κΈ°λ³Έ μ€μ½ν, μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό μ’ λ£κΉμ§ μ μ§λλ κ°μ₯ λμ λ²μμ μ€μ½νμ΄λ€
2. νλ‘ν νμ : μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ κΉμ§λ§ κ΄μ¬νκ³
λλ κ΄λ¦¬νμ§ μλ λ§€μ° μ§§μ λ²μμ μ€μ½νμ΄λ€
3. μΉ κ΄λ ¨ μ€μ½ν
- request : μΉ μμ²μ΄ λ€μ΄μ€κ³ λκ°λ κΉμ§ μ μ§λλ μ€μ½ν
- session : μΉ μΈμ μ΄ μμ±λκ³ μ’ λ£λ λ κΉμ§ μ μ§λλ μ€μ½ν
- application : μΉμ μλΈλ¦Ώ 컨ν μ€νΈμ κ°μ λ²μλ‘ μ μ§λλ μ€μ½ν
π‘ μ€μ½ν μ§μ
β μ»΄ν¬λνΈ μ€μΊ μλ λ±λ‘
@Scope("prototype")
@Component
public class HelloBean {}
β μλ λ±λ‘
@Scope("prototype")
@Bean
PrototypeBean HelloBean() {
return new HelloBean();
}
π‘ νλ‘ν νμ μ€μ½ν
- μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ , κ·Έλ¦¬κ³ μ΄κΈ°νκΉμ§λ§ μ§ννλ νΉλ³ν μ€μ½ν
- μ±κΈν€ μ€μ½νμ λΉκ³Όλ λ€λ₯΄κ² νλ‘ν νμ μ€μ½νλ₯Ό μ€νλ§ μ»¨ν μ΄λμ μ‘°ννλ©΄ μ€νλ§ μ»¨ν μ΄λλ
νμ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ λ°ννλ€
* μ±κΈν€ μ€μ½νμ λΉμ μ‘°ννλ©΄ μ€νλ§ μ»¨ν μ΄λλ νμ κ°μ μΈμ€ν΄μ€μ μ€νλ§ λΉμ λ°ννλ€
1. νλ‘ν νμ μ€μ½νμ λΉμ μ€νλ§ μ»¨ν μ΄λμ μμ²νλ€
2. μ€νλ§ μ»¨ν μ΄λλ μ΄ μμ μ νλ‘ν νμ λΉμ μμ±νκ³ , νμν μμ‘΄κ΄κ³λ₯Ό μ£Όμ νλ€.
3. μ€νλ§ μ»¨ν μ΄λλ μμ±ν νλ‘ν νμ λΉμ ν΄λΌμ΄μΈνΈμ λ°ννλ€.
4. μ΄νμ μ€νλ§ μ»¨ν μ΄λμ κ°μ μμ²μ΄ μ€λ©΄ νμ μλ‘μ΄ νλ‘ν νμ λΉμ μμ±ν΄μ λ°ννλ€.
π μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±νκ³ , μμ‘΄κ΄κ³ μ£Όμ , μ΄κΈ°νκΉμ§λ§ μ²λ¦¬νλ€
μ΄ν, μ€νλ§ μ»¨ν μ΄λλ μμ±λ νλ‘ν νμ λΉμ κ΄λ¦¬νμ§ μλλ€. <- λΉμ λ°μ ν΄λΌμ΄μΈνΈκ° κ΄λ¦¬νλ€
=> @PreDestroyκ°μ μ’ λ£ λ©μλκ° νΈμΆλμ§ μλλ€
βοΈ - μ±κΈν€ λΉμ μ€νλ§ μ»¨ν μ΄λ μμ± μμ μ μ΄κΈ°ν λ©μλ μ€νλμ§λ§,
νλ‘ν νμ μ€μ½νμ λΉμ μ€νλ§ μ»¨ν μ΄λμμ λΉμ μ‘°νν λ μμ±λκ³ , μ΄κΈ°ν λ©μλλ μ€νλλ€
- μ±κΈν€ λΉμ μ€νλ§ μ»¨ν μ΄λκ° κ΄λ¦¬νκΈ° λλ¬Έμ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λ λΉμ μ’ λ£ λ©μλκ° μ€νλμ§λ§,
νλ‘ν νμ μ€μ½νμ λΉμ μ€νλ§ μ»¨ν μ΄λκ° μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ κ·Έλ¦¬κ³ μ΄κΈ°ν κΉμ§λ§ κ΄μ¬νκ³ , κ΄μ¬X
=> νλ‘ν νμ λΉμ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λ @PreDestroyκ°μ μ’ λ£ λ©μλκ° μ€νλμ§ μλλ€
π νλ‘ν νμ λΉμ νΉμ§ μ 리
- μ€νλ§ μ»¨ν μ΄λμ μμ²ν λ λ§λ€ μλ‘ μμ±λλ€
- μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ κ·Έλ¦¬κ³ μ΄κΈ°νκΉμ§λ§ κ΄μ¬νλ€
- μ’ λ£ λ©μλκ° νΈμΆλμ§ μλλ€
- λλ¬Έμ νλ‘ν νμ λΉμ νλ‘ν νμ λΉμ μ‘°νν ν΄λΌμ΄μΈνΈκ° κ΄λ¦¬ν΄μΌ νλ€
+ μ’ λ£ λ©μλμ λν νΈμΆλ ν΄λΌμ΄μΈνΈκ° μ§μ ν΄μΌνλ€.
π‘ νλ‘ν νμ μ€μ½ν - μ±κΈν€ λΉκ³Ό ν¨κ» μ¬μ©μ λ¬Έμ μ
- νλ‘ν νμ λΉμ μμ²νλ©΄ νμ μλ‘μ΄ κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ λ°ννλ€ νμ§λ§ μ±κΈν€ λΉκ³Ό ν¨κ» μ¬μ©ν λ
λ¬Έμ μ μ΄ λ°μν μ μλ€
β μ±κΈν€ λΉμμ νλ‘ν νμ λΉ μ¬μ©
- clientBeanμ΄λΌλ μ±κΈν€ λΉμ΄ μμ‘΄κ΄κ³ μ£Όμ μ ν΅ν΄ νλ‘ν νμ λΉμ μ£Όμ λ°μμ μ¬μ©νλ μ
* clientBeanμ μ±κΈν€μ΄λ―λ‘, λ³΄ν΅ μ€νλ§ μ»¨ν μ΄λ μμ± μμ μ ν¨κ» μμ±λκ³ , μμ‘΄κ΄κ³ μ£Όμ λ λ°μνλ€
1. clientBeanμ μμ‘΄κ΄κ³ μλ μ£Όμ μ μ¬μ©νλ€. μ£Όμ μμ μ μ€νλ§ μ»¨ν μ΄λμ νλ‘ν νμ λΉμ μμ²νλ€
2. μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±ν΄μ clientBeanμ λ°ννλ€. νλ‘ν νμ λΉμ count νλ κ°μ 0μ΄λ€
-> μ΄μ clientBeanμ νλ‘ν νμ λΉμ λ΄λΆ νλμ 보κ΄νλ€ (μ ννλ μ°Έμ‘°κ°μ 보κ΄νλ€)
- ν΄λΌμ΄μΈνΈAλ clientBeanμ μ€νλ§ μ»¨ν μ΄λμ μμ²ν΄μ λ°λλ€. μ±κΈν€μ΄λ―λ‘ νμ κ°μ clientBeanμ΄ λ°νλλ€
3. ν΄λΌμ΄μΈνΈAλ clientBean.logic()μ νΈμΆνλ€
4. clientBeanμ prototypeBeanμ addCount()λ₯Ό νΈμΆν΄μ νλ‘ν νμ λΉμ countλ₯Ό μ¦κ°νλ€ -> countκ°μ΄ 1μ΄ λλ€
- ν΄λΌμ΄μΈνΈBλ clientBeanμ μ€νλ§ μ»¨ν μ΄λμ μμ²ν΄μ λ°λλ€ -> μ±κΈν€μ΄λ―λ‘ νμ κ°μ clientBeanμ΄ λ°νλλ€
βοΈ clientBeanμ΄ λ΄λΆμ κ°μ§κ³ μλ νλ‘ν νμ λΉμ μ΄λ―Έ κ³Όκ±°μ μ£Όμ μ΄ λλ λΉμ΄λ€.
μ£Όμ μμ μ μ€νλ§ μ»¨ν μ΄λμ μμ²ν΄μ νλ‘ν νμ λΉμ΄ μλ‘ μμ±μ΄ λ κ²μ΄μ§,
μ¬μ© ν λλ§λ€ μλ‘ μμ±λλ κ²μ΄ μλλ€!
5. ν΄λΌμ΄μΈνΈBλ clientBean.logic()μ νΈμΆνλ€
6. clientBeanμ prototypeBeanμ addCount()λ₯Ό νΈμΆν΄μ νλ‘ν νμ λΉμ countλ₯Ό μ¦κ°νλ€
-> μλ count κ°μ΄ 1μ΄μμΌλ―λ‘ 2κ° λλ€
* μ€νλ§μ μΌλ°μ μΌλ‘ μ±κΈν€ λΉμ μ¬μ©νλ―λ‘, μ±κΈν€ λΉμ΄ νλ‘ν νμ λΉμ μ¬μ©νκ² λλ€
κ·Έλ°λ° μ±κΈν€ λΉμ μμ± μμ μλ§ μμ‘΄κ΄κ³λ₯Ό μ£Όμ λ°κΈ° λλ¬Έμ, νλ‘ν νμ λΉμ΄ μλ‘ μμ±λκΈ°λ νμ§λ§,
ν¨κ» κ³μ μ μ§λλ κ²μ΄ λ¬Έμ λ€
=> νλ‘ν νμ λΉμ μ£Όμ μμ μλ§ μλ‘ μμ±νλκ² μλλΌ, μ¬μ©ν λ λ§λ€ μλ‘ μμ±ν΄μ μ¬μ©νλ κ²μ μνλ€
βοΈ μ¬λ¬ λΉμμ κ°μ νλ‘ν νμ λΉμ μ£Όμ λ°μΌλ©΄, μ£Όμ λ°λ μμ μ κ°κ° μλ‘μ΄ νλ‘ν νμ λΉμ΄ μμ±λλ€
π‘ Providerλ‘ λ¬Έμ ν΄κ²°
- μ±κΈν€ λΉκ³Ό νλ‘ν νμ λΉμ ν¨κ» μ¬μ©ν λ, μ¬μ©ν λ λ§λ€ νμ μλ‘μ΄ νλ‘ν νμ λΉμ μμ±νλ λ°©λ²
1. κ°μ₯ κ°λ¨ν λ°©λ²μ μ±κΈν€ λΉμ΄ νλ‘ν νμ μ μ¬μ©ν λλ§λ€ μ€νλ§ μ»¨ν μ΄λμ μλ‘ μμ²νλ κ²
* ClientBean ν΄λμ€
@Autowired
private ApplicationContext ac;
public int logic() {
PrototypeBean prototypeBean = ac.getBean(PrototypeBean.class);
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
- ac.getBean()μ ν΅ν΄ νμ μλ‘μ΄ νλ‘ν νμ λΉμ΄ μμ±λλ€
- μμ‘΄κ΄κ³λ₯Ό μΈλΆμμ μ£Όμ (DI) λ°λκ² μλλΌ μ΄λ κ²
μ§μ νμν μμ‘΄κ΄κ³λ₯Ό μ°Ύλ κ²μ Dependency Lookup (DL) μμ‘΄κ΄κ³ μ‘°ν(νμ) μ΄λΌνλ€
- νμ§λ§ μ΄λ κ² μ€νλ§μ μ ν리μΌμ΄μ 컨ν μ€νΈ μ 체λ₯Ό μ£Όμ λ°κ² λλ©΄, μ€νλ§ μ»¨ν μ΄λμ μ’ μμ μΈ μ½λκ° λκ³ ,
λ¨μ ν μ€νΈλ μ΄λ €μμ§λ€
2. ObjectFactory, ObjectProvider
- μ§μ ν λΉμ 컨ν μ΄λμμ λμ μ°Ύμμ£Όλ DL μλΉμ€λ₯Ό μ 곡νλ ObjectProvider
κ³Όκ±° ObjectFactoryμμ νΈμκΈ°λ₯μ΄ μΆκ°λ ObjectProviderμ΄λ€
- ObjectFactory : κΈ°λ₯μ΄ λ¨μ, λ³λμ λΌμ΄λΈλ¬λ¦¬ νμ μμ, μ€νλ§μ μμ‘΄
- ObjectProvider : ObjectFactory μμ, μ΅μ , μ€νΈλ¦Ό μ²λ¦¬λ± νΈμ κΈ°λ₯μ΄ λ§κ³ , λ³λμ λΌμ΄λΈλ¬λ¦¬ νμX, μ€νλ§μ μμ‘΄
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
- prototypeBeanProvider.getObject() ν΅ν΄μ νμ μλ‘μ΄ νλ‘ν νμ λΉμ΄ μμ±λλ€
- ObjectProviderμ getObject()λ₯Ό νΈμΆνλ©΄ λ΄λΆμμλ μ€νλ§ μ»¨ν μ΄λλ₯Ό ν΅ν΄ ν΄λΉ λΉμ μ°Ύμ λ°ννλ€(DL)
- ObjectProviderλ λ± νμν DL μ λμ κΈ°λ₯λ§ μ 곡νλ€
π μ 리
νλ‘ν νμ λΉμ μΈμ μ¬μ©ν κΉ -> λ§€λ² μ¬μ©ν λ λ§λ€ μμ‘΄κ΄κ³ μ£Όμ μ΄ μλ£λ μλ‘μ΄ κ°μ²΄κ° νμνλ©΄ μ¬μ©νμ
κ·Έλ°λ° λ³΄ν΅ μ±κΈν€ λΉμΌλ‘ λλΆλΆμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκΈ° λλ¬Έμ νλ‘ν νμ λΉμ μ§μ μ μΌλ‘ μ¬μ©νλ μΌμ λλ¬Όλ€
π‘ μΉ μ€μ½ν
- μΉ νκ²½μμλ§ λμνλ€
- νλ‘ν νμ κ³Ό λ€λ₯΄κ² μ€νλ§μ΄ ν΄λΉ μ€μ½νμ μ’ λ£μμ κΉμ§ κ΄λ¦¬νλ€ -> μ’ λ£ λ©μλκ° νΈμΆλλ€
- request : HTTP μμ² νλκ° λ€μ΄μ€κ³ λκ° λ κΉμ§ μ μ§λλ μ€μ½ν
: κ°κ°μ HTTP μμ²λ§λ€ λ³λμ λΉ μΈμ€ν΄μ€κ° μμ±λκ³ κ΄λ¦¬λλ€
- session : HTTP Sessionκ³Ό λμΌν μλͺ μ£ΌκΈ°λ₯Ό κ°μ§λ μ€μ½ν
- application : μλΈλ¦Ώ 컨ν μ€νΈ(ServletContext)μ λμΌν μλͺ μ£ΌκΈ°λ₯Ό κ°μ§λ μ€μ½ν
- websocket : μΉ μμΌκ³Ό λμΌν μλͺ μ£ΌκΈ°λ₯Ό κ°μ§λ μ€μ½ν
-