싱글톤 패턴은 무엇인가?
싱글톤 패턴 (Singleton)
--
싱글톤 패턴은
하나의 클래스는 오직 하나의 객체(인스턴스)만 생성하고, 해당 객체에는 누구나(전역적) 접근이 가능하도록 보장한다.
원래는 하나의 클래스로 여러 객체를 생성할 수 있지만, 그렇게 하지 않고 단 하나의 객체만 생성하고,
해당 객체를 기반으로 로직을 구성하기 위해 사용하는 패턴이다.
주로 자원 관리가 필요한 경우(DB 연결, 설정 관리 등)에
해당 데이터를 관리하는 객체 하나만 생성하여 여러 곳에서 공유하여 사용할 때 유용하다.
간단하게 생각하면
여러 곳에서 공통으로 사용할 데이터를 관리하는 객체를 하나 만드는 것이다.
장단점
- 객체를 생성하는 비용이 줄어든다.
- 의존성이 높아진다.
- 주로 단위 테스트를 하는 TDD 할 때 걸림돌이 된다.
(단위 테스트는 서로 독립적으로 어떤 순서로든 실행할 수 있어야 하지만, 싱글톤은 미리 생성한 (공용)객체를 기반으로 구현된 패턴이므로 테스트할 때마다 독립적인 객체로 만들기 어렵다.)
TDD는 주로 단위 테스트를 하는데,
단위 테스트는 각 테스트가 서로 독립적이고, 어떤 순서로든 실행할 수 있어야 한다.
다만 싱글톤은 미리 생성된 (공용)객체를 기반으로 구현하는 패턴이므로,
매번 테스트할 때마다 독립적인 객체를 만들기 어렵다.
즉, 모든 테스트는 다른 테스트에 영향을 주지 않고 독립적으로 수행하며 항상 동일한 결과를 나타내야 하지만
싱글톤은 모든 테스트에 객체를 공유하여 사용하므로,
A 테스트에서 해당 객체의 상태를 변경하면 B테스트에서도 해당 상태가 적용되어 영향을 미치게 된다.
그래서 각 테스트가 독립적으로 실행되기 어려줘 진다.
예시 코드
public class SingletonService {
private static final SingletonService instance = new SingletonService(); // 이미 객체 생성 생성해둠
private SingletonService() {} // private 생성자로 일반적인 객체 생성 불가
public static SingletonService getInstance() { // 이미 생성된 객체를 해당 메서드를 통해 사용
return instance;
}
public String serve() {
return "Serving from Singleton";
}
}
// Test case
public class SingletonServiceTest {
@Test
public void testServe() {
SingletonService singleton = SingletonService.getInstance(); // 싱글톤 객체 생성 (이후로는 생성 불가)
assertEquals("Serving from Singleton", singleton.serve());
}
}
싱글톤은 위 코드를 보면 알 수 있듯이
SingletonService 클래스 내부에서 미리 해당 객체를 생성해 두고,
static final를 통해 클래스 로딩 시 딱 한 번만 객체를 생성하고 해당 객체는 전역적으로 공유하여 사용할 수 있다.
private로 외부에서 접근이 불가능하도록 해당 클래스 내부의 getInstance() 메서드를 통해서만 접근하게 했다.
생성자에 private으로 지정하여 외부에서 생성자에 접근하지 못하도록 하여
해당 싱글톤 클래스의 객체를 생성하지 못하도록 막았다.
getInstance() 메서드를 통해서만 이미 만들어 놓은 객체를 사용할 수 있도록 한 구조며,
해당 메서드는 static으로 인해 객체를 통해 메서드를 호출하지 않고 클래스 차원에서 호출을 할 수 있어진다.
즉, 객체를 통해 해당 메서드를 사용할 수 있는 것이 아닌 클래스를 통해 바로 사용할 수 있다.
이로써 해당 싱글톤 클래스는
단 하나의 개체만 생성하고 이를 공유해서 사용할 수밖에 없는 구조가 되었다.
다만 TDD를 수행할 때에는
독립적으로 개별 테스트를 진행해야 하는데 SingletonService 객체를 모든 테스트에서 공유되므로
테스트 간 상태를 공유할 수 있어 문제가 발생할 수 있다.
--
'Terminology' 카테고리의 다른 글
SOP와 CORS (+ Origin) (0) | 2024.11.06 |
---|---|
[디자인 패턴] 팩토리 메서드 패턴 (Factory Method) (1) | 2024.11.01 |
디자인 패턴 (1) | 2024.10.28 |
의존성 주입 (DI, Dependency Injection) (+ IoC, DIP) (0) | 2024.10.27 |
SOLID 원칙 ( 객체 지향 설계 원칙) (1) | 2024.10.26 |