🌿 스프링/김영한

3. 스프링의 싱글톤 컨테이너

le2donguk 2026. 2. 8. 01:36

스프링 컨테이너란?

스프링의 싱글톤 컨테이너는 스프링 컨테이너가 기본적으로 각 스프링 빈을 애플리케이션 전체에서 1개만 생성해서 공유하도록 관리하는 구조다. 그래서 여러 요청이 와도 같은 객체 인스턴스를 재사용해서 성능과 메모리 효율을 높인다.

 

 

 

@Configuration과 싱글톤 보장 원리

스프링 컨테이너는 기본적으로 빈을 싱글톤으로 관리하는 싱글톤 레지스트리다.

따라서 같은 타입의 빈은 항상 하나의 인스턴스만 생성되어야 한다.

 

하지만 자바 설정 클래스에서 @Bean 메서드끼리 서로 직접 호출하면 일반 자바 메서드 호출이기 때문에 객체가 매번 새로 생성될 수 있다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

만약 이 코드에서 @Configuration이 없으면 memberService()는 내부에서 memberRepository()를 호출한다.

  • memberService() 안에서 memberRepository()를 그냥 직접 호출
  • 호출할 때마다 new MemoryMemberRepository() 실행
  • 서로 다른 인스턴스 생성
  • 싱글톤 보장 깨짐

즉, 설정 클래스가 “그냥 일반 클래스”처럼 동작한다.

스프링의 장점인 싱글톤이 사라지게 된다..

이 문제를 해결하기 위해 사용하는 것이 @Configuration이다.

 

 

 

@Configuration의 역할

@Configuration이 붙은 설정 클래스는 그대로 스프링 빈으로 등록되지 않는다.
스프링은 CGLIB을 사용해서 해당 클래스를 상속한 프락시 클래스를 새로 만들어 컨테이너에 등록한다.

 

이 프록시 클래스(CGLIB)는 @Bean 메서드를 가로채서 다음과 같이 동작한다.

  • 이미 컨테이너에 해당 빈이 있으면 → 기존 빈을 반환
  • 컨테이너에 없으면 → 객체 생성 후 컨테이너에 등록하고 반환

이 과정 덕분에 @Bean 메서드가 여러 번 호출되어도 항상 같은 객체가 반환되어 싱글톤이 보장된다.

 

 

 

CGLIB이란?

CGLIB은 바이트코드를 조작해서 클래스를 상속한 새로운 클래스를 동적으로 생성하는 라이브러리다.
말이 너무 어려운데... 결론적으로는 스프링은 이 라이브러리를 이용해 원본 클래스를 상속한 프락시 객체를 만들고, 메서드 호출을 중간에서 제어한다.

즉, 싱글톤을 유지하기 위해 사용한 라이브러리다 자세한 설명은 나중에 쓸 블로그에서 설명하겠다!!

지금은 그냥 싱글톤을 유지하기 위해서 원본이 아닌 그림자 분신이 사용된다!! 라고 생각하고 넘어가면 충분!!

 

 


정리

@Configuration은 설정 클래스를 CGLIB 프록시로 감싸서 @Bean 메서드 호출을 컨테이너를 통해 처리하도록 만들고, 그 결과 스프링 빈의 싱글톤을 보장한다.

'🌿 스프링 > 김영한' 카테고리의 다른 글

스프링의 구조 (WAS + Spring 컨테이너)  (0) 2026.02.12
4. 컴포넌트 스캔  (0) 2026.02.08
2. Bean팩토리와 ApplicationContext  (0) 2026.02.08
1. 스프링 컨테이너와 스프링 빈  (0) 2026.02.08
2. 서블릿  (0) 2026.02.07