2022-08-09
@Bean과 @Component는 두 개다 스피링 IOC의 객체를 생성하는 기능을 한다. 이 둘의 차이점을 알아보자.
1. @Bean vs @Component
우선 @Bean 은 @Configuration와 세트로 사용된다. @Configuration은 기존의 config (XML에서 작성하던) 형식의 파일들을 java.class 형태로 작성할 수 있도록 도와주는 어노테이션이다. @Configuration 안에는 IOC에 들어간 bean이 필요한데, 이러한 객체를 생성하는 메서드에게 @Bean 어노테이션을 적어준다.
예로는 아래와 같이 DB 접속 정보가 들어간 config 파일에 사용한다.
@Configuration
public class DatasourceConfig {
@Bean
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
// ........ 추가 코드 필요
}
여기서 @Component 는 사용하지 않는 이유는 바로 @Bean은 개발자가 임의로 만든 class 파일이 아닌 Map / List / Set /... 과 같은 직접 제어를 하지 않는 내외부 라이브러리에 대하여 사용하게 된다. DataSourceProperties 도 org.springframework.boot.autoconfigure.jdbc.DataSourceProperties에서 제공하는 외부 라이브러리이기 때문에 @Bean으로 등록해서 사용한다.(@Component 쓰면 에러남)
@Component의 경우 사용자가 만든 임의의 클래스를 빈으로 등록시키기 위해 사용된다. 아래와 같은 방식으로 사용하면 된다.
import org.springframework.stereotype.Component;
@Component(value="Test")
public class TestClass {
private String TestName = "Test";
}
이후 해당 @Component을 호출할 때는 @Autowired라는 어노테이션을 사용해 해당 @Component 선언된 클래스의 기능을 자유롭게 사용하면 된다.
@Autowired
TestClass testClass;
@RequestMapping("/home")
public String indexPage(HttpServletRequest request){
System.out.println(testClass.getTestName());
return "/home";
}
만약에 위치에 @Component 위치에 @Bean 어노테이션을 사용하면, The injection point has the following annotations:
- @org. springframework.beans.factory.annotation.Autowired(required=true) 이와 같이 의존관계 주입 및 컴파일 과정에서 에러 가 발생한다. (반대로 해도 마찬가지)
import org.springframework.context.annotation.Bean;
//@Component(value="Test")
@Bean(name="Test")
public class TestClass {
private String TestName = "Test";
public String getTestName() {
return TestName;
}
}
메인 이미지 출처 : Photo by Pawel Czerwinski on Unsplash