[Spring의 디자인 패턴] 1. 싱글턴 패턴

namkun·2023년 6월 8일
0

T-I-L

목록 보기
14/20

싱글턴 패턴?

보통 우리가 new 명령어로 객체를 생성하면 계속 다른 객체가 생성되지만 싱글턴 패턴을 적용한 클래스는 생성자가 여러번 호출되더라도 정작 생성되는 객체는 단 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

이러한 싱글턴 패턴은 불필요한 객체의 생성을 막아 메모리 누수를 방지한다.

공통된 오브젝트를 사용해야 하는 상황에서 특정한 하나의 오브젝트만 사용하게 해준다.

이러한 싱글턴 패턴의 문제점은 아래와 같다.

  • 싱글턴 패턴을 구현하려면 코드가 많아진다.
  • 멀티스레딩 환경에서는 동기화 문제가 발생할 수 있기에 따로 처리해줘야한다.
  • 의존관계상 클라이언트가 구체 클래스에 의존한다.
  • 테스트가 어렵다.
  • 내부 속성을 변경하거나 초기화하기가 어렵다.
  • private 생성자로 자식 클래스를 만들기가 어렵다.

스프링에서의 싱글턴

스프링에서는 싱글턴의 정의를 느슨하게해서 스프링 IoC 컨테이너 하나당 하나의 객체를 가지는 것을 싱글턴이라고 한다.

스프링에서는 컨테이너 내에서 특정 클래스에 대해 @Bean이 정의되면 스프링 IoC 컨테이너는 기본적으로 그 클래스에 대해서 딱 한 개의 인스턴스를 만든다.

해당 인스턴스는 설정 정보에 의해서 관리되고 bean이 호출될 때마다 스프링은 생성된 공유 인스턴스를 리턴해준다.

인스턴스의 생성 시점은 스프링 컨테이너에 따라서 달라지는데, 빈 팩토리는 최초 호출시점에서 인스턴스를 생성하고 (lazy loading), 애플리케이션 컨텍스트는 미리 모든 공유 인스턴스들을 초기화해 두었다가 호출될 때 리턴해준다.

예를 들어 @Autowired 어노테이션을 사용해서 여러 객체가 주입받은 것을 확인해보면, 모두 동일한 id를 갖고 있는 것을 확인할 수 있다.

만약 객체를 주입할 때 새로운 객체로 받고 싶다면 @Scope 어노테이션을 사용해서 protoType으로 지정해주면 된다.

@Scope(value="prototype")
profile
개발하는 중국학과 사람

0개의 댓글