@Component와 @bean 어노테이션
이전 포스팅에서 @Configuration과 @Bean 어노테이션에 대해 알아보았다.
오늘은 @ComponentScan과 @Component 와 @Bean 어노테이션의 서로 다른 용도?에 대해 작성하는 글이다.
@ComponentScan
@ComponentScan이란 @Component, @Controller, @Service, @Repository, @Configuration 어노테이션이 붙은 클래스 Bean들을 찾아 Spring Context에 빈(Bean)을 등록해주는 어노테이션이다.
여기서 @ComponentScan 어노테이션을 통해 Bean을 등록해준다고 하는데, 사실상 @ComponentScan을 직접 사용하지 않아도 Bean으로 잘 등록될 수 있는 이유는 @SpringBootApplication 내부에서 ComponentScan이 기본 패키지에 대해서 설정되어 있기 때문이다.
@Component vs @Bean
@Bean 과 @Component 는 둘 다 IoC Container에 Bean을 등록하도록 하는 어노테이션이다. 그렇다면 왜 두개나 만들어 놓았을까?
둘의 용도가 다르기 때문이다.
@Component
@Component 어노테이션은 싱글톤 Class를 Bean으로 등록하기 위한 어노테이션이다. 물론 @Scope("Prototype") 어노테이션을 통해 싱글톤이 아닌 매번 객체를 생성하도록 하는 빈을 생성할 수도 있다.
* (value = "") 옵션이 있고, 해당 옵션을 사용하지 않는다면 class의 이름을 camelCase로 변경한 것을 bean id로 사용합니다.
이 어노테이션은 선언적 어노테이션이다. 이 클래스를 정의했으니 빈으로 등록해줘 라는 뜻이 된다.
또한, @Component 어노테이션의 경우는 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.
@Bean
@Bean 어노테이션은 주로 @Configuration 어노테이션이 들어간 Spring을 설정하는 클래스 내에 들어가는 메서드에서 선언한다.
* (name = "") 옵션이 있고, 해당 옵션을 사용하지 않는다면 method 이름을 camelCase로 변경한 것이 bean id로 등록됩니다.
만약 이를 @Component로 따지면, 스프링은 스캔할 패키지를 검색해 @Component 어노테이션을 발견하면 아래처럼 등록하는 꼴이 된다.
@Component
public class MyBean {
// ...
}
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
그리고 @Bean 어노테이션의 경우는 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만드려 할 때 사용된다.
그렇다면 @Controller, @Service, @Repository 어노테이션은?
@Controller, @Service, @Repository 어노테이션들은 @Component 어노테이션의 구체화된 형태이다.
스프링부트의 경우 @Component, @Controller, @Service, @Repository, @Configuration, @Bean 등으로 필요한 빈들을 등록하고, 필요한 곳에서 @Autowired를 통해 주입받아 사용하는 것이 일반적이다.
위에서 설명했듯 @Controller, @Service, @Repository는 모두 @Component를 상속받고 있으며 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
어노테이션을 세분화 함으로써 가독성 측면에서 해당 각각의 어노테이션을 가진 클래스의 역할을 알 수 있게 된다.
참고
https://galid1.tistory.com/494
https://velog.io/@composite/Spring-Component-Bean-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0
'Programming > Spring' 카테고리의 다른 글
[Java] Jackson ObjectMapper 란? (0) | 2024.01.04 |
---|---|
[Spring] Lombok 생성자 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor 차이점 (0) | 2023.06.17 |
[Spring] @Configuration, @Bean의 동작 방식(싱글톤) (0) | 2023.05.23 |
[Spring] IoC 컨테이너에 등록된 Bean 조회하기 (0) | 2023.05.15 |
[Spring] JPA 개념정리 (Hibernate, Spring Data JPA) (0) | 2023.05.08 |