반응형
싱글톤 패턴
싱글톤 패턴이란 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
public class SingletonService {
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance() {
return instance;
}
private SingletonService() {
}
}
위의 코드와 같이 인스턴스를 하나 고정해서 생성한 후에 getInstance 메서드를 통해서 인스턴스를 사용한다.
싱글톤의 단점
1. 의존성이 높아진다.
2. private 생성자 때문에 상속이 어렵다.
3. 테스트하기가 힘들다.
싱글톤 패턴을 다시올린이유는, 디자인 패턴을 공부하다 싱글톤 패턴을 만나게 되었는데, Spring도 싱글톤 패턴을 통해 구현한다고 들었던거같은데, 싱글턴 패턴의 단점을 어떻게 spring은 보완하면서 사용하는 거지? 라는 의문이 들어서였다.
Spring container
그럼 무슨차이냐?
Spring이 단순히 싱글톤을 자동으로 구현해 주는 것만은 아니다. Spring 컨테이너가 일반 싱글톤 패턴을 직접 구현하는 방식과 중요한 차이가 몇 가지 있어서, 그 차이를 통해 싱글톤 패턴의 단점을 보완하게 된다는 것이다.
1. 단순한 싱글톤 구현이 아닌, 유연한 싱글톤 관리
- 일반 싱글톤 패턴에서는 클래스 내부에서 인스턴스를 static으로 한 번 생성해놓고, 그 인스턴스를 계속 사용한다. 이런 방식은 모든 상황에 동일한 객체를 쓰게 만들기 때문에, 객체에 어떤 값이 남아 있거나 상태가 변하면 다른 곳에서도 그 변경된 상태를 그대로 보게 됩니다. 즉, 상태 공유로 인한 문제가 발생할 수 있다.
- Spring 컨테이너는 동일한 클래스라도 요청에 따라 다른 방식으로 객체를 관리할 수 있다. 기본적으로는 하나의 인스턴스를 사용하지만, 필요에 따라 새로운 객체를 만들거나, 특정 범위(Scope)에서만 사용되는 인스턴스를 따로 관리할 수 있다. 이를 통해 상태 공유 문제를 해결할 수 있다. 예를 들어, HTTP 요청마다 새로운 인스턴스를 만들도록 설정할 수도 있다.
2. 객체의 생명주기 관리
- 일반 싱글톤 패턴에서는 프로그램 시작 시 인스턴스를 만들어 메모리에 보관한다. 프로그램이 종료될 때까지 메모리에서 제거되지 않기 때문에 메모리 누수가 발생할 가능성이 있다.
- 반면에 Spring 컨테이너는 필요할 때 객체를 만들고, 필요가 없어지면 객체를 자동으로 제거할 수 있다. Spring은 객체 생명주기를 관리해, 더 이상 필요 없는 객체는 메모리에서 제거해주기 때문에 자원을 효율적으로 사용할 수 있게 된다.
3. 의존성 주입(DI)으로 유연한 연결 가능
- 일반 싱글톤 패턴에서는 객체가 다른 객체를 필요로 할 때 직접 생성하거나, 새로운 의존성을 추가하는 데 많은 제약이 있다. 코드에서 특정 객체를 직접 불러와야 하므로 유연하게 객체 간의 의존 관계를 설정하기 어렵다.
- Spring 컨테이너에서는 애플리케이션 설정만으로도 필요한 객체를 주입해주기 때문에, 각 클래스가 어떤 다른 객체를 필요로 하더라도 직접 생성할 필요가 없다. 이를 통해 유연한 의존성 관리가 가능해지고, 나중에 코드 수정 없이 필요한 인스턴스를 바꿀 수 있다.
4. 테스트 용이성
- 일반 싱글톤 패턴을 사용하면 같은 인스턴스가 계속 재사용되기 때문에, 테스트할 때 실제 객체와 동일한 인스턴스를 써야만 한다. 테스트마다 다른 설정으로 객체를 새로 만들 수 없기 때문에, 테스트 환경이 제한된다.
- Spring 컨테이너에서는 테스트 환경에 맞춰 객체를 주입하거나 Mock 객체를 넣을 수 있다. 즉, 테스트 환경에서도 싱글톤 인스턴스를 재정의하거나 다른 의존성을 주입하는 게 가능진다. 이는 테스트를 독립적이고 유연하게 진행할 수 있도록 도와준다.
이러한 점에서 Spring 컨테이너는 싱글톤 패턴의 단점을 보완하여 spring 을 작동시키고 있던 것이다.
반응형
'Spring' 카테고리의 다른 글
태태개발일지 - Spring 시작 (토비님) 기본 복귀하기 (1) | 2024.11.26 |
---|---|
태태개발일지 - 스프링부트 이해와 원리(토비님) (1) | 2024.11.25 |
태태개발일지 -Spring bean (2) | 2024.09.22 |
태태개발일지 - Spring? (0) | 2024.09.20 |
EntityListener (0) | 2023.09.03 |