Study

@Component vs @Configuration

Hyunec 2021. 9. 25. 00:14

개발하면서 Component와 Configuration 어노테이션은 많이 만났었지만 이 글을 작성하기 전에는

  • @Configuration 은 설정 클래스에 사용하는 어노테이션
  • @Component는 Bean 클래스에 사용하는 어노테이션

정도로만 알고 있었습니다. 하지만 공부하다 보니 모호하게 알고 있던 부분을 좀 더 알게 되었고, 이 내용을 기록해 봅니다.

 

# 비교

@Component

  1. @ComponentScan 을 통해 검색됩니다.
    • @SpringBootApplication에 래핑 되어 있기에 일반적으로는 신경 쓰지 않아도 됩니다.
  2. 용도에 맞춘 스테레오 타입의 어노테이션을 가지고 있습니다.
    • @Controller @Service @Repository @Configuration
    • 가능하면 스테레오 타입을 사용합니다.
  3. @Bean 과는 차이점이 있습니다.
    • 둘다 Bean을 생성한다는 것에서는 같지만 @Component는 class level에서, @Bean 은 method level에서의 어노테이션입니다.
    • @Component는 Bean의 클래스 소스가 편집 가능할 때, @Bean 은 인스턴스 화할 코드가 수동으로 작성됨으로 외부 라이브러리나 써드파티 클래스도 Bean으로 등록이 가능합니다.

@Configuration

  1. @ComponentScan 을 통해 검색됩니다.
    • @Configuration 도 @Component의 한 종류이기 때문입니다.
  2. 각종 스프링 인터페이스의 구현에 함께 활용됩니다.

여기까지만 보면 잘 모르고 혼용해서 써도 애플리케이션이 돌아는 갑니다.

하지만 Bean 을 생성하는 방법에서는 차이가 있습니다.

# Bean을 생성하는 방법

1. @Component

@Component
public class SimpleComponent {

}

2. @Bean (in @Configuration)

@Configuration
public class SimpleConfigBean {

	@Bean
	public SimpleClass1 simpleComponent1() {
		return new SimpleClass1();
	}
}

3. @Bean (in @Component): Lite Mode

@Component
public class SimpleComponentBean {

	@Bean
	public SimpleClass2 simpleComponent2() {
		return new SimpleClass2();
	}
}

proxy 된 simpleConfigBean 과 인스턴스화된 simpleComponentBean 출력

 

Spring에서는 기본적으로 Bean을 등록할 때 proxy를 사용합니다.

하지만 Lite Mode 는 실제 인스턴스를 생성하기에 proxy 가 필요한 Spring 기능들을 사용할 수 없습니다. (AOP 등)

따라서 이 차이를 알고 필요한 곳에서만 특정 목적으로 사용해야 합니다.

'Study' 카테고리의 다른 글

'수십억건에서 QUERYDSL 사용하기' 를 보고..  (2) 2021.12.19
String 을 잘 써보자  (0) 2021.10.16
mongoDB tutorials  (0) 2021.05.18
API Versioning 전략  (0) 2021.04.14
토끼책을 읽고 - 메시지를 믿을 수 있을까? (2)  (0) 2021.03.08