Spring Boot - @Component vs @Configuration

h.Im·2024년 9월 4일

Springboot 기초

목록 보기
16/17
post-thumbnail

패스트캠퍼스 김은호 강사님께서 @Component와 @Configuration의 사용 용도를 정확히 알아두는 것이 좋다고 하셔서, 강의 내용을 이해한대로 정리해 보도록 하겠습니다.

@Component

"이 클래스는 커스텀 빈이다."

컴포넌트는 클래스에 붙어서 클래스를 커스텀 빈으로 만들어주는 어노테이션입니다. 컴포넌트 스캔으로 컴포넌트들이 빈으로 등록될 때, 필요한 의존성 등이 모두 주입되거나 하는 내용은 모두 배웠습니다. 그리고 빈으로 등록할 때 @Component, @Bean 어노테이션이 쓰이는 것도 정리 했었습니다. 아래 코드를 우선 살펴 보겠습니다.

  • Proxy Bean으로 등록
@Component
public class BubbleSort<T extends Comparable> {
	...
}

@Comfiguration
public class Config {
	@Bean
    public Sort<String> bubbleSort() {
    	...
    }
}
  • Lite Mode로 등록
@Component
public class Config {
	@Bean
    public Sort<String> bubbleSort() {
    	...
    }
}

Lite Mode로 등록한 빈은 Proxy Bean으로 만들지 않고 그대로 new를 하는 특성이 있습니다. 그대로 new를 하기 때문에 Lite Mode Bean은 주입될 때마다 새로운 객체가 생성된다는 것입니다. 이름이 Lite(가벼운)인 이유는 일반적으로 Proxy Bean을 만드는 것이 Lite Mode로 만드는 것보다 느리기 때문입니다. 생성은 빠르지만 Proxy Bean이 가진 기능들을 사용하지는 못합니다.
Proxy Bean을 사용해야 Spring의 기능을 온전히 사용할 수 있기 때문에 일반적으로는 Proxy Bean을 사용해야 합니다. 하지만 해당 Bean이 어디에 사용될지를 정확히 알고 있고, Proxy의 기능이 사용되지 않아도 됨이 보장된다면 일종의 튜닝 개념으로 Lite Mode를 사용할 수 있습니다.


@Component vs @Bean

Component와 Bean을 우선 비교해 보겠습니다.

@Component

  • Class-level annotation
  • 등록하려는 빈의 클래스 소스가 편집 가능한 경우 사용
  • auto-detection(컴포넌트 스캔)에 걸림

@Bean

  • method-level annotation
  • 좀 더 읽기 쉬움
  • 인스턴스화 하는 코드가 수동으로 작성됨
  • 빈의 인스턴스 코드와 클래스 정의가 분리된 구조
  • 따라서 외부 라이브러리, 써드 파티 클래스도 빈으로 등록 가능

둘의 가장 큰 차이점 : Bean으로 등록하려는 소스 코드가 내 것이냐, 아니냐
Component는 내 소스에 직접 붙임 Bean은 내가 짠 코드에도 붙일 수는 있지만 그럴 이유는 없고, 서드 파티 라이브러리에 주로 붙여 사용


@Configuration

"이 클래스는 각종 빈 설정을 담고 있다."

  • @SpringBootApplication이 컴포넌트 스캔을 통해 @Configuration을 찾아냄
  • 빈 설정(메소드)을 읽어서 스프링 컨테이너에 등록
  • 필요한 곳에 주입
  • 또는 각종 스프링 인터페이스의 구현에 함께 활용

@Component vs @Configuration

@Configuration도 @Component의 하나의 스테레오 타입이라고 볼 수 있습니다(@Controller, @Service 같은). 설정용으로 만든 빈이기 때문입니다.

"어노테이션이 의도에 맞게 사용되었는지 잘 봐주자"

Spring은 의도에 맞는 @Component 스테레오 타입을 많이 제공해 주고 있습니다. @Configuration을 @Component로 교체하여도 Spring이 빈으로 이해하여 동작하지만, 의도를 특정하지는 못하게 됩니다.

  • 빈 설정은 @Configuration, 클래스 빈 등록은 @Component
  • 정확한 목적을 모르고 쓰는 것은 "운영의 시한폭탄"
  • 돌아가면 됐지(X), 정확한 용도를 알고 쓰자(O)

0개의 댓글