[Spring] 싱글톤 패턴 사용 이유, 예시, 단점, 사용법
- 코딩/Spring
- 2022. 5. 6.
싱글톤 패턴(Singleton Pattern)은 디자인 패턴 중 하나로, 어떤 클래스가 최초 한 번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴입니다.
스프링 프레임워크에서는 빈(Bean)으로 등록된 객체들이 모두 싱글톤으로 관리됩니다. 즉, 스프링 컨테이너는 객체를 생성할 때, 최초 한 번만 생성하고, 이후에는 해당 객체를 계속 사용합니다.
싱글톤 패턴 사용 이유
1. 리소스 공유
어떤 클래스의 인스턴스를 여러 개 만들 경우, 그만큼 메모리를 많이 사용하게 됩니다. 하지만 싱글톤 패턴을 사용하면 하나의 인스턴스만 생성하여 필요한 모든 곳에서 공유하여 사용할 수 있습니다. 이렇게 하면 리소스를 효율적으로 사용할 수 있습니다.
2. 데이터 공유
여러 개의 인스턴스가 생성되면 데이터가 중복으로 생성될 가능성이 높아집니다. 그러나 싱글톤 패턴을 사용하면 하나의 인스턴스만 생성되므로 데이터 공유가 용이해집니다.
3. 전역 객체
싱글톤 패턴을 사용하면 전역 객체를 만들 수 있습니다. 이 객체는 어디서든지 접근 가능하며, 어느 곳에서든 공유해서 사용할 수 있습니다.
4. 상태유지
싱글톤 패턴을 사용하면 객체의 상태를 유지할 수 있습니다. 객체의 상태를 유지할 필요가 있을 때, 싱글톤 패턴을 사용하면 유용합니다.
5. 확장성
싱글톤 패턴을 사용하면, 해당 클래스를 싱글톤으로 만들어두면 이후에 해당 클래스를 확장하기 쉬워집니다. 싱글톤으로 만들어진 클래스는 어디서든 접근 가능하므로, 해당 클래스를 확장하거나, 새로운 클래스를 추가하기 쉬워집니다.
싱글톤 패턴 단점
1. 테스트가 어렵다.
싱글톤은 전역 상태를 유지하므로 테스트를 어렵게 만듭니다. 싱글톤 객체에 대한 의존성이 있는 클래스를 테스트할 때, 싱글톤 객체의 상태가 다른 테스트 케이스에 영향을 미칠 수 있습니다. 이로 인해 테스트 케이스를 작성하기 어렵고, 테스트 커버리지가 낮아질 수 있습니다.
2. 멀티스레드 환경에서 문제가 발생할 수 있다.
싱글톤 객체는 전역 상태를 유지하므로, 멀티스레드 환경에서 여러 스레드가 동시에 접근할 경우 문제가 발생할 수 있습니다. 예를 들어, 하나의 스레드에서 객체를 수정하고 있는 동안 다른 스레드가 객체를 사용하면 예상치 못한 결과가 발생할 수 있습니다.
3. 객체 생성 시기를 제어할 수 없다.
싱글톤 객체는 애플리케이션이 처음 실행될 때 생성됩니다. 따라서 객체 생성 시기를 제어할 수 없습니다. 만약 객체가 많은 메모리를 사용하거나 초기화에 많은 시간이 걸리는 경우, 애플리케이션 시작 시간이 느려질 수 있습니다.
4. 객체 의존성이 높다.
싱글톤 객체는 전역 상태를 유지하므로, 다른 객체들이 이를 의존하는 경우 객체 간의 결합도가 높아질 수 있습니다. 이로 인해 코드 유지보수가 어려워지고, 객체의 재사용성이 떨어질 수 있습니다.
싱글톤 패턴 사용법
- 클래스의 생성자를 private으로 선언하여 외부에서 인스턴스를 생성하는 것을 막습니다.
- 클래스 내부에 private static 변수를 선언하여 클래스의 유일한 인스턴스를 저장합니다.
- 클래스 내부에 public static 메서드를 선언하여 클래스의 유일한 인스턴스에 접근할 수 있도록 합니다. 이 메서드는 클래스의 유일한 인스턴스를 반환합니다. 만약 인스턴스가 아직 생성되지 않은 경우에는 인스턴스를 생성합니다.
- 필요한 경우에 클래스의 인스턴스를 사용합니다.
싱글톤 패턴 예시
public class Singleton {
private static Singleton instance;
private Singleton() {
// 클래스 외부에서 인스턴스를 생성할 수 없도록 생성자를 private으로 선언
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// 클래스의 인스턴스를 사용하는 메서드들을 구현
}
'코딩 > Spring' 카테고리의 다른 글
[Spring] Jpa Paging 페이징 처리방법 (0) | 2022.11.07 |
---|---|
[Spring] 스프링 modelmapper Java Entity Dto 매핑 (0) | 2022.11.03 |
[Spring] ResponseEntity 사용법 (0) | 2022.05.06 |
[Spring] 스프링 예외 처리 방법 2가지(@ExceptionHandler, @ControllerAdvice) (0) | 2022.05.05 |
필드주입과 생성자주입의 차이, 장단점(생성자 주입 vs 필드 주입) (0) | 2022.05.05 |