1. 디자인 패턴이란?
프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여, 해결 할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것을 의미한다.
2. 싱글톤 패턴(singleton pattern)이란?
싱글톤 패턴(singleton pattern)은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만, 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는데 쓰이며, 보통 데이터베이스 연결 모듈에 많이 사용된다.
class Singleton {
static instance;
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
Singleton.instance = this;
}
say() {
console.log('hi, doyoung');
}
}
// 사용 예시
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true, 두 인스턴스가 동일함을 확인
instance1.say(); // 'hi, doyoung' 출력
3. 싱글톤 패턴의 장단점
장점 : 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하여 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어듦
즉, 메모리 관점에서 최초의 한번 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서 이점이 있다.
위에서 말했든 다른 모듈이 공유하는 장점으로, 다른 클래스간에 데이터 공유가 쉽다. 싱글톤 인스턴스가 전역으로 사용되기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다.
하지만, 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있다.
단점 :
1번째 : 싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다. 정적 팩토리 메소드에서 객체 생성을 확인하고 생성자를 호출하는 경우 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야한다.
2번째 : 테스트의 어려움이 있다. 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다. 그렇지 않으면, 어플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행하지 못한다.
3번째 : 자식 클래스의 만들수 없다. 내부 상태가 변경하기 어렵다.
이러한 문제들을 이유로 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이라고 할 수 있다.
4. 싱글톤 패턴의 동시성 문제 및 해결 방법
1. 동시성이란?
다중 스레드 환경에서 싱글톤 인스턴스가 여러 번 생성되는 것이 동시성이다.
인스턴스를 생성하는 과정에서 멀티 스레드 환경에서 동시에 실행이 될때, 인스턴스 체크와 인스턴스 생성 과정 사이에 컨텍스트 스위칭이 발생할 수도 있다. 이 경우, 첫 번째 스레드에 인스턴스가 존재하지 않는다 라고 판단하고 생성 과정을 다시 진행하는 동안 다른 스레드도 동일한 판단을 하여 여러 인스턴스를 생성할 수도 있다.
2. 해결 방법
2-1 : Double-checked locking(DCL) : 첫 번째 검사에서 인스턴스가 생성되지 않았을 경우메나 동기화 블록으로 진입하고, 동기화 블록 내에서 다시 한번 인스턴스 생성 여부를 체크하는 방식이다. 이 방식은 성능 저하를 최소화하면서도 멀티 스레드 환경에서 안정성을 보장할 수 있다.
2-2 : Initializaion-on-demand holder idiom : 클래스 로더의 메커니즘을 이용하여 내부 스태틱 클래스를 통해 싱글톤 인스턴스를 생성하는 방식이다. 내부 클래스가 싱글톤 인스턴가 필요할 때까지 로드되지 않는다. 이 방법은 JVM의 클래스 초기화 과정이 스레드에 안전하다는 점을 이용하여, 인스턴스 생성시 동시성 문제를 해결한다.
2-3 : Enum 싱글톤 : java의 열거형을 이용하여 싱글톤을 구현하는 방식이다. java 열거형은 내부적으로 serialization과 스레드 안전성이 보장되므로, 이 방식으로 싱글톤을 구현할 경우 동시성 문제를 해결할 수 있다.
출처 :
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
출처 :
출처 : 면접을 위한 cs 전공지식 노트
'CS > 프로그래밍' 카테고리의 다른 글
디자인 패턴 - 팩토리 패턴 / 전략 패턴 / 옵저버 패턴 (1) | 2024.03.22 |
---|---|
SOLID 원칙 (2) | 2024.03.16 |
[CS Study] 디자인 패턴 (0) | 2024.02.04 |
솔리드 원칙 (1) | 2024.01.20 |
고차 컴포넌트 (HOC, High Order Component) (0) | 2024.01.20 |