스프링 시큐리티를 사용하면서 @Configuration 어노테이션을 통해 시큐리티 설정을 등록했습니다.
그러나, 설정 클래스에 붙여서 spring이 컴포넌트 스캔에 이용하는구나 정도만 알기에 다시 알아보고자 합니다.
가장 먼저 어노테이션이 무엇인지부터 알아봅시다.
사전적 의미로는 주석입니다. 스프링에서는 마치 주석처럼 쓰면서 특별한 의미, 기능을 수행하도록 해주는 역할입니다. 프로그램에게 추가적인 정보를 제공하는 메타 데이터라고 볼 수 있습니다.
(meta data : 데이터를 위한 데이터)
마치 라벨을 붙이는 것 이라고 생각하면 쉽습니다.
예를들어 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공하거나, 실행시 특정 기능을 실행하도록 정보를 제공하는 역할을 합니다.
Target, Retention 과 같은 어노테이션은 아래 링크에 정리해 두었습니다.
어노테이션

위 사진은 @Configuration 어노테이션의 구성이고, 아래는 설명입니다.
Spring의 @Configuration 클래스와 관련된 빈 정의의 이름을 명시적으로 지정할 수 있습니다.
일반적으로 명시하지 않는 경우(Spring에서 자동으로 처리하는 경우), 빈 이름이 자동으로 생성됩니다.
사용자 지정 이름은 다음 두 가지 경우에만 적용됩니다.
컴포넌트 스캔을 통해 감지되는 경우
AnnotationConfigApplicationContext에 직접 제공되는 경우
하지만 @Configuration 클래스가 기존의 XML 기반 빈 정의로 등록된 경우, bean 요소의 name 또는 id 속성이 우선적으로 사용됩니다.
@Target(ElementType.TYPE) : 어노테이션이 적용 가능한 대상을 지정합니다.
현재 옵션은타입(클래스, 인터페이스, enum) 에 적용 가능하다는 의미입니다.
@Retention(RetenionPolicy.RUNTIME) : 어노테이션이 유지되는 기간을 지정하는데 사용됩니다. RUNTIME 은 프로그램 실행시에도 어노테이션이 유지되는 것입니다.
자세한 내용은 아래 링크에 정리하였습니다.
Retention
@Documented : 어노테이션에 대한 정보가 Javadoc으로 작성한 문서에 포함되도록 하는 것입니다.
@Component : 컴포넌트 스캐너의 스캔 대상으로 삼겠다는 의미입니다.
컴포넌트 스캔(Component Scan)은 스프링이 스프링 빈으로 등록될 준비가 된 클래스들을 탐색하여 빈으로 등록하는 과정입니다. Spring에서는 Spring Container라는 공간을 통해 Java 객체를 관리합니다. Spring에서는 관리되는 Java 객체를 Bean이라고 합니다.
Spring Container는 객체를 생성할때 싱글톤 스코프를 가지도록 객체를 관리하므로, 항상 동일한 인스턴스임을 보장받을 수 있습니다.
boolean proxyBeanMethods() default true;
@Configuration의 동작 방식이 CGLIB 라이브러리를 이용한 Proxy객체를 이용하는 것을 의미합니다. 기본 값은 Proxy를 이용하여 @Bean메서드를 호출합니다.
Spring은 @Configuration 클래스를 상속받아 CGLIB 프록시를 생성하고, @Bean 메서드를 프록시 객체를 통해 호출하도록 만듭니다.
이 방식은 싱글톤(Singleton) 보장을 위해 사용됩니다.
@Configuration
public class AppConfig {
@Bean
public ServiceA serviceA() {
return new ServiceA(serviceB());
}
@Bean
public ServiceB serviceB() {
return new ServiceB();
}
}
위 설정 클래스에서 serviceA() 내부에서 serviceB()를 호출하고 있지만, Spring은 내부적으로 CGLIB 프록시를 사용하여 싱글톤을 유지합니다.
내부적으로 인스턴스 호출시 메서드를 가로채서 객체 생성 메서드를 한번만 호출하고 싱글톤으로 관리하게 되는 것입니다.
👉 만약 CGLIB 프록시를 사용하지 않는다면?
serviceA()가 serviceB()를 직접 호출할 때마다 새로운 ServiceB 객체가 생성될 수 있음
결국 싱글톤이 깨질 가능성이 높아짐
이를 방지하기 위해, Spring은 @Configuration 클래스를 CGLIB 프록시 객체로 감싸서 관리합니다.
✅ 싱글톤 보장 → @Bean 메서드를 직접 호출해도 항상 같은 객체 반환
✅ 설정 클래스 간의 @Bean 참조 가능 → 다른 @Configuration 클래스에서 @Bean 메서드를 호출해도 프록시가 관리
🔸 주의할 점
⚠️ CGLIB을 사용하므로 설정 클래스와 메서드에 final 키워드를 사용할 수 없음
⚠️ 프록시를 통해 동작하기 때문에 약간의 오버헤드 발생