싱글톤 컨테이너

정민기·2021년 5월 16일
0

스프링 핵심 원리

목록 보기
5/5

싱글톤 패턴

  • 클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴이다.
  • 아래 코드는 싱글톤 패턴의 예시 코드이다.
public class Singleton {
	private static final Singleton instance = new Singleton();
    	//private 생성자
    	private Singleton(){
        }
        //publice으로 만든 함수로 객체 인스턴스가 필요하면 이 static 메소드를 통해서만 조회 가능
        public static Singleton getInstance(){
        	return instanc;
        }
}
  • static 키워드를 사용하여 메모리 할당을 딱 한번만 하게 한다. 따라서 static 영역에 객체를 딱 1개만 생성한다. 또한 final 키워드를 사용하여 값을 변경하는 것도 막는다. 그리고 private 생성자를 통해 외부에서 임의로 new 키워드를 사용하지 못하도록 막는다.

싱글톤 패턴의 문제점

  • 싱글톤 패턴을 구현하기 위해 코드가 많이 필요하다.
  • 의존관계상 클라이언트가 Singleton Instance를 만드는 구체 클래스에 의존한다. 따라서 DIP(의존성역전)와 OCP(개방 폐쇄)를 위반한다.
  • 테스트하기 어렵다.
  • 내부 속성을 변경하거나 초기화하는 것이 어려워 유연성이 떨어진다.


싱글톤 컨테이너

  • 스프링 컨테이너는 위와 같은 싱글톤 패턴의 문제점을 해결하면서 객체 인스턴스를 싱글톤 패턴으로 관리한다. 즉 스프링 빈은 싱글톤으로 관리되는 빈이다.
  • 스프링 컨테이너는 싱글톤 컨테이너 역할을 하고, 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
  • 따라서 스프링 컨테이너는 DIP, OCP, 테스트, private 생성자라는 단점으로부터 자유롭게 싱글톤을 사용할 수 있다.



싱글톤 방식의 주의점

  • 싱글톤 방식은 객체 인스턴스를 하나만 생성해서 공유하는 방식이다. 따라서 여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계해서는 안된다.
  • 즉 무상태(stateless)로 설계해야한다.
    • 특정 클라이언트에 의존적인 필드가 있어선 안된다.
    • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.
    • 따라서 읽기만 가능해야한다.
    • 필드 대신 자바에서 공유되지 않는, 지역변수, Parameter, ThreadLocal 등을 사용해야 한다.


@Configuration과 싱글톤

  • 스프링 컨테이너는 싱글톤 레지스트리이다. 하지만 스프링이 자바 코드까지 컨트롤하지는 못한다. 따라서 스프링은 클래스의 바이트를 조작하는 라이브러리를 사용하여 스프링 빈이 싱글톤이 되독록 보장해준다.
  • 만약 @Configuration이 적용된 스프링 빈의 정보를 조회한다면 아래와 같다.
    bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd982d120
  • 이때 클래스명 이외에 $$EnhancerBySpringCGLIB$$bd982d120와 같은 값이 붙는데 이것은 스프링이 CGLIB라는 바이트 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한 것이다.
  • CGLIB는 @Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 그 빈을 반환하고, 스프링 빈이 없으면 생성하여 스프링 빈에 등록하고 반환한다. 따라서 싱글톤이 보장된다.
  • 이때 만약 @Configuration이 적용되지 않고 @Bean만을 사용한다면 스프링 빈에는 등록이 되지만 CGLIB가 작동하지 않아 싱글톤이 보장되지 않는다.



[Reference]

Inflearn 김영한 님의 스프링 핵심 원리 - 기본편 : https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard

0개의 댓글

관련 채용 정보