Study/Spring Framework

[Spring] @Bean과 @Component의 차이점

jonghne 2024. 3. 18. 14:48

Spring 웹 애플리케이션을 개발할 때 특정 객체를 Spring 컨테이너가 관리하는 Bean으로 등록하고 싶은 경우에는 @Bean 어노테이션 또는 @Component 어노테이션을 사용합니다.

 

@Bean과 @Component 둘 다 Component Scan을 통해 Spring Bean으로 등록되고 Life Cycle이 관리되지만, 사용 방법과 용도에 따라 차이가 있습니다.

 

이번 포스팅에서는 이 두가지 방식이 어떤 차이를 가지는 지 알아보고자 합니다.

 

@Bean

먼저 @Bean 어노테이션은 메서드 레벨에 선언하는 어노테이션으로, 생성자 메서드를 통해 Spring Bean을 등록합니다. 

 

해당 어노테이션은 독립적으로 사용할 수 없고, 클래스 레벨에 @Component를 포함하고 있는 어노테이션을 함께 선언해서 Component Scan의 대상이 되도록 해야합니다. (ex) @Configuration, @Component, @Repository ..)

 

@Bean 어노테이션 사용 방법에 대해 간단한 예시로 알아보겠습니다.

 

다음은 Spring Bean으로 등록하고자 하는 Pen 클래스입니다. 

public class Pen {
    private String name;
    private int price;

    public Pen(String name, int price) {
        this.name = name;
        this.price = price;
    }
}

 

Pen을 Bean으로 등록할 클래스 파일을 생성하고, @Bean 어노테이션과 함께 Pen 객체의 생성자 메서드를 선언합니다. 

 

그리고 해당 클래스 파일에 @Configuration 을 선언해서 Component Scan의 대상이 되게 합니다.

 

(이때, @Component가 아닌 @Configuration을 사용하는 이유는 Bean 설정을 위한 클래스 파일이라는 것을 좀 더 쉽게 파악하기 위해서 입니다.)

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Configuration
public class BeanConfig {
    @Bean
    public Pen pen() {
        return new Pen("제트 스트림", 3000);
    }
}

 

@Component

@Component는 클래스 레벨에 선언하는 어노테이션으로, 별도의 설정 파일 없이 객체를 Spring Bean으로 직접 등록하는 방법입니다.

 

@Component 어노테이션이 붙은 객체는 Spring Container 생성 시점에 Component Scan의 대상이 되어 Spring Bean으로 등록되고 Life Cycle이 관리됩니다. (Bean이 등록되는 시점은 Bean Scope 에 따라 달라질 수 있습니다.)

 

위의 예시로 든 Pen 클래스에 대해 @Component 어노테이션만 추가로 선언하면, 별도의 설정 파일에 등록할 필요 없이 Spring Bean으로 등록됩니다.

import org.springframework.stereotype.Component;

@Component
public class Pen {
    private String name;
    private int price;

    public Pen(String name, int price) {
        this.name = name;
        this.price = price;
    }
}

 

참고로 개발 시 자주 사용되는 @Service, @Controller, @Repository와 같은 어노테이션도 내부에는 @Component 어노테이션이 선언 되어 있습니다.

 

해당 어노테이션들은 객체의 역할을 구체적으로 나누기 위한 용도로, Spring Bean으로 등록되는 방법은 동일합니다. 

 

@Bean, @Component 차이점

@Bean 어노테이션은 @Component가 선언되어 있는 클래스의 생성자 메서드 레벨에 선언하고, @Component 어노테이션의 경우 클래스 레벨에 직접 선언한다는 차이가 있습니다. 

 

그럼 @Bean과 @Component 어노테이션은 언제 어떤 것을 사용하는 것이 좋을까요 ?? 

 

주로 외부 라이브러리와 같이 개발자가 직접 관리하지 못하는 객체는 @Bean을 사용하고, 개발자가 직접 관리할 수 있는 객체는 간편하게 @Component를 사용해 Spring Bean으로 등록할 수 있습니다.

 

이 외에도 객체들이 복잡하게 관계를 맺고 있는 경우, 하나의 설정파일 내에서 개발자가 Bean을 직접 관리하거나 파악하고 싶은 경우 @Bean을 사용 할 수 있습니다. 

 

그러나 개인적으로는 설정 파일을 통해 Bean을 관리하는 것 자체가 관리 포인트가 늘어난다고 생각해서, 외부 라이브러리를 @Bean으로 등록하고자 하는 케이스 외에는 왠만하면 @Component 를 사용하는 것이 좋다고 생각합니다.