싱글톤이란 객체가 JVM 안에 한 개만 존재하는 것이다.
싱글톤이 필요한 이유는 예를들어
웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.
클라이언트 A memberService 호출 → new MemberServiceImpl 반환
클라이언트 B memberService 호출 → new MemberServiceImpl 반환
클라이언트 C memberService 호출 → new MemberServiceImpl 반환
고객이 3번 요청 → 객체를 3번 만들어서 반환 (문제점 발생)
위의 예제에서는 3번뿐이지만 MemberServiceImpl를 생성하기 위해 또 다른 객체를 생성해야 한다면
더 큰 낭비를 발생시킨다.
해결 방안은 해당 객체를 한 번만 생성하고 이것을 공유하게 동작시키면 된다 → 싱글톤 패턴
public class SingletonService() {
private static final SingletonService instance = new SingletonService();
public static getInstance() {
return instance;
}
// private를 사용해서 객체 생성을 못하도록 막는다.
private SingletonService() {
}
}
초기에 instance를 생성해두고 getInstance()를 통해 생성되어있는 SingletonService 객체를 반환받는다.
이외에도 싱글톤 패턴을 구현하는 방법은 다양하다고 한다. (위의 예제는 미리 생성해두지만 요청 시에 생성하는 등)
싱글톤 패턴 문제점
- 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
- 클라이언트가 구체 클래스에 의존한다 → DIP 위반
- 클라이언트가 구체클래스에 의존한다 → OCP 위반
- 미리 설정을 끝내 놓기 때문에 테스트가 어려움
- 내부 속성을 변경하거나 초기화하기 어려움
- 결론적으로 유연성이 떨어진다.
하지만 스프링 컨테이너를 사용하면 객체를 싱글톤 컨테이너로 관리해 준다.
(@Configuration 사용 시 스프링의 기본 빈 등록 방식은 싱글톤)
또한 위의 문제점을 해결해준다.
싱글톤 방식의 주의점
여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지하게 설계하면 안 된다.(지역 변수와 같은 것을 사용하여 상태가 유지되지 않도록 설계를 한다.)
'Web' 카테고리의 다른 글
| IoC, DI, 컨테이너 (0) | 2022.03.29 |
|---|---|
| AppConfig (설정 정보) (0) | 2022.03.29 |
| JPA N+1 문제 (0) | 2022.03.16 |
| 관심사의 분리 (0) | 2022.03.13 |
| 좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2022.03.13 |