π [Design Pattern] π» λμμΈ ν¨ν΄ Singletone Pattern
π» [Design Pattern] μ±κΈν€ ν¨ν΄
μλ
νμΈμ. π
λμμΈ ν¨ν΄ μ€
Java μ Spring μμ μ£Όλ‘ μ¬μ©λλ
Singletone Pattern μ λν΄ μμλ³΄κ² μ΅λλ€.
π» μ±κΈν€ ν¨ν΄ μ΄λ 무μμΈκ°?
μννΈμ¨μ΄ λμμΈ ν¨ν΄μμ μ±κΈν΄ ν¨ν΄(Singleton pattern)μ λ°λ₯΄λ ν΄λμ€λ, μμ±μκ° μ¬λ¬ μ°¨λ‘ νΈμΆλλλΌλ
μ€μ λ‘ μμ±λλ κ°μ²΄λ νλμ΄κ³ μ΅μ΄ μμ± μ΄νμ νΈμΆλ μμ±μλ μ΅μ΄μ μμ±μκ° μμ±ν κ°μ²΄λ₯Ό 리ν΄νλ€.
μ΄μ κ°μ λμμΈ μ νμ μ±κΈν΄ ν¨ν΄μ΄λΌκ³ νλ€.
μ£Όλ‘ κ³΅ν΅λ κ°μ²΄λ₯Ό μ¬λ¬κ° μμ±ν΄μ μ¬μ©νλ DBCP(DataBase Connection Pool)μ κ°μ μν©μμ λ§μ΄ μ¬μ©λλ€.
μ¦ Singleton μ΄λ¦ κ·Έλλ‘ νλμ κ°μ²΄λ§μ μμ±ν΄μ μ¬μ©νλ λμμΈ ν¨ν΄μ λ§ν©λλ€.
λ¨ νλμ μ΅μ΄ μμ±λ κ°μ²΄λ₯Ό 곡μ©μΌλ‘ μ¬μ©νκΈ° λλ¬Έμ λ©ν°μ°λ λ νκ²½μμ Thread-Safe κ° μ€μν©λλ€.
1. μ±κΈν€ ν¨ν΄μ μ¬μ©μ΄μ ?
μ±κΈν€ ν¨ν΄μ μ£Όλ‘ μλ°μ Spring Framework μμ μ¬μ©λ©λλ€.
μ±κΈν€ ν¨ν΄μ μ΅μ΄ νλ² κ°μ²΄λ₯Ό μμ±ν΄ μ¬μ¬μ© ν μ μκΈ°μ λ©λͺ¨λ¦¬ λλΉλ₯Ό λ°©μ§ν μ μμ΅λλ€.
μ΄λ κ² μ΅μ΄ νλ² μμ±λ μ±κΈν€ κ°μ²΄λ μ μμ±μ κ°κ³ μκΈ°μ μ΄λμλ μ¬μ©ν μ μμ΅λλ€.
2. μ±κΈν€ ν¨ν΄ ꡬν λ°©λ²
1) Eager Init
public class EagerInit {
private static EagerInit uniqueInstance = new EagerInit();
private EagerInit(){
}
public static EagerInit getInstance(){
return uniqueInstance;
}
}
κ°μ₯ μ½κ² λ§λ€ μ μλ Singletone PatternμΌλ‘
static ν€μλμ νΉμ§μ μ΄μ©ν΄μ ν΄λμ€ λ‘λκ° μ΄κΈ°ν νλ μμ μμ μ μ λ°μΈλ©(static binding)μ ν΅ν΄
ν΄λΉ μΈμ€ν΄μ€λ₯Ό λ©λͺ¨λ¦¬μ λ±λ‘ν΄μ μ¬μ©νλ κ²μ
λλ€.
Eager Init λ°©μμ Thread-Safe νμ§ μμ΅λλ€.
Singletone ꡬν μ μ€μν μ μ΄, λ©ν° μ€λ λ© νκ²½μμλ λμ κ°λ₯νκ²λ ꡬνν΄μΌ νλ€λ κ²μ
λλ€.
μ¦, Thread-safe κ° λ³΄μ₯λμ΄μΌ ν©λλ€.
2) Lazy init
package singletone;
public class LazyInit {
private static LazyInit uniqueInstance;
private LazyInit() {
}
public static LazyInit getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new LazyInit();
}
return uniqueInstance;
}
}
Eager Init μ κ°μ μμΌ ν΄λμ€ λ‘λ© μμ μ΄ μλ μΈμ€ν΄μ€κ° νμνμ¬ μμ²μ λμ λ°μΈλ©μ ν΅ν΄ ꡬν κ°λ₯ν©λλ€.
νμ§λ§ μ¬λ¬ μ°λ λμμ getInstanceμ μ κ·Όν μ μμ΄ Thread-Safe νμ§ μμ΅λλ€.
3) synchronized λ°©λ²
package singletone;
public class Synchronize {
private static Synchronize uniqueInstance;
private Synchronize() {
}
public static synchronized Synchronize getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Synchronize();
}
return uniqueInstance;
}
}
synchronized ν€μλλ₯Ό ν΅ν΄μ λκΈ°νλ₯Ό ν΅ν΄ Lazy μ΄κΈ°νμ Thread-Safe νκ² μ±κΈν€μ ꡬνν μ μμ΅λλ€.
νμ§λ§ μ±λ₯μ΄ μλΉν μ’μ§ λͺ»ν©λλ€.
4) Lazy Holder λ°©λ²
package singletone;
public class Holder {
private Holder() {}
private static class InnerInstanceClazz() {
// ν΄λμ€ λ‘λ© μμ μμ μμ±
private static final Holder uniqueInstance = new Holder();
}
public static Holder getInstance() {
return InnerInstanceClazz.instance;
}
}
Holder λ°©λ²μ Singletone Pattern ꡬνμ κ°μ₯ λ§μ΄ μ°μ΄λ λνμ μΈ ννμ
λλ€.
Holder ν΄λμ€μλ InnerInstanceClazz ν΄λμ€μ λ³μκ° μμ΄μ
static λ©€λ² ν΄λμ€μ§λ§ ν΄λμ€ λ‘λκ° μ΄κΈ°ν κ³Όμ μ μ§νν λ
InnerInstanceClazz λ©μλλ₯Ό μ΄κΈ°ν νμ§μκ³ , getInstance() λ©μλ νΈμΆ μ μ΄κΈ°ν λ©λλ€.
λμ λ°μΈλ©(Dynamic Binding) μ νΉμ§μ μ΄μ©νμ¬ Thread-safe νλ©΄μ μ±λ₯μ΄ λ°μ΄λ©λλ€
InnerInstanceClazz λ΄λΆ μΈμ€ν΄μ€λ static μ΄κΈ° λλ¬Έμ ν΄λμ€ λ‘λ© μμ μ νλ²λ§ νΈμΆλλ€λ μ μ μ΄μ©νκ²μ΄κ³
finalμ μ¨μ κ°μ΄ λ€μ ν λΉλμ§ μλλ‘ ν©λλ€.
λ
Design Pattern μ€ μλ°μ Spring Framework μμ
λ§μ΄ μ¬μ©λλ Singletone Patternμ λν΄ μμ보μμ΅λλ€.
κ°μ¬ν©λλ€. π
Reference
https://elfinlas.github.io/2019/09/23/java-singleton/
https://medium.com/webeveloper/%EC%8B%B1%EA%B8%80%ED%84%B4-%ED%8C%A8%ED%84%B4-singleton-pattern-db75ed29c36
Written on June 28, 2020