[Spring κΈ°λ³Έ] 9. λΉ μ€μ½ν
μλ νμΈμ!
λλμ΄ λ§μ§λ§ μΉμ μ λλ€!
κ·ΈλΌ λ°λ‘ μμν΄λ³Όκ²μ κ³ κ³ !!

1. λΉ μ€μ½νλ..?
μ§κΈκΉμ§ μ€νλ§ λΉμ΄ μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό ν¨κ» μμ±λμ΄μ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λκΉμ§ μ μ§λλ€κ³ 곡λΆνμ΅λλ€.
μ΄κ²μ μ€νλ§ λΉμ΄ κΈ°λ³Έμ μΌλ‘ μ±κΈν€ μ€μ½νλ‘ μμ±λκΈ° λλ¬Έμ λλ€.
μ€μ½νλ λ²μ κ·Έλλ‘ λΉμ΄ μ‘΄μ¬ν μ μλ λ²μλ₯Ό λ»ν©λλ€.
μ€νλ§μ λ€μκ³Ό κ°μ λ€μν μ€μ½νλ₯Ό μ§μν©λλ€.
- μ±κΈν€: κΈ°λ³Έ μ€μ½νμ λλ€. μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό μ’ λ£κΉμ§ μ μ§λλ κ°μ₯ λμ λ²μμ μ€μ½νμ λλ€.
- νλ‘ν νμ : μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ κΉμ§λ§ κ΄μ¬νκ³ λλ κ΄λ¦¬νμ§ μλ λ§€μ° μ§§μ λ²μμ μ€μ½νμ λλ€.
- μΉ κ΄λ ¨ μ€μ½ν
- request: μΉ μμ²μ΄ λ€μ΄μ€κ³ λκ° λκΉμ§ μ μ§λλ μ€μ½νμ λλ€.
- session: μΉ μΈμ μ΄ μμ±λκ³ μ’ λ£λ λκΉμ§ μ μ§λλ μ€μ½νμ λλ€.
- application: μΉμ μλΈλ¦Ώ 컨ν μ€νΈμ κ°μ λ²μλ‘ μ μ§λλ μ€μ½νμ λλ€.
λΉ μ€μ½νλ λ€μκ³Ό κ°μ΄ μ§μ ν μ μμ΅λλ€.
- μ»΄ν¬λνΈ μ€μΊ μλ λ±λ‘
@Scope("prototype")
@Component
public class HelloBean { }
- μλ λ±λ‘
@Scope("prototype")
@Bean
PrototypeBean HelloBean() {
return new HelloBean();
}
μ§κΈκΉμ§ μ±κΈν€ μ€μ½νλ₯Ό κ³μ μ¬μ©ν΄ 보μμΌλ, μ΄λ²μ νλ‘ν νμ μ€μ½νλΆν° νμΈν΄λ³΄κ² μ΅λλ€.

2. νλ‘ν νμ μ€μ½ν
μ±κΈν€ μ€μ½νμ λΉμ μ‘°ννλ©΄ μ€νλ§ μ»¨ν μ΄λλ νμ κ°μ μΈμ€ν΄μ€μ μ€νλ§ λΉμ λ°νν©λλ€.
λ°λ©΄μ νλ‘ν νμ μ€μ½νλ₯Ό μ€νλ§ μ»¨ν μ΄λμ μ‘°ννλ©΄ μ€νλ§ μ»¨ν μ΄λλ νμ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ λ°νν©λλ€.
2-1. μ±κΈν€ λΉ μμ² vs νλ‘ν νμ λΉ μμ²
<βμ±κΈν€ λΉ μμ² κ³Όμ β>
1. μ±κΈν€ μ€μ½νμ λΉμ μ€νλ§ μ»¨ν μ΄λμ μμ²ν©λλ€.
2. μ€νλ§ μ»¨ν μ΄λλ λ³ΈμΈμ΄ κ΄λ¦¬νλ μ€νλ§ λΉμ λ°νν©λλ€.
3. μ΄νμ μ€νλ§ μ»¨ν μ΄λμ κ°μ μμ²μ΄ μλ μ€νλ§ λΉμ λ°νν©λλ€.
<βνλ‘ν νμ λΉ μμ² κ³Όμ β>
1. νλ‘ν νμ μ€μ½νμ λΉμ μ€νλ§ μ»¨ν μ΄λμ μμ²ν©λλ€.
2. μ€νλ§ μ»¨ν μ΄λλ μ΄ μμ μ νλ‘ν νμ λΉμ μμ±νκ³ , νμν μμ‘΄κ΄κ³λ₯Ό μ£Όμ ν©λλ€.
3. μ€νλ§ μ»¨ν μ΄λλ μμ±ν νλ‘ν νμ λΉμ ν΄λΌμ΄μΈνΈμ λ°νν©λλ€.
4. μ΄νμ μ€νλ§ μ»¨ν μ΄λμ κ°μ μμ²μ΄ μ€λ©΄ νμ μλ‘μ΄ νλ‘ν νμ λΉμ μμ±ν΄μ λ°νν©λλ€.
<μ 리βοΈ>
μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±νκ³ μμ‘΄κ΄κ³ μ£Όμ κ³Ό μ΄κΈ°νκΉμ§λ§ μ²λ¦¬νλ€λ κ²μ λλ€.
ν΄λΌμ΄μΈνΈμ λΉμ λ°ννκ³ , μ΄ν μ€νλ§ μ»¨ν μ΄λλ μμ±λ νλ‘ν νμ λΉμ κ΄λ¦¬νμ§ μμ΅λλ€.
νλ‘ν νμ λΉμ κ΄λ¦¬ν μ± μμ νλ‘ν νμ λΉμ λ°μ ν΄λΌμ΄μΈνΈμ μκ³ , κ·Έλμ @PreDestroy κ°μ μ’ λ£ λ©μλκ° νΈμΆλμ§ μμ΅λλ€.
2-2. μ±κΈν€ μ€μ½ν λΉ ν μ€νΈ vs νλ‘ν νμ μ€μ½ν λΉ ν μ€νΈ
μ°μ βμ±κΈν€ μ€μ½ν λΉ ν μ€νΈβλΆν° ν΄λ³΄κ² μ΅λλ€.
testμ hello.coreμ scopeλΌλ ν¨ν€μ§λ₯Ό λ§λ€κ³ , μ΄ ν¨ν€μ§ μμ SingletonTestλΌλ ν΄λμ€λ₯Ό λ§λ€μ΄λ³΄κ² μ΅λλ€.
public class SingletonTest {
@Test
public void singletonBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class);
SingletonBean sb1 = ac.getBean(SingletonBean.class);
SingletonBean sb2 = ac.getBean(SingletonBean.class);
System.out.println("singletonBean1 = " + sb1);
System.out.println("singletonBean2 = " + sb2);
assertThat(sb1).isSameAs(sb2);
ac.close(); //μ’
λ£
}
@Scope("singleton")
static class SingletonBean {
@PostConstruct
public void init() {
System.out.println("SingletonBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("SingletonBean.destroy");
}
}
}
μ°μ λ΄λΆ ν΄λμ€λ₯Ό static classλ‘ SingletonBeanμ λ§λ€μ΄μ€λλ€.
μ μΉμ μμ νλ @PostConstructμ @PreDestroyλ μ¬μ©νμ΅λλ€. λΉ μλͺ μ£ΌκΈ° μ½λ°±μ μ§μνκΈ° μν΄μμ£ !
κ°μ₯ νΈλ¦¬νκ² μ΄κΈ°νμ μ’ λ£λ₯Ό μ€ννμμ΅λλ€.
κ·Έλ¬κ³ λ©μΈ ν μ€νΈ ν΄λμ€λ‘ κ°λ³΄κ² μ΅λλ€.
μ°μ , λ νλ κ²μ²λΌ AnnotationConfigApplicationContextλ₯Ό ν΅ν΄ SingletonBean ν΄λμ€λ₯Ό μ€μ μΌλ‘ λ±λ‘νμ¬ μ€νλ§ μ»¨ν μ΄λλ₯Ό μμ±νμ΅λλ€.
κ·Έλ¦¬κ³ , getBean() λ©μλλ‘ SingletonBeanμ 2λ² μμ²νμ΅λλ€. μ΄λ¦μ ꡬλΆλκ² sb1κ³Ό sb2λ‘ λλ΄μ΅λλ€.
λ§μ§λ§μΌλ‘, assertionsλ₯Ό ν΅ν΄ λ κ°μ²΄κ° κ°μ μΈμ€ν΄μ€μΈμ§ νμΈ μμ μ νμ΅λλ€.
κ²°κ³Όλ₯Ό ν λ² νμΈν΄λ³΄κ² μ΅λλ€.
λ λ²μ νΈμΆμλ λμΌν κ°μ²΄κ° λ°νλλ€λ κ²μ μ μ μμ΅λλ€.
μ¦, λΉ μ΄κΈ°ν λ©μλλ₯Ό μ€ννκ³ , κ°μ μΈμ€ν΄μ€μ λΉμ μ‘°ννκ³ , μ’ λ£ λ©μλκΉμ§ μ μ νΈμΆλ κ²μ νμΈν μ μμ΅λλ€.
μ΄κ²μ΄ μ±κΈν€ μ€μ½ν λΉμ νΉμ§μ λλ€!!
μ΄λ²μλ βνλ‘ν νμ μ€μ½ν λΉ ν μ€νΈβλ₯Ό ν΄λ³΄κ² μ΅λλ€.
μμ λ§λ€μλ scopeλΌλ ν¨ν€μ§ μμ PrototypeTestλΌλ ν΄λμ€λ₯Ό λ§λ€μ΄λ³΄κ² μ΅λλ€.
public class PrototypeTest {
@Test
public void prototypeBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
System.out.println("find pb1");
PrototypeBean pb1 = ac.getBean(PrototypeBean.class);
System.out.println("find pb2");
PrototypeBean pb2 = ac.getBean(PrototypeBean.class);
System.out.println("prototypeBean1 = " + pb1);
System.out.println("prototypeBean2 = " + pb2);
assertThat(pb1).isNotSameAs(pb2);
ac.close(); //μ’
λ£
}
@Scope("prototype")
static class PrototypeBean {
@PostConstruct
public void init() {
System.out.println("PrototypeBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("PrototypeBean.destroy");
}
}
}
μ°μ λ΄λΆ ν΄λμ€λ₯Ό static classλ‘ PrototypeBeanμ λ§λ€μ΄μ€λλ€.
κ·Έλ¦¬κ³ , μ΄κΈ°νμ μ’ λ£ λ©μλλ₯Ό νΈνκ² μ€ννκΈ° μν΄ μμμ²λΌ @PostConstructμ @PreDestroyλ₯Ό μ¬μ©νμ΅λλ€.
@Scope("prototype")μ λΉμ΄ μμ²ν λλ§λ€ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ€λ μλ―Έμ λλ€.
κ·Έλ¦¬κ³ , μ΄κΈ°νμ μ’ λ£κ° μ λλ©΄ init λ©μλμ destroy λ©μλλ μ μ€νμ΄ λμ΄μ prototypeBean.initκ³Ό PrototypeBean.destroyκ° μΆλ ₯μ΄ λμ΄μΌ ν©λλ€.
λ©μΈ ν μ€νΈ ν΄λμ€λ‘ κ°λ³΄κ² μ΅λλ€.
μ°μ , λ νλ κ²μ²λΌ AnnotationConfigApplicationContextλ₯Ό ν΅ν΄ PrototypeBean ν΄λμ€λ₯Ό μ€μ μΌλ‘ λ±λ‘νμ¬ μ€νλ§ μ»¨ν μ΄λλ₯Ό μμ±νμ΅λλ€.
κ·Έλ¦¬κ³ , pb1μ΄λΌλ μ΄λ¦μΌλ‘ 첫 λ²μ§Έ prototypeBean κ°μ²΄λ₯Ό κ°μ Έμ΅λλ€. μ΄ μμ μ λΉμ΄ μλ‘ μμ±λ©λλ€.
κ·Έ λ€μ, pb2λΌλ μ΄λ¦μΌλ‘ λ λ€λ₯Έ prototypeBean κ°μ²΄λ₯Ό κ°μ Έμ΅λλ€. prototype μ€μ½νμ΄λ―λ‘ μλ‘μ΄ μΈμ€ν΄μ€κ° μμ±λ©λλ€.
νλ‘ν νμ μ€μ½ν λΉμ μ€νλ§ μ»¨ν μ΄λμμ λΉμ μ‘°νν λλ§λ€ μμ±λκ³ , μ΄κΈ°ν λ©μλλ κ·Έ λ κ°μ΄ μ€νλκΈ° λλ¬Έμ νλ‘ν νμ λΉμ 2λ² μ‘°ννλ©΄ μ΄κΈ°νλ 2λ² μ€νλ©λλ€.
κ·Έλ¬κ³ λμ λ κ°μ²΄κ° μλ‘ λ€λ₯Έ κ°μ²΄μΈμ§ assertThat(pb1).isNotSameAs(pb2);λ₯Ό ν΅ν΄ κ²μ¦ν©λλ€.
κ²°κ³Όλ₯Ό ν λ² νμΈν΄λ³΄κ² μ΅λλ€.
μ±κΈν€ μ€μ½ν λΉ ν μ€νΈ λλμ λ€λ₯Έ κ²°κ³Όκ° λμμ΅λλ€.
μ°μ 보면, νμ€ν λ€λ₯Έ κ°μ²΄λΌλ κ²μ΄ λ§μ§λ§ λ μ€μ 보μ λλ€.
κ·Έλ¬κ³ 보면 μ΄κΈ°νλ λμλλ° μ’ λ£κ° μ λμλ€λ κ²μ νμΈν μ μμ΅λλ€.
destroy λ©μλκ° μ μ€νμ΄ μ λμμκΉμ??π€
βprototype μ€μ½ν λΉμ 컨ν μ΄λκ° destroy()λ₯Ό μλμΌλ‘ νΈμΆνμ§ μμ΅λλ€.β
μ€νλ§ μ»¨ν μ΄λκ° μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬νμ§ μκΈ° λλ¬Έμ΄μ£ .
μ’ λ£κ° νμνλ€λ©΄ destroy()λ₯Ό μλμΌλ‘ νΈμΆνκ±°λ, λ³λλ‘ κ΄λ¦¬νλ λ‘μ§μ λ§λ€μ΄μΌ ν©λλ€.
2-3. μ±κΈν€ μ€μ½ν λΉκ³Ό νλ‘ν νμ μ€μ½ν λΉμ μ°¨μ΄μ μ 리
- μ±κΈν€ μ€μ½ν λΉ
- μ€νλ§ μ»¨ν μ΄λ μμ± μμ μ μ΄κΈ°ν λ©μλ μ€νλ©λλ€.
- μ€νλ§ μ»¨ν μ΄λκ° κ΄λ¦¬νκΈ° λλ¬Έμ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λ λΉμ μ’ λ£ λ©μλκ° μ€νλ©λλ€.
- νλ‘ν νμ
μ€μ½ν λΉ
- μ€νλ§ μ»¨ν μ΄λμμ λΉμ μ‘°νν λ μμ±λκ³ , κ·Έ λ μ΄κΈ°ν λ©μλλ μ€νλ©λλ€.
- μ€νλ§ μ»¨ν μ΄λκ° μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ κ³Ό μ΄κΈ°νκΉμ§λ§ κ΄μ¬νκ³ λλ κ΄λ¦¬νμ§ μκΈ° λλ¬Έμ, μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λ @PreDestroy κ°μ μ’ λ£ λ©μλλ μ ν μ€νλμ§ μμ΅λλ€.
- κ·Έλμ νλ‘ν νμ
λΉμ νλ‘ν νμ
λΉμ μ‘°νν ν΄λΌμ΄μΈνΈκ° κ΄λ¦¬ν΄μΌ ν©λλ€.
μ’ λ£ λ©μλμ λν νΈμΆλ ν΄λΌμ΄μΈνΈκ° μ§μ ν΄μΌ ν©λλ€.

3. νλ‘ν νμ μ€μ½ν - μ±κΈν€ λΉκ³Ό ν¨κ» μ¬μ© μ λ¬Έμ μ
μ€νλ§ μ»¨ν μ΄λμ νλ‘ν νμ μ€μ½νμ λΉμ μμ²νλ©΄ νμ μλ‘μ΄ κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ λ°νν©λλ€.
νμ§λ§, μ±κΈν€ λΉκ³Ό ν¨κ» μ¬μ©ν λλ μλν λλ‘ μ λμνμ§ μμΌλ―λ‘ μ£Όμν΄μΌ ν©λλ€.
κ·Έλ¦Όκ³Ό μ½λλ‘ λ΄λ³΄λλ‘ νκ² μ΅λλ€.
λ¨Όμ , μ€νλ§ μ»¨ν μ΄λμ νλ‘ν νμ λΉμ μ§μ μμ²νλ μμ λ₯Ό λ΄λ³΄λλ‘ νκ² μ΅λλ€.
<βνλ‘ν νμ λΉ μ§μ μμ²β>
1. ν΄λΌμ΄μΈνΈAλ μ€νλ§ μ»¨ν μ΄λμ νλ‘ν νμ λΉμ μμ²ν©λλ€.
2. μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μλ‘ μμ±ν΄μ λ°ν(x01) ν©λλ€. ν΄λΉ λΉμ count νλ κ°μ 0 μ λλ€.
3. ν΄λΌμ΄μΈνΈλ μ‘°νν νλ‘ν νμ λΉμ addCount()λ₯Ό νΈμΆνλ©΄μ count νλλ₯Ό +1 ν©λλ€.
βοΈκ²°κ³Όμ μΌλ‘ νλ‘ν νμ λΉ(x01)μ countλ 1μ΄ λ©λλ€.
4. ν΄λΌμ΄μΈνΈBλ μ€νλ§ μ»¨ν μ΄λμ νλ‘ν νμ λΉμ μμ²ν©λλ€.
5. μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μλ‘ μμ±ν΄μ λ°ν(x02) ν©λλ€. ν΄λΉ λΉμ count νλ κ°μ 0 μ λλ€.
6. ν΄λΌμ΄μΈνΈλ μ‘°νν νλ‘ν νμ λΉμ addCount()λ₯Ό νΈμΆνλ©΄μ count νλλ₯Ό +1 ν©λλ€.
βοΈκ²°κ³Όμ μΌλ‘ νλ‘ν νμ λΉ(x02)μ countλ 1μ΄ λ©λλ€.
μ½λλ‘ ν λ² λ΄λ³΄κ² μ΅λλ€.
μκΉ λ§λ€μλ test.hello.core.scopeμ SingletonWithPrototypeTest1μ΄λΌλ ν΄λμ€λ₯Ό λ§λ€μ΄μ€λλ€.
public class SingletonWithPrototypeTest1 {
@Test
void prototypeFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
PrototypeBean pb1 = ac.getBean(PrototypeBean.class);
pb1.addCount();
assertThat(pb1.getCount()).isEqualTo(1);
PrototypeBean pb2 = ac.getBean(PrototypeBean.class);
pb2.addCount();
assertThat(pb2.getCount()).isEqualTo(1);
}
@Scope("prototype")
static class PrototypeBean {
private int count = 0;
public void addCount() {
count++;
}
public int getCount() {
return count;
}
@PostConstruct
public void init() {
System.out.println("PrototypeBean.init" + this);
}
@PreDestroy
public void destroy() {
System.out.println("PrototypeBean.destroy");
}
}
}
μ°μ λ΄λΆ ν΄λμ€λΆν° λ³΄κ² μ΅λλ€.
prototype μ€μ½νμ΄λ―λ‘, getBean()μ νΈμΆν λλ§λ€ μλ‘μ΄ κ°μ²΄κ° μμ±λ©λλ€.
μμ κ·Έλ¦Όμμ λ΄€λ addCount()μ getCount() λ©μλλ₯Ό μ¬μ©νμ΅λλ€.
count κ°μ μ¦κ°μν€κ³ νμΈνλ κ°λ¨ν λ‘μ§μ λλ€.
μμμλ μκΈ°νμ§λ§, νλ‘ν νμ λΉμμλ @PreDestroyλ μλ νΈμΆλμ§ μμ΅λλ€.
λ©μΈ ν΄λμ€λ‘ κ°λ³΄κ² μ΅λλ€.
첫 λ²μ§Έ PrototypeBean μΈμ€ν΄μ€λ₯Ό κ°μ Έμ€κ³ , addCount() νΈμΆλ‘ count κ°μ 1 μ¦κ°μν΅λλ€.
κ·Έλ¬κ³ , getCount()κ° 1μΈμ§ νμΈν©λλ€.
λ λ²μ§Έ μΈμ€ν΄μ€λ₯Ό λ€μ μ€νλ§ μ»¨ν μ΄λμμ κ°μ Έμ΅λλ€.
μλ‘μ΄ κ°μ²΄μ΄κΈ° λλ¬Έμ count κ°μ λ€μ 0λΆν° μμνκ³ , addCount() νμλ count κ°μ΄ λ€μ 1μ΄ λ©λλ€.
κ²°λ‘ μ pb1κ³Ό pb2λ μλ‘ λ€λ₯Έ μΈμ€ν΄μ€λΌλ κ²!
κ²°κ³Όλ₯Ό ν λ² λ΄λ³΄κ² μ΅λλ€.
μ λμμ΅λλ€.
λ κ°κ° μλ‘ λ€λ₯Έ μΈμ€ν΄μ€(κ°μ²΄)λΌλ κ²μ λ°λ‘ μ μ μμ΅λλ€.
μ΄λ²μλ 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κ° λ©λλ€. (count κ° 1ππ»2)
μ½λλ‘ ν λ² λ΄λ³΄κ² μ΅λλ€.
μκΉ λ§λ€μλ SingletonWithPrototypeTest1 ν΄λμ€λ₯Ό μμ ν΄μ μμ±ν΄λ³΄κ² μ΅λλ€.
4. νλ‘ν νμ μ€μ½ν - μ±κΈν€ λΉκ³Ό ν¨κ» μ¬μ© μ Providerλ‘ λ¬Έμ ν΄κ²°
μ΄λ κ² λμ΄ λ¬μ΅λλ€.
μμμ νλ‘μ νΈλ‘ λ€μ λμμ¬κ²μ!
μλ¨μΉπ
