클래스에 붙는 어노테이션으로 스프링 프레임워크에서 관리할 클래스임을 나타내는 것이다.
한국어로 하면 의존성으로 한클래스가 다른 클래스에 의존하고 있는것
EX)
Class A{
private class B;
///
A가 B를 의존하고 있다
Component가 어디 있는지 위치를 알려주기 위한 것으로 자바 스프링 부트에서는 @ComponentScan("위치") 를 통해 위치 하위에 있는 모든 컴포넌트들을 스캔한다. 생략시 현재 컴포넌트를 기준으로 한다.
지역하면 의존성 주입으로 컴포넌트로 스캔된 클래스의 의존성이 무엇인지 확인하고 해당 의존성을 해결시켜주는 것이다. 이를 유저가 하는 것에서 스프링이 하는 것으로 바꾼 것을 IOC(Inversion Of Control)이라 한다.
둘다 해당 어노테이션이 붙은 대상을 Bean에 등록시켜준다는 공통점이 있다.
하지만 그 둘의 차이가 있는데
| 헤더 | @Component | @Bean |
|---|---|---|
| 어디에 사용되는지? | 자바클래스에 사용 | 빈에 등록시킬 클래스를 생성하는 함수에 사용되며 특히 Spring Configuration에서 클래스 생성 함수에 사용된다 |
| 사용 난이도 | 매우 쉬움(붙이기만 하면 된다) | 상대적으로 어렵다(직접 하나하나 붙여야 한다, 생성 로직을 작성해야한다.) |
| Autowiring | @Autowired로 필드에 직접, 세터, 생성자로 주입 가능 | 클래스를 생성할 Bean에 등록시키고자 하는 클래스를 직접 생성하거나 파라미터로 받는다. |
| 누가 만드는지 | Spring framework | 생성자 빈을 직접 정의해야한다. |
| 언제 쓰는게 좋을까? | 직접 작성한 클래스를 빈에 등록시키려 할때 | 1. 의존성을 주입할때 특정 로직을 실행시켜주고 싶을때 2. 내가 만든게 아닌 다른 사람의 로직을 사용할때 |
이다.
다시 정리하여 말하자면 외부 라이브러리에서 사용되는 클래스를 Bean에 등록시켜줄 때는 해당 클래스는 외부에 있기 때문에 @Component를 통해 등록시킬 수 없다. 그렇기 때문에 해당 클래스를 Bean에 등록시키기 위해 @Bean을 이용한다.
@SpringConfiguration
public class Configuration{
@Bean
public outerClass getOuterClass(){
//custom logic
return new outerClass();
}
}