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 를 사용하는 것이 좋다고 생각합니다.
'Study > Spring Framework' 카테고리의 다른 글
Spring Web MVC의 내부 구조와 동작 방식 (1) | 2023.11.29 |
---|---|
[Spring] Bean Scope의 개념과 종류 (1) | 2023.10.18 |
[Spring] 빈(Bean) 생명주기 콜백 (0) | 2023.10.18 |
[Spring] Spring Container 개념 (1) | 2023.10.18 |
[Spring] IoC와 IoC 컨테이너 개념 (0) | 2023.10.04 |