Spring Framework에서 자주 등장하는 @Configuration
과 @Bean
어노테이션은 초보 개발자뿐만 아니라 경력 개발자도 명확히 구분하지 못하고 사용하는 경우가 많습니다. 하지만 두 어노테이션은 내부적으로 Spring Bean 설정 및 생명주기 처리 방식에서 중요한 차이를 갖고 있습니다.
@Configuration과 @Bean의 의미, 역할, 내부 처리 방식, 실무에서의 올바른 사용법을 알려드리겠습니다.
1. @Configuration: 설정 클래스 정의
@Configuration
은 해당 클래스가 Spring의 설정 클래스임을 선언하는 어노테이션입니다. 즉, Java 기반의 Bean 등록용 설정 클래스라는 의미이며, XML 설정을 대체하는 역할을 합니다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl();
}
}
위 예시에서 AppConfig 클래스는 설정 클래스이며, 내부에 정의된 메서드는 모두 @Bean
을 통해 Bean으로 등록됩니다.
2. @Bean: 개발자가 직접 등록하는 Bean
@Bean
은 Spring Container에 등록할 객체(Bean)를 직접 생성하고 반환하는 메서드에 붙이는 어노테이션입니다. 즉, 개발자가 제어권을 가지고 명시적으로 빈을 생성할 수 있게 도와주는 도구입니다.
@Component
나 @Service
와는 달리, 자동 스캔 대상이 아니며, 직접 인스턴스를 생성하고, 원하는 파라미터를 주입하거나 초기화 과정을 제어할 수 있다는 장점이 있습니다.
@Bean
public DataSource dataSource() {
return new HikariDataSource(); // 설정 커스터마이징 가능
}
3. 가장 중요한 차이점 – CGLIB 프록시와 싱글톤 보장
많은 개발자들이 간과하는 차이점은 바로 Spring 내부의 빈 생명주기 및 프록시 처리 방식 입니다.
@Configuration은 CGLIB 프록시로 관리
@Configuration
이 붙은 클래스는 Spring이 CGLIB 기반의 프록시 객체로 생성합니다. 이를 통해 @Bean
메서드 간 호출 시 싱글톤이 보장되도록 처리합니다.
@Configuration
public class AppConfig {
@Bean
public A a() {
return new A();
}
@Bean
public B b() {
return new B(a()); // 이 호출은 CGLIB을 통해 Spring Context에서 꺼냄
}
}
이 덕분에 B
가 내부적으로 A
를 호출하더라도, 항상 동일한 A 인스턴스(싱글톤)가 사용됩니다.
@Bean만 사용하면 싱글톤이 보장되지 않음
public class AppConfig {
@Bean
public A a() {
return new A();
}
@Bean
public B b() {
return new B(a()); // 직접 호출 → 매번 new A()로 인식됨
}
}
이 경우 Spring은 AppConfig를 일반 자바 객체로 인식하여 a()
호출 시 마다 새 객체를 반환합니다. 결과적으로 A가 두 번 생성되고, 싱글톤이 깨질 수 있습니다.
결론: 항상 @Bean은 @Configuration 안에서 사용하는 것이 안전합니다.
4. 실무에서의 Best Practice
- Bean 등록이 필요할 땐 항상 @Configuration 클래스 내부에서 @Bean으로 정의하세요.
- 테스트 코드에서는 굳이 @Configuration을 안 써도 되지만, 실 서비스 코드는 반드시 써야 합니다.
- 컴포넌트 스캔이 아닌, 외부 라이브러리나 동적으로 생성한 객체를 등록할 때 유용합니다.
5. 둘은 항상 세트로 기억하자
@Bean
은 단독으로 쓰일 수 있지만, 싱글톤 보장이라는 Spring의 핵심 철학을 유지하기 위해서는 반드시 @Configuration
과 함께 사용해야 합니다.
특히, 설정 클래스 내부에서 Bean 간 의존성이 존재할 경우 @Configuration
의 CGLIB 프록시 기능이 제대로 동작하지 않으면 심각한 버그로 이어질 수 있습니다.
실무에선 항상 두 개를 세트로 이해하고 사용하세요.
'개발 > JAVA' 카테고리의 다른 글
Spring Boot에서 SLF4J와 Logback으로 로깅 설정하기 (0) | 2025.09.25 |
---|---|
Spring Boot DevTools 활용하기 – 개발 생산성을 높이는 자동 리로드 기능 (0) | 2025.09.24 |
Spring Profile로 환경별 설정 관리하기 – 개발자라면 꼭 알아야 할 환경 분리 전략 (0) | 2025.09.22 |
@Autowired vs 생성자 주입 – 스프링 DI에서 가장 많이 묻는 질문 (0) | 2025.09.21 |
@Component, @Service, @Repository 차이 – 스프링 개발자를 위한 실전 가이드 (0) | 2025.09.20 |