싱글톤이란?
- JVM 내부에 하나의 객체 인스턴스만 존재해야 한다.
1. 웹 어플리케이션에는 왜 싱글톤을 사용하는가?
- 웹 어플리케이션은 보통 여러 고객이 동시에 요청을한다.
- 싱글톤이 아니라면
- 고객 3명이 요청하면 인스턴스 3개를 만들어버리는 문제
- n명이 요청하면 n개를 만든다.
- 메모리 낭비가 심하다.
해당 객체는 딱 하나만 생성하고, 공유되게 사용하자. (싱글톤)
2. 싱글톤 패턴
static 영역에 미리 생성한 뒤, 이를 getInstance로 하여 가져와 사용하는 방법
- JVM ClassLoader 가 로딩하는 과정에서, static 영역을 static 영역에 집어넣을 때, new SingletonService() 를 수행하여 넣어놓는다.
- static 로딩과정에 한번만 생성됐으며,
- getInstance로 하여 가져오므로 싱글톤이다.
- 생성자는 private 으로 만들어, 외부에서 객체 생성을 막는다.
public class SingletonService {
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance() {
return instance;
}
private SingletonService() {
}
}
싱글톤 패턴의 문제
- 구현하는 코드가 필요하다.
- 테스트하기가 어렵다.
- 이미 설정이 다 끝나있음
- 자식 클래스를 만들기 어렵다.
- 유연성이 떨어진다.
- 안티패턴으로 불리기도 한다.
3. 싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, Default 로 객체를 싱글톤으로 관리한다.
- 이처럼, 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
스프링 컨테이너는 싱글톤 패턴의 모든 단점을 해결하면서 싱글톤으로 유지할 수 있다.
- 싱글톤 패턴 코드 필요 없음
- DIP/OCP/테스트/private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.
4. 싱글톤 방식의 주의점
여러 클라이언트가 하나의 인스턴스를 공유하기 때문에, stateful 하게 설계해서는 안된다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.
- 가급적으로 읽기만 가능해야한다.
- 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
5. @Configuration 과 바이트코드 조작
@Configuration 이 붙은 설정 클래스 파일은
- 스프링이 CGLIB 을 사용하여 바이트코드 조작을 통해서
- AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 다른 클래스를 스프링 빈으로 등록한다.
@Configuration 내부에 있는 @Bean으로 등록되는 빈들은
- 바이트 코드 조작이 되어 객체를 반환하여 빈으로 등록하는 경우에는, 싱글톤으로 한번만 등록되도록 한다.
번외
- 스프링 빈도 객체라면 GC의 대상이므로 삭제되지 않을까?
- GC의 대상이 되려면 참조하는 포인터가 없어야 한다.
- 싱글톤 빈은 스프링 컨테이너가 계속 참조하고 있음
- 스프링 컨테이너는 우리 어플리케이션의 어디선가 계속 참조하고 있음
- 종료될 때까지 사라지지 않는다.
'강의 정리 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
7. 빈 스코프 (0) | 2020.12.24 |
---|---|
6. 빈 생명주기 콜백 (0) | 2020.12.23 |
4. 컴포넌트 스캔 (0) | 2020.12.17 |
2. 스프링 컨테이너와 스프링 빈 (0) | 2020.12.13 |
1. 객체지향 설계와 스프링 (0) | 2020.12.12 |