본문 바로가기
Spring

[Spring] 싱글톤 컨테이너와 @Configuration

by happyhelen 2021. 11. 28.

 

 

** 공유가 아닌 개인 공부에 목적을 둔 글입니다

** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다

 

 

 

 

싱글톤 패턴이란,

 

클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴으로, 

 

private 생성자를 사용해 외부에서 new 로 인스턴스 생성을 하지 못하도록 막는다

 

해당 인스턴스가 필요할 때는 메소드를 통해서만 조회할 수 있게 한다

 

 

그렇다면 왜 싱글톤 패턴이 필요할까?

 

호출을 할 때마다 새로 객체를 생성하면 메모리 낭비가 심한데,

 

동시에 여러 클라이언트가 서비스를 요청하는 것을 고려하면 느리고, 비효율적이다

 

그래서 하나의 인스턴스를 공유하도록 설계하는 것이 좋은 것이다

 

 

Spring 은 스프링 컨테이너를 통해 싱글톤 인스턴스를 기본으로 하는데, 스프링 빈이 그것이다

 

즉 스프링 컨테이너 = 싱글톤 컨테이너이고, 싱글톤으로 관리된 스프링 빈은 같은 참조값을 갖는다

 

 

싱글톤 패턴을 적용한 기본 클래스

 

 

단, 싱글톤 방식을 고려할 때 싱글톤 인스턴스는 상태를 stateful 하게 설계해서는 안된다

 

같은 인스턴스를 공유하기 때문에 한 클라이언트가 인스턴스 상태에 영향을 주어서는 안되기 때문이다

 

예를 들어, 메소드내 this.필드 를 통해 필드의 값을 변경하는 일은 없어야 한다 (공유필드를 조심)

 

스프링 빈은 항상 stateless (무상태) 로 설계하자

 

 

 

 

한편, 스프링이 싱글톤을 유지하려고 할 때, 클래스의 바이트코드를 조작하는 라이브러리를 사용한다

 

빈으로 등록된 클래스를 getBean() -> getClass() 로 출력해보면 클래스명에 CGLIB 이 붙어

 

내가 만든 클래스명보다 길어진 것을 확인할 수 있는데, 이는 스프링이 CGLIB 라는 바이트코드 조작 라이브러리를

 

사용해 해당 클래스를 상속받은 임의의 다른 클래스를 빈으로 등록한 것이기 때문이다

 

즉 스프링은 CGLIB 이 붙은 클래스를 통해 싱글톤을 보장하는 것이고 @Configuration 어노테이션이 그것이다

 

 

 

@Bean 만 적용할 시에는 싱글톤이 보장되지 않고,

 

CGLIB 없이 내가 만든 클래스가 그대로 빈으로 등록된 것을 확인할 수 있다

 

스프링 설정 정보는 항상 @Configuration 을 사용해야 한다