[디자인 패턴] 옵저버, 프록시, 이터레이터, 노출 모듈 패턴
CS 스터디 내용을 정리하다가 첫 주제로 싱글톤 패턴을 마주했다. 디자인 패턴 중 가장 기본적이라고 생각되고 실제로 의존성주입과 관련해서 익숙하기도 해서 먼저 정리를 해볼까 한다.
싱글톤 패턴
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다. [출처: 위키피디아]
즉, 해당 인스턴스를 여러 모듈이 접근하여 만들더라도 오직 하나의 인스턴스만 사용한다는 것. 여러 메소드에서 하나의 변수를 사용해야 할 때 전역 변수를 선언하는 것과 비슷한 맥락이라는 느낌을 받았다.
언제 쓰나요?
이러한 싱글톤 패턴은 보통 하나의 인스턴스를 공유해서 사용해야 하는 경우에 많이 사용된다. 주로 데이터베이스 커넥션 풀과 같이 여러 번 초기화 될 필요가 없는 객체에 많이 쓰인다고 한다.
구현 (JAVA)
이러한 싱글톤 패턴을 구현하고 사용하는 방법은 다음과 같다.
public class Singleton {
// 정적 참조 변수(싱글톤 객체를 담을 변수)
private static Singleton singletonObject;
// private 생성자
private Singleton() {
}
// getInstance()
public static Singleton getInstance() {
if (singletonObject == null) {
singletonObject = new Singleton();
}
return singletonObject;
}
}
출처: https://ittrue.tistory.com/563 [IT is True:티스토리]
싱글톤 클래스 내부에 실제로 사용되는 인스턴스를 두고, 해당 인스턴스는 private으로 선언한다.
해당 인스턴스를 호출하기 위해서는 getInstance()
메소드를 호출해야 하며, 해당 메소드의 기능은 다음과 같다.
- 인스턴스가 없는 경우 새로운 인스턴스를 생성
- 인스턴스가 있는 경우 기존의 인스턴스 반환 이러한 방식으로 구현하게 되면, 언제 접근하더라도 하나의 인스턴스만 사용할 수 있게끔 구현할 수 있다.
장점
그렇다면 이런 싱글톤 패턴을 쓰면 어떤 장점이 있나?
- 메모리 측면에서의 장점 당연하게도 인스턴스의 개수가 적어지기 때문에 메모리를 줄일 수 있다.
- 속도 측면에서의 장점 인스턴스를 생성하는 데에 드는 시간적 이용을 단축할 수 있다. 하지만 장점만 존재하는 것은 아니다. 인스턴스가 하나로 공유되기 때문에 생기는 다양한 단점 또한 존재한다.
단점
- 결합도 증가
하나의 인스턴스를 참조한다는 것은 곧 결합도의 증가를 의미한다.
의존성 주입으로 결합도를 느슨하게 만들 수 있음. (의존성 주입은 추후 Spring boot 게시글로 정리할 예정)
-
테스트가 어려워진다. 주로 단위테스트가 진행되는데, 각각의 테스트가 독립적이지 않기 때문에 테스트가 어려워질 수 있다.
- 멀티쓰레드 환경에서의 동시성 이슈
서로 다른 쓰레드가 각각
getInstance()
메소드를 호출하는 경우, 두 개의 인스턴스가 생성될 가능성이 있다.
Leave a comment