π[Web] μ±κΈν€ ν¨ν΄μ΄λ?
μ±κΈν€ ν¨ν΄μ΄λ?
μ±κΈν€ ν¨ν΄(Singleton pattern)
μ΄λ, κ°μ²΄μ μΈμ€ν΄μ€κ° μ€μ§ 1κ°λ§ μμ±λλ ν¨ν΄μ μλ―Ένλ€.
μ¦, ν΄λμ€μ μΈμ€ν΄μ€κ° λ± 1κ°λ§ μμ±λλ κ²μ 보μ₯νλ λμμΈ ν¨ν΄μ΄λ€.
- μ£Όμν μ
- κ°μ²΄ μΈμ€ν΄μ€λ₯Ό 2κ° μ΄μ μμ±νμ§ λͺ»νλλ‘ λ§μμΌνλ€!
private μμ±μ
λ₯Ό μ¬μ©ν΄μ μΈλΆμμ μμλ‘new ν€μλ
λ₯Ό μ¬μ©νμ§ λͺ»νκ² νμ!
[μμ ]
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// μμ±μλ μΈλΆμμ νΈμΆλͺ»νκ² private μΌλ‘ μ§μ ν΄μΌ νλ€.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("hi, there");
}
}
μμ μμ λ₯Ό 보면, Singleton ν΄λμ€μ κ°μ²΄λ instance
νλ λΏμ΄λ€.
μ±κΈν€ ν¨ν΄μ μ₯μ
μ±κΈν€ ν¨ν΄μΌλ‘ μ¬μ©νλ©΄ μΈμ€ν΄μ€κ° 1κ°λ§ μμ±λλλ°, μ μ±κΈν€ ν¨ν΄μ μ¬μ©ν κΉ?
λ¨Όμ , λ©λͺ¨λ¦¬μ μ μ½μ μ₯μ μ΄ μλ€.
κ°μ²΄λ μμ±ν λλ§λ€ λ©λͺ¨λ¦¬ μμμ ν λΉλ°μμΌ νλ€.
νμ§λ§ ν λ²μ new
λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νλ€λ©΄ λ©λͺ¨λ¦¬μ λλΉλ₯Ό λ°©μ§ν μ μλ€.
λ€μμΌλ‘λ ν΄λμ€ κ°μ λ°μ΄ν° 곡μ μ©μ΄ μΈ‘λ©΄μ΄λ€.
μ±κΈν€ μΈμ€ν΄μ€λ μ μμΌλ‘ μ¬μ©λλ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ€μ΄ μ κ·Ό(λ°μ΄ν°λ₯Ό 곡μ )νμ¬ μ¬μ©ν μ μλ€.
νμ§λ§ μ¬λ¬ ν΄λμ€μ μΈμ€ν΄μ€μμ μ±κΈν€ μΈμ€ν΄μ€μ λ°μ΄ν°μ λμμ μ κ·Όνκ² λλ©΄ λμμ± λ¬Έμ κ° λ°μν μ μμΌλ μ΄μ μ μ μν΄μ μ€κ³νλ κ²μ΄ μ’λ€.
λμμ± λ¬Έμ ?
λμμ± λ¬Έμ λ, λμΌν νλμ λ°μ΄ν°μ λ μ΄μμ μ€λ λ, νΉμ μΈμ
μμ κ°λ³ λ°μ΄ν°λ₯Ό λμμ μ μ΄ν λ λνλ λ¬Έμ λ₯Ό λ§νλ€.
μ½κ² λ§ν΄ λμΌν μμμ λν΄ μ¬λ¬ μ€λ λκ° λμμ μ κ·Ό νλ©΄μ λ°μνλ λ¬Έμ λΌκ³ ν μ μλ€.
ν΄κ²°λ°©λ²μΌλ‘λ μ°λ λ λ‘컬(Thread Local) μ΄ μλ€.
μ±κΈν€ νν΄μ λ¬Έμ μ
μ±κΈν€ ν¨ν΄μ λ©λͺ¨λ¦¬ μΈ‘λ©΄
κ³Ό λ°μ΄ν° 곡μ μΈ‘λ©΄
μμ μ΄μ μ κ°κ³ μμ§λ§ λ€μκ³Ό κ°μ΄ λ§μ λ¬Έμ μ λ€μ μλ°νκΈ° λλ¬Έμ trade-offλ₯Ό μ κ³ λ €ν΄μΌ νλ€.
- trade-off (μμΆ©κ΄κ³)
- βνλλ₯Ό μ»μΌλ©΄ λ€λ₯Έ νλλ₯Ό μλλ€.β
- μ: νλ‘κ·Έλ¨μ μ±λ₯μ λμΌ μλ‘ λ©λͺ¨λ¦¬μ μ¬μ©λ μ¦κ°
λ¨Όμ , ꡬν μ½λ μμ²΄κ° λ§λ€.
μ μ ν©ν 리 λ©μλμμ κ°μ²΄ μμ±μ νμΈνκ³ μμ±μλ₯Ό νΈμΆνλ κ²½μ°μλ λ©ν°μ€λ λ©
νκ²½μμ λ°μν μ μλ λμμ± λ¬Έμ ν΄κ²°μ μν΄ syncronized
ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
λ€μμΌλ‘λ ν
μ€νΈμ μ΄λ €μμ΄λ€.
μ±κΈν€ μΈμ€ν΄μ€λ μμμ 곡μ νκ³ μκΈ° λλ¬Έμ ν
μ€νΈκ° 격리λ νκ²½μμ μνλλ €λ©΄ λ§€λ² μΈμ€ν΄μ€μ μνλ₯Ό μ΄κΈ°νν΄μ£Όμ΄ νλ€.
μκ·Έλ¬λ©΄ μ μμμ μνλ₯Ό 곡μ νκΈ° λλ¬Έμ ν
μ€νΈκ° μ μμ μΌλ‘ μνλμ§ μλλ€.
λ€μμΌλ‘λ μμ‘΄κ΄κ³μ ν΄λΌμ΄μΈνΈκ° ꡬ체 ν΄λμ€μ μμ‘΄νλ€λ μ μ΄λ€.
μ΄λ DIP
μμΉμ μλ°ν¨κ³Ό λμμ, OCP
μμΉ μλ° κ°λ₯μ±μ΄ λμμ§λ€.
λ§μ§λ§μΌλ‘λ λ΄λΆ μμ±μ λ³κ²½νκ±°λ μ΄κΈ°ννκΈ° μ΄λ ΅λ€λ μ κ³Ό, private μμ±μλ‘ μμ ν΄λμ€λ₯Ό λ§λ€κΈ° μ΄λ ΅λ€λ μ μ΄λ€.
κ²°λ‘ μ μΌλ‘ μ μ°μ±μ΄ λ¨μ΄μ§λ€κ³ ν μ μμ΄, μν°ν¨ν΄
μΌλ‘ λΆλ¦¬κΈ°λ νλ€.
νμ§λ§
μ€νλ§ νλ μμν¬(Spring Framework)
λ μμ λμ¨ μ±κΈν€ ν¨ν΄μ λ¬Έμ μ λ€μ ν΄κ²°νλ©΄μ, κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ±κΈν€μΌλ‘ κ΄λ¦¬ν΄μ€λ€.
μ€νλ§ λΉ(spring bean)
μ΄ λ°λ‘ μ±κΈν€μΌλ‘ κ΄λ¦¬λλ λΉμ΄λ€.
μ±κΈν€ 컨ν μ΄λ
μ€νλ§ μ»¨ν
μ΄λλ μ±κΈν€ ν¨ν΄μ μ μ©νμ§ μμλ κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ±κΈν€μΌλ‘ κ΄λ¦¬νλ€.
μ€νλ§ μ»¨ν
μ΄λλ μ±κΈν€ 컨ν
μ΄λμ μν μ νλ€κ³ ν μ μλ€.
μ΄λ κ² μ±κΈν€ κ°μ²΄λ₯Ό μμ±νκ³ κ΄λ¦¬νλ κΈ°λ₯μ μ±κΈν€ λ μ§μ€νΈλ¦¬λΌκ³ νλ€.
μ€νλ§ μ»¨ν
μ΄λμ μ΄λ° κΈ°λ₯ λλΆμ μ±κΈν€ ν¨ν΄μ λͺ¨λ λ¨μ μ ν΄κ²°νλ©΄μ κ°μ²΄λ₯Ό μ±κΈν€μΌλ‘ μ μ§ν μ μλ€.
μ±κΈν€ 컨ν
μ΄λλ₯Ό μ μ©ν νμλ κ°μ²΄ νΈμΆμ΄ λ λ λ§λ€ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄ μλ, μ΄λ―Έ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό 곡μ ν΄μ ν¨μ¨μ μΌλ‘ μ¬μ¬μ©ν μ μλ€.
μ°Έκ³ : μ€νλ§μ κΈ°λ³Έ λΉ λ±λ‘ λ°©μμ μ±κΈν€μ΄μ§λ§, μ±κΈν€ λ°©μλ§ μ§μνλ κ²μ μλλ€. μμ²ν λλ§λ€ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν΄μ λ°ννλ κΈ°λ₯λ μ 곡νλ€.
μ°Έκ³ μλ£
λ΄ κΉνλΈ (private)spring-core-basic
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
μ€νλ§ ν΅μ¬ μ리 (κΈ°λ³ΈνΈ) - [μΈνλ°] κΉμν κ°μ¬λ
λκΈλ¨κΈ°κΈ°