스프링 컨테이너와 빈(Bean)
스프링은 컨테이너(Container)라는 특별한 공간에 객체들을 담아서 관리합니다. 이 컨테이너 안에 담겨 스프링에 의해 관리되는 객체들을 빈(Bean)이라고 합니다. 스프링 컨테이너는 빈의 생명주기(생성, 초기화, 소멸)를 관리하고, 필요한 곳에 빈을 주입해주는 등 다양한 기능을 제공합니다. @Bean, @Component, @Configuration은 모두 빈을 스프링 컨테이너에 등록하는 방법과 관련이 있습니다.
Bean, @Component vs @Configuration
스프링 부트로 개발을 하다보면 @Bean, @Component, @Configuration 과 같은 어노테이션을 자주 접하게 됩니다. 이 어노테이션들은 스프링의 핵심 개념인 IoC(Inversion of Control, 제어의 역전) 및 DI(Dependency Injection, 의존성 주입)를 구현하는 데 중요한 역할을 합니다. 하지만 각 어노테이션의 차이점과 실무에서의 활용 방식에 대해 헷갈리는 경우가 많습니다.
이번 블로그 글에서는 @Bean, @Component, @Configuration 어노테이션의 개념과 차이점을 살펴보고, 실무에서 어떻게 활용하면 좋은지, 그리고 자주 묻는 질문들을 통해 각 어노테이션에 대한 이해를 높여보겠습니다.
@Component: 스프링 컴포넌트를 선언하다
@Component 어노테이션은 자바 클래스가 스프링 컴포넌트임을 나타내는 일반적인 어노테이션입니다. 즉, 스프링 컨테이너가 이 어노테이션이 붙은 클래스를 스캔하여 자동으로 빈으로 등록하도록 지시합니다.
@Component는 @Service, @Repository, @Controller와 같은 스테레오타입 어노테이션의 부모 어노테이션입니다. @Service는 서비스 계층, @Repository는 데이터 접근 계층, @Controller는 웹 계층의 컴포넌트를 나타내는데, 이들은 모두 내부적으로@Component를 포함하고 있습니다. 따라서 @Service, @Repository, @Controller 어노테이션을 사용하는 것은 해당 클래스가 스프링 컴포넌트임을 나타내는 것과 동시에, 해당 계층의 특징을 나타내는 추가적인 의미를 부여하는 것입니다.
@Component // 이 클래스를 스프링 빈으로 등록
public class MyComponent {
// ...
}
@Service // 서비스 계층 컴포넌트 (내부적으로 @Component 포함)
public class MyService {
// ...
}
@Configuration: 설정 클래스를 정의하다
@Configuration 어노테이션은 자바 클래스가 스프링 설정 클래스임을 나타냅니다. 설정 클래스는 주로 @Bean 어노테이션을 사용하여 빈을 수동으로 등록하는 데 사용됩니다.
@Bean: 빈을 직접 생성하고 등록하다
@Bean 어노테이션은 메소드 레벨에서 사용되며, 해당 메소드가 반환하는 객체를 스프링 빈으로 등록하도록 지시합니다. @Configuration 어노테이션이 붙은 클래스 내에서 @Bean 어노테이션을 사용하여 빈을 직접 생성하고 등록할 수 있습니다.
@Bean 어노테이션을 사용하는 주요 이유
- 외부 라이브러리 또는 프레임워크의 클래스를 빈으로 등록할 때:
- 스프링이 직접 관리하지 않는 외부 라이브러리의 클래스는 @Component 스캔 대상이 아니므로, @Bean 어노테이션을 사용하여 빈으로 등록해야 합니다.
- 빈의 생성 과정을 직접 제어하고 싶을 때:
- 객체 생성 시 특정 로직을 추가하거나, 설정 값을 주입하는 등 빈의 생성 및 초기화 과정을 세밀하게 제어해야 할 때 @Bean 어노테이션을 사용합니다.
- 조건부 빈 생성:
- 특정 조건에 따라 다른 빈을 생성하고 싶을 때 @Conditional 어노테이션과 함께 사용할 수 있습니다.
- 팩토리 패턴 구현:
- 팩토리 클래스의 메소드에 @Bean 어노테이션을 붙여서, 상황에 따라 다른 객체를 생성하고 빈으로 등록할 수 있습니다.
실제로 건강검진과 관련한 외부 API를 사용해보며, 해당 객체에 대해서 @Bean 관리를 해본 코드입니다.
@Slf4j
@Configuration
public class CodefConfig {
// ... (생략)
private EasyCodefServiceType easyCodefServiceType; // 필드
@Bean
public EasyCodef makeEasyCodef(){
EasyCodef codef = new EasyCodef();
// ... (EasyCodef 초기화 로직)
if ("API".equals(codefFlag)) {
this.easyCodefServiceType = EasyCodefServiceType.API;
} else {
this.easyCodefServiceType = EasyCodefServiceType.DEMO;
}
return codef;
}
@Bean
public EasyCodefServiceType makeServiceType(){
return this.easyCodefServiceType; // 필드 값 반환
}
}
실무에서의 활용:
@Configuration 클래스와 @Bean 어노테이션은 실무에서 매우 자주 사용됩니다. 특히, 외부 라이브러리와의 연동, 복잡한 객체 생성 로직, 조건부 빈 생성, 다형성을 활용한 전략 패턴 구현 등 다양한 상황에서 유용하게 활용될 수 있습니다. 위에서 보여드린 예시외에도 데이터베이스 연결 설정, API 클라이언트 설정, 외부 서비스 연동 설정 등 다양한 설정 작업을 @Configuration과 @Bean을 통해 관리할 수 있습니다.
결론
@Bean 어노테이션은 스프링 빈을 직접 생성하고 관리하는 데 유용한 도구입니다. @Configuration 클래스 내에서 @Bean 메소드를 사용하여 외부 라이브러리 연동, 복잡한 객체 생성, 조건부 빈 생성 등을 효과적으로 처리할 수 있습니다. 실무에서 @Bean과 @Configuration을 적절히 활용하면 코드의 재사용성, 유지보수성, 테스트 용이성을 높일 수 있습니다.
@Configuration , @Bean 사용시 수동으로 스프링 컨테이너에 빈을 등록
@Component 사용시 자동으로 스프링 컨테이너 빈에 등록
- @Component 하위 어노테이션으로 @Configuration, @Controller, @Service, @Repository 등이 있음
'개발일지 > JAVA,SPRING' 카테고리의 다른 글
| 📌 Java 접근 제어자(private / default / protected / public) 완전 정리 (0) | 2025.12.12 |
|---|---|
| JAVA, JDK 에 대한 진실. (1) | 2025.05.20 |
| JAVA , 추상화,인터페이스 와 캡슐화 다루기. (0) | 2025.05.19 |
| 쿠키,세션 알아보기 (With Spring) (2) | 2025.05.19 |