해당 내용은 김영한 스프링 핵심원리 기본 강의를 들으며 강의 자료를 참고하여 정리한 내용입니다.
스프링은 기업용 온라인 서비스 지원을 목적으로 개발되었으며, 대부분의 스프링 애플리케이션은 웹 애플리케이션으로 구현된다. 웹 애플리케이션은 여러 고객의 동시 요청을 처리한다. 이는 고객 요청마다 객체를 새로 생성하게 되어 메모리 사용량이 증가하는 문제를 야기한다. 예를 들어, 초당 5만 건의 트랜잭션이 발생한다면, 그만큼의 객체가 생성되어 메모리에 쌓이고, 이는 가비지 컬렉션(GC)에 의한 성능 저하를 초래할 수 있다.
싱글톤 패턴은 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 디자인 패턴이다. 이를 위해 private 생성자를 사용하여 외부에서의 객체 생성을 차단한다.
getInstance() 메서드를 통해서만 인스턴스에 접근 가능.스프링 컨테이너는 싱글톤 패턴의 단점을 해결하면서, 객체 인스턴스를 싱글톤으로 관리한다. 이를 위해 @Configuration과 @Bean 어노테이션을 사용하여 싱글톤을 유지한다.
@Configuration 어노테이션을 사용하지 않을 경우, 싱글톤 보장이 되지 않는다.@Configuration 클래스를 상속받은 프록시 객체를 생성하고, 이를 통해 싱글톤을 보장한다.@Bean 메서드가 static으로
선언되었을 때 싱글톤이 보장되지 않을 수 있다. 이 경우 스프링은 빈 인스턴스를 생성하기 위해 static 메서드를 먼저 호출한다.