싱글톤을 사용하는 이유?
만약 수십~ 수백만건의 요청이 발생하는 서비스에서 기존에 요청마다 인스턴스를 만드는 멀티톤 방식대로 동작하게 둔다면, 초당 생성되는 컨테이너 객체수를 메모리가 견디지 못하고(OOM 발생) 서비스는 큰 장애를 발생시키고 먹통이되고 말것이다. 그러므로 단일 인스턴스를 가지는 싱글톤 패턴을 적용해야한다.
싱글톤 패턴으로 구현하는 경우, 효율적인 메모리 사용이 가능하다.
하지만 공유자원을 동시접근 하는 경우, 동시성 문제가 발생할 수 있기 때문에 이를 유의해서 설계해야만 한다.
순수 java 코드로 싱글톤 패턴을 적용하기에는 실질적인 문제점들이 존재합니다.
- 싱글톤 패턴을 구현하기 위한 코드가 늘어남
- 인스턴스를 반환해주는 구현 클래스를 직접 참조해야 하므로 DIP를 위반한다. (OCP 원칙)
- 내부 속성을 변경, 초기화하기가 어렵다.
- private 생성자로 자식 클래스를 생성하기 어렵다.
- 유연성이 떨어진다.
* DIP?
의존성 역전 원칙 (DIP: Dependency Inversion Principle)
1. 상위 모듈은 하위 모듈에 의존해서는 안 되고 둘 다 추상화에 의존해야 한다.
2. 추상화는 세부 사항에 의존해서는 안 되고 세부사항(구체적인 구현)은 추상화에 의존해야 한다.
*OCP?
개방 폐쇄 원칙 (OCP :Open Closed Principle)
1. 개방 폐쇄의 원칙(OCP)이란 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다는 원칙을 말한다.
2. 보통 OCP를 확장에 대해서는 개방적(open)이고, 수정에 대해서는 폐쇄적(closed)이어야 한다는 의미로 정의한다.여기서 확장이란 새로운 기능이 추가됨을 의미한다.
따라서 해석하자면, 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법을 말한다고 보면 된다.
순수 java 싱글톤 패턴을 보완하기 위한 싱글톤 컨테이너
스프링에서는 사용자가 이렇게 일일이 구현하지 않고 싱글톤 패턴의 문제점들도 보완해주면서 싱글톤 패턴으로 클래스의 인스턴스를 사용하게 해 주는데 이것을 싱글톤 컨테이너라고 합니다.
스프링 컨테이너는 싱글톤 컨테이너의 역할을 하며 싱글톤 객체를 생성, 관리하는 주체를 싱글톤 레지스트리라고 부릅니다. 스프링 컨테이너의 기능으로 인해 순수 Java에서 싱글톤 패턴을 구현하기 위한 코드를 사용하지 않아도 되고 OCP원칙을 위배하지 않게 되었습니다.
싱글톤 패턴은 여러 클라이언트가 객체를 공유하므로 공유되는 객체는 어떠한 상태를 유지(stateful) 되게 설계하면 안 되고 다음과 같은 주의사항을 반드시 지켜야 합니다.
- 특정 클라이언트에 의존적인 필드가 있으면 안 된다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안 된다.
- 읽기만 가능해야 한다.
- 필드 대신 Java에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
'Spring' 카테고리의 다른 글
Spring library 스프링 라이브러리 (0) | 2023.03.02 |
---|---|
@Autowired 와 DI(Dependency Injection) (0) | 2023.02.15 |
Spring Annotation 정리 (1) | 2023.02.07 |
Spring Security 란? (0) | 2023.02.06 |
AOP(Aspect Oriented Programming) 란? (0) | 2023.02.06 |