[CS] 디자인 패턴 - 싱글톤
디자인 패턴이란?
프로그램을 설계할 때 발생했던 문제점들을 해결 할 수 있도록 하나의 규약형태로 만들어 놓은 것
싱글톤 패턴(Singletone pattern)
싱글톤 패턴이란?
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴
보통 데이터베이스 연결 모듈에 많이 사용한다.
Javascript 예시 코드
class SingletoneJS {
constructor() {
if(!SingletoneJS.instance) {
SingletoneJS.instance = this
}
return SingletoneJS.instance;
}
}
node 공부할 때 많이 사용 했던 코드라 익숙하다.
생성자가 호출되고,SingletonJS.instance
가 undefined인 경우
SingletoneJS.instance
에 생성된 인스턴스를 할당하고, 리턴 해준다.
만약, 이미 SingletoneJS.instance
가 할당되어 undefined가 아닌 경우에는
바로 SingletoneJS.instance
를 리턴한다.
Java 예시 코드
public class Singletone {
private Singletone() {}
private static class singleInstanceHolder {
private static final Singletone INSTANCE = new Singletone();
}
public static Singletone getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
singleInstanceHolder
클래스는 Inner Class로 선언되었기 때문에
Singleton 클래스가 Class Loader에 의해 로드 될 때 JVM에 올라가지 않다가,
getInstance()가 호출될 때 JVM 메모리에 로드되고 객체를 생성하게 된다.
JS와 Java의 싱글톤이 다른 이유
JS로는 몇번 구현 해본 적이 있어 익숙했고,
Java역시 별 다를 것 없을 거라 예상했다.
하는 역할과 결과물에서는 차이가 없지만, 구현하는 방식이 다르다.
JS에서 사용하는 방식은 동시에 여러 곳에서 호출하게 된다면 동기화 문제가 발생할 수 있다.
물론, 싱글스레드 환경인 JS에서는 그럴일이 없다.
하지만 Java는 multi-thread 환경이기 때문에 해당 문제가 발생할 수 있기에,
위의 방식을 사용한다.
클래스가 JVM에 올라갈 때, 인스턴스가 생성되므로 동기화 문제없이 multi-thread 환경에서도 사용이 가능하다.
싱글톤의 장점
- 인스턴스를 생성하는 비용이 줄어든다.
- 사용하기 쉽고 실용적이다.
싱글톤의 단점
단위테스트가 어렵다.
단위테스트
단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트
싱글톤패턴의 특성상 미리 생성된 하나의 인스턴스를 기반으로 구현하기 때문에
각각의 단위테스트 마다 독립적인 인스턴스를 만들기가 어렵다.
의존성이 높아진다.
싱글톤의 또 다른 단점은 모듈간의 결합을 강하게 만들 수 있다는 점이다.
이때 의존성 주입을 통해 모듈 간의 결합을 느슨하게 만들어 해결할 수 있다.
의존성 주입
메인 모듈이 직접 다른 하위 모듈에대한 의존성을 주는 것이 아닌,
중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 간접적으로 의존성을 주입하는 방식
의존성 주입의 장점
- Unit Test가 용이해진다.
- 코드의 재활용성을 높여준다.
- 객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.
- 객체 간의 결합도이 낮추면서 유연한 코드를 작성할 수 있다.
Spring의 Singletone과 DI
따로 포스팅할 거임.