싱글톤 패턴
클래스 인스턴스가 단 하나만 존재하는 것을 보장하는 디자인 패턴.
웹 어플리케이션과 싱글톤
웹 어플리케이션의 특성 중 하나는 다수의 클라이언트가 동시에 요청을 하는 경우가 많다는 것.
요청을 처리하는 클래스의 인스턴스를 싱글톤으로 관리하지 않으면, 각 요청마다 새로운 인스턴스를 만들어 처리하기 때문에 메모리 자원 낭비가 심각하고, 인스턴스마다 상태가 제각각이므로 관리하기가 힘들어진다.
웹 어플리케이션 개발이 주 목적인 스프링 역시 싱글톤 패턴을 지원한다.
+)
물론 스프링으로 다른 어플리케이션을 개발할 수도, 스프링 컨테이너에 싱글톤 패턴을 적용하지 않도록 별도 설정도 가능하다.
싱글톤 패턴 적용 방법
적용 방법은 간단하다.
- 클래스 영역에 객체를 하나 생성한다.
- 생성한 객체를 반환하는 getter 메서드를 선언한다.
- 생성자를 private로 설정한다.
이렇게 싱글톤 패턴을 적용하면 외부에서 임의로 인스턴스를 생성할 수 없고, 미리 생성해둔 객체만 사용하도록 강제할 수 있다.
아래는 싱글톤 패턴을 적용한 예시 코드다.
public class SingletonService {
// 관례상 싱글톤 인스턴스 이름은 instance
private static final SingletonService instance = new SingletonService();
private SingletonService() {
// 생성자를 private로 선언해서 외부에서 SingletonService 객체를 생성하지 못하도록 한다.
}
public static SingletonService getInstance() {
return instance;
}
public void logic() {
System.out.println("singletonService의 로직 실행");
}
}
싱글톤 패턴의 장단점
장점
- 시스템 자원을 절약할 수 있다.
- 각 요청마다 인스턴스를 새로 생성하는 것과 싱글톤 객체의 참조만 가져오는 것의 비용 차이는 수백 ~ 수천 배에 달한다. 즉 메모리 자원이나 성능 면에서 훨씬 효율적이다.
- 이미 만들어진 객체를 공유하므로 상태관리 및 유지보수 측면에서 효율적이다.
단점
- 싱글톤 패턴을 구현하는 추가 코드 작성이 필요하다. (클래스 변수 선언, getter() 등)
- 의존관계상 클라이언트가 구체 클래스에 의존한다 (SingletonService.getInstance()를 직접 호출해야 한다) -> DIP, OCP 위반
- 유연성이 떨어진다.
- 내부 속성을 변경하기 어려움
- private 생성자 때문에 자식 클래스를 생성하기 어려움
- 테스트하기 어려움
생각보다 단점이 많아 사용에 주의가 필요하다.
+) 지연 처리 방식
예제 코드는 클래스 변수를 선언하는 순간에 생성자를 호출하여 인스턴스를 생성한다.
이는 싱글톤 패턴을 구현하는 여러 방법 중 하나일 뿐이고, 실제 여러가지 방식으로 구현할 수 있다.
싱글톤 패턴을 구현하는 또 다른 방법으로, 요청이 들어왔을 때 인스턴스 생성 여부를 확인하고 인스턴스가 생성된 적 없으면 그때 생성하는 지연 처리 방식이 있다.
'[inflearn] 스프링 핵심 원리 - 기본편 > 섹션 5 - 싱글톤 컨테이너' 카테고리의 다른 글
@Configuration과 싱글톤 (0) | 2024.04.20 |
---|---|
싱글톤 컨테이너 (1) | 2024.04.20 |