의존성 관계: @Bean 메서드 호출 시 기존 등록 빈 반환

상위 맥락

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

핵심 정리

@Configuration 클래스 안에서 @Bean 메서드가 다른 @Bean 메서드를 호출할 수 있습니다. 겉으로 보면 일반 자바 메서드 호출처럼 보이지만, 스프링은 설정 클래스 프록시를 통해 이 호출을 가로채고 컨테이너에 이미 등록된 빈을 반환합니다.

동작 흐름

@Bean 메서드 호출 시 프록시는 다음 순서로 동작합니다.

  1. 컨테이너에 해당 빈이 이미 등록되어 있는지 확인합니다.
  2. 이미 등록되어 있다면 실제 메서드 내부의 new 로직을 실행하지 않고 기존 빈을 반환합니다.
  3. 등록되어 있지 않다면 원본 @Bean 메서드를 호출해 객체를 생성합니다.
  4. 생성한 객체를 컨테이너에 등록하고 반환합니다.

이 흐름 때문에 설정 클래스 내부에서 어떤 @Bean 메서드를 여러 번 호출하더라도 결과적으로 하나의 싱글톤 객체가 유지됩니다.

의존성 주입과의 연결

이 방식은 자바 코드의 직관성을 유지하면서도 스프링 컨테이너의 원칙을 지키게 합니다. 개발자는 설정 클래스 안에서 메서드 호출 형태로 의존 관계를 표현할 수 있고, 스프링은 뒤에서 중복 생성을 막습니다.

즉, 개발자는 “이 객체는 저 객체에 의존한다”는 관계를 코드로 표현하고, 실제 객체의 생성 수와 생명주기 관리는 컨테이너가 담당합니다.

MVC 구조에서의 의미

컨트롤러, 서비스, DAO 같은 객체들이 모두 스프링 빈으로 관리될 때, 같은 의존성이 여러 곳에 주입되어도 컨테이너는 같은 싱글톤 인스턴스를 제공합니다. 이 안정적인 빈 관리 구조 위에서 Spring MVC의 요청 처리와 AOP 프록시가 동작합니다.

한 문장 요약

@Bean 메서드 호출은 단순한 자바 메서드 호출처럼 보이지만, 스프링 프록시가 개입하여 이미 등록된 빈을 반환함으로써 의존성 관계 안에서도 싱글톤을 유지합니다.

핵심 연결

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