@Configuration: 프록시 객체 생성을 통한 싱글톤 유지 보장

상위 맥락

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

핵심 정리

스프링은 기본적으로 빈을 싱글톤으로 관리합니다. 그런데 @Configuration 클래스 안에서 @Bean 메서드가 서로를 직접 호출하는 코드를 보면, 순수 자바 관점에서는 메서드 호출 때마다 새로운 객체가 생성될 것처럼 보입니다. 스프링은 이 문제를 해결하기 위해 @Configuration 클래스를 그대로 사용하지 않고 프록시 객체로 감쌉니다.

왜 프록시가 필요한가

예를 들어 어떤 @Bean 메서드가 다른 @Bean 메서드를 호출해 의존성을 주입한다고 가정합니다. 일반 자바 코드라면 그 메서드가 호출될 때마다 new 객체가 만들어질 수 있습니다. 그러나 스프링 컨테이너는 같은 빈을 여러 번 만들지 않고 하나의 인스턴스를 공유해야 합니다.

스프링은 @Configuration 클래스의 프록시를 생성하여 @Bean 메서드 호출을 가로챕니다. 그리고 먼저 컨테이너 안에 이미 등록된 빈이 있는지 확인합니다.

  • 이미 등록된 빈이 있으면 기존 빈을 반환합니다.
  • 등록된 빈이 없으면 실제 @Bean 메서드를 호출하여 객체를 생성합니다.
  • 생성한 객체를 컨테이너에 등록한 뒤 반환합니다.

일반 AOP 프록시와의 차이

@Configuration 프록시는 프록시라는 점에서는 AOP와 비슷해 보입니다. 하지만 목적은 다릅니다. 일반 AOP 프록시는 로깅, 트랜잭션, 캐싱 같은 횡단 관심사를 적용하기 위해 사용됩니다. 반면 @Configuration 프록시는 빈 생명주기와 싱글톤 보장을 위한 스프링 컨테이너 내부 장치입니다.

자료에서는 이 설정 클래스 프록시가 일반적인 AOP 프록시와 달리 SpringProxy 인터페이스를 구현하지 않으며, AopUtils.isAopProxy() 검사에서도 false가 나올 수 있다고 설명합니다.

연결되는 개념

@Configuration 프록시의 구체적인 생성 방식은 CGLIB 설정 클래스 상속에서 이어집니다. @Bean 메서드 호출 시 기존 빈을 반환하는 흐름은 03. Bean 메서드 호출 시 기존 등록 빈 반환에서 정리합니다.

한 문장 요약

@Configuration 프록시는 @Bean 메서드 호출을 가로채어 이미 등록된 빈을 반환하게 함으로써, 자바 메서드 호출 구조 안에서도 스프링 빈의 싱글톤을 유지합니다.

핵심 연결

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