Spring/core

스프링5 프로그래밍 입문 - ch5.컴포넌트 스캔

자몽포도 2023. 3. 24. 13:06

초보 웹 개발자를 위한 스프링 5 프로그래밍 입문을 더 잘 이해하기 위해 정리하기 위한 포스팅입니다.

 

목차

1. @Component/@ComponentScan는 왜 사용할까?

2. @Component/@ComponentScan 사용 방법

 


1. @Component/@ComponentScan는 왜 사용할까?

앞서 스프링 빈을 설정 파일에서 수동 등록 및 주입하거나 @AutoWired를 이용해서 의존 관계를 자동 주입하는 방법에 대해 알아보았다. 여기서 구분해야할 것은 스프링 빈으로 등록하는 것의존 관계를 주입하는 것이다.

 

여기서 잠시 고민해볼 것이 @AutoWired가 정말로 좋은가? 에 대해 고민해보면 좋을 것 같다. 우리는 IOC의 제어를 받기 위해 스프링 빈으로 등록한다. 그러면 의존 관계 주입하는것은 무조건적으로 하는 행위이다. (스프링 빈으로 등록된 객체를 사용할 것이기 때문에) 그런데 빈 등록은 설정 클래스에서 하고 의존 관계 주입은 구체 클래스에서 한다. 나는 개인적으로 예제 프로젝트를 만들면서도 @AutoWried 사용 시, 혼란스러웠다.

 

@Component가 등장한 배경이 아닐까 싶다. @Component/@ComponentScan 둘을 이용하면 빈 등록/의존 관계 주입 모두 구체 클래스에서 쉽고 코드의 품질을 해치지 않는 선에서 이루어질 수 있다.

 


2. @Component/@ComponentScan 사용 방법

 

@Component

사용 방법은 매우 간단하다. 스프링 빈으로 등록하고 싶은 클래스에 @Component를 사용한다.

 

@Component 이외에도 @Service/@Controller/@Repository 등도 @Component 기능을 한다. 그 이유는 해당 애노테이션들이 @Component를 상속하고 있기 때문이다. @Controller 애노테이션을 들어가보면 @Component가 있음을 확인할 수 있다. (@Service, @Repository 모두 마찬가지다.)

 

@ComponentScan

컴포넌트 스캔의 경우 스프링 부트로 프로젝트를 생성하면 기본적으로 등록되어 있다. 바로 @SpringBootApplication 이다.

이럴 경우 src/main 에 있는 모든 @Component를 스캔한다. (이는 영한님 스프링 강의에서 알게 된 내용)

 

직접 만들어 쓰려면 아래와 같이 하면 된다.

chap05 패키지 내부에 있는 @Component만 스캔한다.

 

스프링 컨테이너는 인자로 컴포넌트 클래스들을 받을 수 있다. AppCtx에 컴포넌트 스캔을 해서 컴포넌트를 등록하기 때문에 위와 같이 인자로 넣어준다. 실제로 출력해보면 패키지 내부에 등록한 @Component만 스프링 빈으로 등록된 것을 확인할 수 있다.