@Component

@Bean 을 이용하여 수동으로 빈을 등록하는 방식은 등록하는 클래스가 많아질수록 상당히 많은 시간을 차지할 것이고, 생산력 저하를 야기할 것이다. 그래서 스프링에서는 특정 어노테이션이 있는 클래스를 찾아서 빈으로 등록해주는 컴포넌트 스캔 기능을 제공한다.

컴포넌트 스캔(Component Scan) 을 사용해 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈 등록을 해준다. 그래서 우리가 직접 개발한 클래스를 빈으로 편리하게 등록하고자 하는 경우에는 @Component 어노테이션을 활용하면 된다.

빈으로 등록하고 싶은 자바 객체

@Component
public class YukongResource {

		// 구현
}

@Controller, @Service, @Repository 및 @Configuration 모두 내부에 @Component 를 가지고 있다.

org/springframework/context/annotation/Configuration.java

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {

	@AliasFor(annotation = Component.class)
	String value() default "";

	boolean proxyBeanMethods() default true;

}

@Configuration 안에 있는 @Component 에 의해 설정 클래스 역시 자동으로 빈으로 등록되고 @Bean 이 있는 메소드를 통해 빈으로 등록해줄 수 있었던 것이다.

스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장한다. 또한 직접 개발한 클래스는 @Component 를 통해 해당 클래스를 빈으로 등록한 것을 노출하는 것이 좋다. @Bean 메소드를 사용하여 등록한 빈은 직접 설정 객체에서 확인해야 알 수 있기 때문이다.

추가로 @Component 를 이용한다면 Main 또는 App 클래스에서 @ComponentScan 으로 컴포넌트를 찾는 탐색 범위를 지정해주어야 한다. 하지만 Spring Boot 를 사용하고 있다면 @SpringBootConfiguration 하위에 기본적으로 포함되어 있어 별도의 설정은 하지 않아도 된다.

https://mangkyu.tistory.com/75

@ComponentScan

@Component 어노테이션 및 @Controller, @Service, @Repository 등 기본 스프링 빈 객체 어노테이션의 클래스들을 자동으로 스캔하여 스프링 빈 객체로 등록해주는 역할을 한다.

이전에 XML 파일을 이용해 지정해주던 것을 어노테이션을 이용하여 범위를 지정할 수 있도록 하기 위해 만들어졌다.

<beans>
		// 생략

		<context: component-scan base-package="com.base.package.name">
</beans>

컴포넌트 스캔 범위 지정 과정

1. 스프링 빈 객체로 등록하고 싶은 객체를 생성한다.

빈으로 등록할 객체

@Component
public class YukongComponent {
}