2 λΆ„ μ†Œμš”

싱글톀 νŒ¨ν„΄μ΄λž€?

싱글톀 νŒ¨ν„΄(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/
μŠ€ν”„λ§ 핡심 원리 (기본편) - [μΈν”„λŸ°] κΉ€μ˜ν•œ κ°•μ‚¬λ‹˜

λŒ“κΈ€λ‚¨κΈ°κΈ°