스프링 자체가 관리하는 자바 객체로 IOC (제어의 역전)을 통해 특정 코드를 통해 new Object() 처럼 사용할 때 마다 만드는 것이 아닌 Spring에 의해 관리 당하는 자바 객체를 의미한다.
보통 이런 제어의 역전이 된 객체들은 @Bean, @Component 어노테이션이 붙어있는데 각각 언제 무슨 상황에 써야할 지 헷갈린다.
@Bean 어노테이션은 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶을 때 사용하는 어노테이션이다.
보통 외부 라이브러리(직접 만든 내부 코드들이 아닌) 클래스에 @Component 선언이 불가능하며 그런 경우 인스턴스를 생성하는 메소드를 만들고 그 메소드에 @Bean을 선언해 Bean을 등록하는 방식을 이용한다.
당연히 @Bean과는 반대로 개발자가 제어 가능한 Class에 사용하며 흔히 사용하는 @RestController, @Service에도 컴포넌트가 내장되어있어 편하게 쓸 수 있다.
@Bean 어노테이션과 @Component 어노테이션의 등록 단계에도 차이점이 존재한다.
| @Bean | @Component | |
|---|---|---|
| Target | METHOD, ANNOTATION_TYPE | TYPE(클래스, 인터페이스) |
사실 @Bean은 Class 에 선언 자체가 불가능해 개발자가 만든 클래스에 선언하려 해도 에러가 나기 때문에 구분하기 좀 쉽다