CGLIB: 설정 클래스를 상속받아 빈 중복 생성 방지

상위 맥락

02. Proxy와 Singleton < 01. AOP와 빈 관리 원리 < 01. Spring MVC1 기초와 아키텍처 < MVC < Spring < Web

핵심 정리

스프링은 @Configuration 클래스를 사용할 때 CGLIB 기반의 프록시 클래스를 동적으로 생성합니다. 원본 설정 클래스를 그대로 빈으로 등록하는 것이 아니라, 그 클래스를 상속한 프록시 객체를 만들어 @Bean 메서드 호출을 제어합니다.

CGLIB가 하는 일

CGLIB는 클래스를 상속받는 방식으로 프록시를 생성합니다. 자료에서는 설정 클래스의 실제 런타임 이름이 CustomConfiguration$$SpringCGLIB$$0 같은 형태로 나타날 수 있다고 설명합니다. 이는 개발자가 작성한 원본 설정 클래스가 그대로 사용되는 것이 아니라, 스프링이 만든 프록시 클래스가 컨테이너 안에서 동작한다는 의미입니다.

이 프록시는 @Bean 메서드 호출을 중간에서 가로채고 다음 흐름을 수행합니다.

  1. 해당 빈이 이미 컨테이너에 있는지 확인합니다.
  2. 있으면 새로 만들지 않고 기존 빈을 반환합니다.
  3. 없으면 원본 메서드를 호출해 객체를 생성합니다.
  4. 생성된 객체를 스프링 빈으로 등록하고 반환합니다.

빈 중복 생성을 막는 이유

스프링은 빈을 기본적으로 싱글톤으로 관리합니다. 따라서 같은 의존성을 여러 빈에서 사용하더라도 객체가 여러 개 생기면 안 됩니다. CGLIB 프록시는 @Bean 메서드 호출이 반복되더라도 실제로는 컨테이너에 등록된 동일 인스턴스를 반환하도록 보장합니다.

일반 AOP와 구분할 점

CGLIB라는 단어가 나오면 AOP 프록시를 떠올리기 쉽습니다. 하지만 @Configuration에 사용되는 CGLIB 프록시는 일반적인 AOP 부가 기능 적용 목적이 아니라, 설정 클래스의 @Bean 메서드 호출을 제어하여 싱글톤을 보장하기 위한 목적입니다.

한 문장 요약

CGLIB는 @Configuration 클래스를 상속한 프록시를 만들어 @Bean 메서드 호출을 가로채고, 이미 등록된 빈을 반환함으로써 빈 중복 생성을 막습니다.

핵심 연결

AOP, 프록시와 함께 읽으면 좋습니다.