CGLIB: 설정 클래스를 상속받아 빈 중복 생성 방지
상위 맥락
02. Proxy와 Singleton < 01. AOP와 빈 관리 원리 < 01. Spring MVC1 기초와 아키텍처 < MVC < Spring < Web
핵심 정리
스프링은 @Configuration 클래스를 사용할 때 CGLIB 기반의 프록시 클래스를 동적으로 생성합니다. 원본 설정 클래스를 그대로 빈으로 등록하는 것이 아니라, 그 클래스를 상속한 프록시 객체를 만들어 @Bean 메서드 호출을 제어합니다.
CGLIB가 하는 일
CGLIB는 클래스를 상속받는 방식으로 프록시를 생성합니다.
자료에서는 설정 클래스의 실제 런타임 이름이 CustomConfiguration$$SpringCGLIB$$0 같은 형태로 나타날 수 있다고 설명합니다.
이는 개발자가 작성한 원본 설정 클래스가 그대로 사용되는 것이 아니라, 스프링이 만든 프록시 클래스가 컨테이너 안에서 동작한다는 의미입니다.
이 프록시는 @Bean 메서드 호출을 중간에서 가로채고 다음 흐름을 수행합니다.
- 해당 빈이 이미 컨테이너에 있는지 확인합니다.
- 있으면 새로 만들지 않고 기존 빈을 반환합니다.
- 없으면 원본 메서드를 호출해 객체를 생성합니다.
- 생성된 객체를 스프링 빈으로 등록하고 반환합니다.
빈 중복 생성을 막는 이유
스프링은 빈을 기본적으로 싱글톤으로 관리합니다. 따라서 같은 의존성을 여러 빈에서 사용하더라도 객체가 여러 개 생기면 안 됩니다. CGLIB 프록시는 @Bean 메서드 호출이 반복되더라도 실제로는 컨테이너에 등록된 동일 인스턴스를 반환하도록 보장합니다.
일반 AOP와 구분할 점
CGLIB라는 단어가 나오면 AOP 프록시를 떠올리기 쉽습니다. 하지만 @Configuration에 사용되는 CGLIB 프록시는 일반적인 AOP 부가 기능 적용 목적이 아니라, 설정 클래스의 @Bean 메서드 호출을 제어하여 싱글톤을 보장하기 위한 목적입니다.
한 문장 요약
CGLIB는 @Configuration 클래스를 상속한 프록시를 만들어 @Bean 메서드 호출을 가로채고, 이미 등록된 빈을 반환함으로써 빈 중복 생성을 막습니다.