개발일지/JAVA,SPRING

@Bean 객체 만들기, @Component vs @Configuration

recording or reCoding 2025. 5. 23. 12:10

스프링 컨테이너와 빈(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 등이 있음