ν λΉμμ€νλ§#2 μ±κΈν€ λ μ§μ€νΈλ¦¬μ μ€λΈμ νΈ μ€μ½ν
by JiwonDev2021.08.14 - [Backend/Spring Core] - ν λΉμ μ€νλ§#1 μ€λΈμ νΈμ μμ‘΄κ΄κ³
μμμ μΈκΈν μ΄ λ΄μ©μ λν΄μ μ‘°κΈ λ μμΈνκ² μμ보μ.
# μ€λΈμ νΈμ λμΌμ±κ³Ό λλ±μ±
'μλ°μμ λ κ°μ μ€λΈμ νΈκ° κ°μκ°?' λΌλ λ§μ μ£Όμν΄μ μ¬μ©ν΄μΌνλ€. λμΌμ±(Identity)μ λλ±μ±(Equality)μ μ°¨μ΄κ° μκΈ° λλ¬Έμ΄λ€.
- λμΌμ± λΉκ΅(==, Identity)λ κ°λ₯΄ν€κ³ μλ κ°μ²΄κ° λμΌν κ²½μ°μ μ¬μ©νλ λ§μ΄λ€.
- λλ±μ± λΉκ΅(.equal() .hashtag(), Equality)λ κ°μ²΄κ° κ°μ§ κ°, μ λ³΄κ° λμΌν κ²½μ° μ¬μ©νλ λ§μ΄λ€.
μ€λΈμ νΈκ° λμΌνλ©΄ λλ±μ±μ λ§μ‘±νμ§λ§, λ°λλ‘ λλ±νλ€κ³ ν΄μ λμΌν κ°μ²΄μμ 보μ₯ν μ μλ€. μ΄ν΄κ° μλλ€λ©΄ μλκΈμ μ°Έκ³ ν΄λ³΄μ. 2021.07.27 - [κΈ°λ³Έ μ§μ/Java κΈ°λ³Έμ§μ] - .equalsμ .hashCode()λ νμ ν¨κ» μ€λ²λΌμ΄λ©ν΄μΌνλ€.
# μ€νλ§μμμ λΉ κ°μ²΄
컨ν μ΄λ (Object Factory)μμ κ°μ κ°μ²΄λ₯Ό μμ±νκ² λλ©΄ λ κ°μ²΄κ° κ°μ§ κ°μ κ°μ§λ§, μ€μ λ±λ‘λ κ°μ²΄λ λ€λ₯Έ κ°μ²΄μ΄λ€. μ¦ 'λλ±μ±'μ λ§μ‘±νλ 'λμΌμ±'μ λ§μ‘±νμ§ μλλ€. κ°μ²΄λ₯Ό μμ± ν λλ§λ€ μ€λ³΅ν΄μ λ§λ€κ²λλ€.
DaoFactory factory = new DaoFactory(); // AppConfig κ°μ²΄λ₯Ό μλ―Ένλ€.
// μ΄ λ κ°μ²΄λ λ€λ₯΄λ€.
UserDao dao1 = factory.userDao();
UserDao dao2 = factory.userDao();
// my.package.UserDao@118f375
// my.package.UserDao@117A8bd
System.out.println(dao1 + "\n" + dao2);
μ€νλ§μμλ μ΄λ¬ν μ€λ³΅(λλΉ)λ₯Ό λ§κΈ°μν΄ κ°μ²΄λ₯Ό μ±κΈν€μΌλ‘ λ±λ‘νλ€.
// Object Factory κ°μ²΄λ₯Ό μ€νλ§ μ€μ νμΌλ‘ λ겨주μ΄, μ€νλ§ μ»¨ν
μ΄λλ₯Ό μ¬μ©νλ λ°©λ²
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
// κ·Έλ λ€λ©΄ μ΄ λ κ°μ²΄λ λμΌμ±μ λ§μ‘±νμ§ λͺ»νλ κ±ΈκΉ?
UserDao dao1 = context.getBean("userDao", UserDao.class);
UserDao dao2 = context.getBean("userDao", UserDao.class);
// λλκ²λ λμΌμ±μ λ§μ‘±νλ€. λͺ κ°λ₯Ό μμ±νλ λμΌν νλμ κ°μ²΄λ§ μμ±νκ³ , μ°Έμ‘°νλ€.(μ±κΈν€)
// my.package.UserDao@ee22f7
// my.package.UserDao@ee22f7
System.out.println(dao1 + "\n" + dao2);
# μ±κΈν€ λ μ§μ€νΈλ¦¬λ‘μ ApplicationContext
μ€νλ§μμ μ¬μ©νλ 컨ν μ΄λ, Application Contextλ μ°λ¦¬κ° μμμ λ§λ€μλ Object Factoryμ λΉμ·ν λ°©μμΌλ‘ λμνλ€. νμ§λ§ μ€νλ§ μ»¨ν μ΄λλ μ΄μ λμμ μ±κΈν€μ μ μ₯νκ³ κ΄λ¦¬νλ μ±κΈν€ λ μ§μ€νΈλ¦¬(singleton registry) μ΄κΈ°λ νλ€.
μ€νλ§μ νμμ λ°λΌ λ°λ‘ μ€μ νλ κ² μλλΌλ©΄, κΈ°λ³Έμ μΌλ‘ μμ±νλ λΉ κ°μ²΄λ μ λΆ μ±κΈν€μΌλ‘ λ§λ λ€. λμμΈ ν¨ν΄μμ λμ€λ μ±κΈν€ ν¨ν΄κ³Ό λΉμ·ν κ°λ μ΄μ§λ§, ꡬνλ°©λ²μ νμ°ν λ€λ₯΄λ€.
@ μ½λλ‘ κ΅¬νν μ±κΈν€μ νκ³
κ·Όλ° μ΄λ κ² λ°μ΄νΈμ½λλ₯Ό μ‘°μνλ©΄μκΉμ§ μ±κΈν€μ ꡬνν΄μΌ νλ μ΄μ λ 무μμΌκΉ? κ·Έ μ΄μ λ μ€νλ§μ νμμ μΌλ‘ μλ²(μΉ μλ²)μ μ£Όλ‘ μ¬μ©λλ νλ μμν¬μ΄κΈ° λλ¬Έμ΄λ€. μ€νλ§μ΄ μ²μ μ€κ³λμλ λκ·λͺ¨ μλΉμ€λ₯Ό μ²λ¦¬νλ μλ²νκ²½μ μ΄λΉ μμ, μλ°±λ²μ μ΄λ₯΄λ ν΄λΌμ΄μΈνΈμ μμ²μ μ²λ¦¬νλ€. κ·Έ νλμ μμ²μ μ²λ¦¬νκΈ° μν΄ [λ°μ΄ν° μμΈμ€(DB) κ°μ²΄, μλΉμ€ κ°μ²΄, ν΅μ¬ λΉμ¦λμ€ λ‘μ§ κ°μ²΄]λ± μλ§μ κ°μ²΄λ€μ΄ μ°Έμ¬νλ κ³μΈ΅μ μΈ κ΅¬μ‘°λ‘ μ΄λ£¨μ΄μ§λκ² λλΆλΆμ΄λ€.
λ§€λ² ν΄λΌμ΄μΈνΈμ μμ²μ΄ μ¬ λλ§λ€ κ° λ‘μ§μ λ΄λΉνλ κ°μ²΄λ₯Ό μλ‘ λ§λ λ€κ³ μκ°ν΄λ³΄μ. μ΄λΉ 500κ°μ μμ²μ΄ λ€μ΄μ¨λ€λ©΄ 2500κ°μ μλ‘μ΄ κ°μ²΄κ° μμ±λλ€. 1λΆμ΄λ©΄ μλ§κ°, νμκ°μ΄λ©΄ μλ²μ 900λ§κ°μ μ€λΈμ νΈκ° μμ±λκ³ μ¬μ©λ κ²μ΄λ€. μ무리 JVMκ³Ό GCμ κΈ°λ₯μ΄ μ’μμ‘λ€κ³ νλ€, κ°μ²΄λ₯Ό μμ±νκ³ μλ©Έμν€λ κ³Όμ μ μ°μ° λΉμ©μ΄ λΉμΌ μμ μ΄λ€. κ·Έλμ μ¬λ¬ μ€λ λμμ νλμ κ°μ²΄λ₯Ό 곡μ ν΄ λλ €μ°λλ‘ μ±κΈν€μ ꡬννλ κ²μ΄λ€.
λ€λ§ μ½λλ‘λ μ±κΈν€μ ꡬνν μλ μλ€. νμ§λ§ μ€μ μλΉμ€μμ μ¬μ©νκΈ°μλ μλμ κ°μ νκ³μ μ΄ μλ€.
public class DoubleLockSingleton {
// λ¨μν μ±κΈν€ ꡬν λ°©λ²
private static final Singleton instance = new Singleton();
// private μμ±μλ₯Ό μ΄μ©νμ¬ κ°μ κ°μ²΄κ° μ€λ³΅ μμ±λλ κ²μ λ§μ.
private Singleton(){}
public static Singleton getInstance(){
// λ©ν°μ€λ λμμ μ±κΈν€ κ°μ²΄ μμ±μ Thread-safety 보μ₯
if(instance == null){
synchronized (Singleton.class) {
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
- private μμ±μ λλ¬Έμ κ°μ²΄λ₯Ό μμν μ μλ€. μλΉμ€ κ°μ²΄μ λ€νμ±μ μ μ©νκΈ° μ΄λ ΅λ€.
- μ€μ κ°μ²΄κ° μλ ν μ€νΈμ© κ°μ²΄(mock)λ₯Ό μ¬μ©νκΈ° μ΄λ ΅λ€. μ¦ ν μ€νΈ ν경ꡬμ±μ΄ μ΄λ €μμ§λ€.
- λΆμ°λ μλ²νκ²½μμ μ±κΈν€μ΄ νλλ§ λ§λ€μ΄μ§λ κ²μ 보μ₯νμ§ λͺ»νλ€. (μλ²μ JVMμ΄ μ¬λ¬κ°μ΄λ€)
- μ±κΈν€ κ°μ²΄κ° 'μ μ λ³μ'μ²λΌ μ¬μ©λ μ μλ κ°λ₯μ±μ κ°μ§κ³ μλ€. μ΄λ¬ν λ°©μμ side-effectλ₯Ό μ λ°νλ€.
κ·Έλμ μ€νλ§μ λ°μ΄νΈμ½λ μ‘°μμ ν΅ν΄ μ§μ μ±κΈν€ ννμ μ€λΈμ νΈλ₯Ό λ§λ€κ³ κ΄λ¦¬νλ κΈ°λ₯μ μ 곡νλλ°, μ΄λ₯Ό μ±κΈν€ λ μ§μ€νΈλ¦¬λΌκ³ λΆλ₯Έλ€. μ±κΈν€ λ μ§μ€νΈλ¦¬λ μ½λ μμμ static λ©μλμ private μμ±μλ₯Ό μ΄μ©ν΄μΌνλ λΉμ μμ μΈ μ±κΈν€ ν΄λμ€κ° μλλΌ, νλ²ν μλ° ν΄λμ€λ₯Ό μ±κΈν€ κ°μ²΄λ‘ μ¬μ©ν μ μκ² λ§λ€μ΄μ€λ€.
μ±κΈν€ λ μ§μ€νΈλ¦¬λ μ±κΈν€ ν¨ν΄κ³Ό λ¬λ¦¬ μλ°μ κ°μ²΄μ§ν₯μ μΈ μ€κ³ λ°©μμ΄λ μ½λλ₯Ό νμ©νλλ° μλ¬΄λ° μ μ½μ΄ μλ€λ ν° μ₯μ μ΄ μλ€. λ€λ§ 'μ±κΈν€' ν¨ν΄μ΄ κ°μ§λ μνμ±μ λ³ν¨μ΄ μκΈ°μ, μ£Όμν΄μ μ¬μ©νλ κ²μ μμΌλ©΄ μλλ€.
@ μ£Όμ! μ±κΈν€κ³Ό μ€λΈμ νΈ μν
μ±κΈν€μ λ©ν°μ€λ λ νκ²½μ΄λΌλ©΄ μ¬λ¬ μ€λ λκ° λμμ μ κ·Όν΄μ μ¬μ©ν μ μλ€. λ°λΌμ 'κ°μ²΄'κ° μν κ°μ κ°μ Έμλ μλλ€. μν λ°μ΄ν°λ₯Ό κ°μ§κ³ μμ§ μλ Stateless λ°©μμΌλ‘ μ±κΈν€μ μ¬μ©ν΄μΌνλ€.
λ μ½κ² λ§νλ©΄ μ±κΈν€ μ€λΈμ νΈμ μΈμ€ν΄μ€ λ³μλ₯Ό μμ νλ μμ μ λ§€μ° μννλ€λ λ§μ΄λ€. μ¬λ¬ μ€λ λμμ μ¬μ©λ κ°λ₯μ±μ΄ μκΈ°μ Thread-Safetyνμ§ μλ€. λ ν° λ¬Έμ λ μ€νλ§μμ μ±κΈν€ λ μ§μ€νΈλ¦¬λ₯Ό ν΅ν΄ κ΄λ¦¬ν΄μ£Όλ€λ³΄λ, κ°λ°μκ° 'μ±κΈν€ κ°μ²΄'λΌλ μ¬μ€μ μκ³ μνλ₯Ό μ μ₯ν μ μλ€λ μνμ±μ΄ μλ€.
λ©ν°μ€λ λ νκ²½μμ μ΄λ¬ν μ€λ₯κ° λ°μνκ²λλ©΄, κ·Έ μ€λ₯λ₯Ό μ‘λ κ²μ μμ μ΄μμΌλ‘ μ΄λ ΅λ€. μ¬μ©μκ° λ‘κ·ΈμΈμ νλλ° λ€λ₯Έμ¬λμ λ°μ΄ν°κ° 보μ΄λ μν©μ΄λΌλ©΄, μ΄λμλΆν° μ΄λ€ μ½λλ₯Ό λλ²κΉ ν΄μΌν κΉ μμν΄λ³΄μ. μ λ§ λ΅ μλ μν©μ΄κ³ , μ€μ νμ μμλ μ’ μ’ λ°μνλ μΌμ΄κΈ°λ νλ€. κ·Έλ¬λ μ λ° μ€νλ§ λΉ κ°μ²΄λ₯Ό μ¬μ©ν λ κΈ°λ³Έκ°μ΄ μ±κΈν€ κ°μ²΄μμ μμ§λ§κ³ μ£Όμν΄μ 'Stateless'νκ² μ¬μ©νλλ‘ νμ.
@ μ±κΈν€μ΄ μλ λΉ κ°μ²΄
μ€νλ§μμ κ΄λ¦¬νλ μ€λΈμ νΈ, μ¦ λΉμ΄ μμ±λκ³ μ‘΄μ¬νκ³ μ μ©λλ λ²μλ₯Ό μ€νλ§μμλ λΉμ μ€μ½ν(Scope)λΌκ³ λΆλ₯Έλ€. κΈ°λ³Έ κ°μΈ μ±κΈν€ μ€μ½νλ μ€νλ§ μ»¨ν μ΄λκ° μ€νλλ μμ μ μμ±λκ³ , μ’ λ£λλ μμ μ μλ©Έλλ€.
λ€λ§ νμμ λ°λΌμλ μ±κΈν€ μΈμ λ€λ₯Έ μ€μ½νλ₯Ό κ°μ§ μ μλ€.
- prototype μ€μ½νλ μ±κΈν€ μ€μ½νμ λ¬λ¦¬ λΉμ μμ²ν λ λ§λ€ μλ‘μ΄ κ°μ²΄λ₯Ό λ§λ€μ΄μ€λ€.
- request μ€μ½νλ HTTP μμ²μ΄ μμ λ λΉμ΄ μμ±λκ³ , μμ²μ΄ λλ¬μ λ λΉμ΄ λ°νλλ€.
- session μ€μ½νλ μΉ μΈμ κ³Ό μ μ¬νκ² μ¬μ©ν μ μλ€.
λ€λ§ μ΄ λ΄μ©μ μ€νλ§μ λν κΈ°μ΄μ§μμ΄ μμ΄μΌ μ΄ν΄νκΈ° μ¬μ°λ―λ‘, λμ€μ μ€μ½νλ€μ λ°λ‘ λ€λ£¨λλ‘ νκ² λ€.
2021.08.03 - [Backend/Spring Core] - #11 λΉ μ€μ½ν(+Provider, νλ‘μ λͺ¨λ)
'π± Spring Framework > Spring Core' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
@Transactional μ λμμ리, νΈλμμ 맀λμ (5) | 2021.08.18 |
---|---|
μ½κ² μ΄ν΄νλ μ€νλ§ AOP (~μμ±μ€~) (0) | 2021.08.18 |
ν λΉμ μ€νλ§#1 μ€λΈμ νΈμ μμ‘΄κ΄κ³ (0) | 2021.08.14 |
#11 λΉ μ€μ½ν(+Provider, νλ‘μ λͺ¨λ) (0) | 2021.08.03 |
#10 λΉ μλͺ μ£ΌκΈ° μ½λ°± (0) | 2021.08.03 |
λΈλ‘κ·Έμ μ 보
JiwonDev
JiwonDev