스프링 컨테이너란?
스프링의 싱글톤 컨테이너는 스프링 컨테이너가 기본적으로 각 스프링 빈을 애플리케이션 전체에서 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 |