프로그램 실행 내내 오직 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴.
즉, 객체를 딱 하나만 만들어서
모든 곳에서 똑같은 객체를 공유해서 사용하는 것
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {} // 외부에서 new 막기
public static Singleton getInstance() {
return instance;
}
}
Singleton.getInstance()를 호출하면 항상 같은 객체가 나온다.스프링 컨테이너에 등록하는 모든 @Bean은 싱글톤임.
| 대상 | 예시 |
|---|---|
@Component, @Service, @Repository, @Controller | 일반적인 빈들 (서비스, 컨트롤러 등) |
@Bean 메서드로 등록된 객체 | Java Config 파일의 빈 |
@Configuration 클래스 내부 객체 | Config 클래스가 프록시로 변환됨 |
| Spring Boot AutoConfiguration으로 등록된 빈들 | (ex) DataSource, Tomcat, DispatcherServlet |
@Component, @Service, @Repository 같은 빈을 기본적으로 싱글톤으로 만든다.static 접근하는 게 아니라, 의존성 주입(DI) 로 관리한다.@Service
public class MyService {
}
→ 스프링이 하나만 만들어서 계속 주입해준다.
→ "동시성 문제"가 발생한다.
싱글톤 객체는 "공유 객체"이기 때문에,
개인별로 달라지는 상태를 멤버 변수로 가지면 안 된다.
ex) DTO는 빈으로 선언하지 않았음.