서버/스프링(Spring)

[Spring] Component-scan 이란

도트7 2022. 7. 14. 22:04

Component Scan

 컴포넌트 스캔은 특정 패키지를 기준으로 현재 패키지와 하위 모든 패키지를 탐색하여 특정 조건이 갖추어진 클래스들을 찾아 스프링 컨테이너에 bean으로 생성하는 것이다.

 

 컴포넌트 스캔은 스프링의 설정 파일을 xml 방식으로 구성하느냐 java 방식으로 구성하느냐에 따라 선언 위치가 달라진다. xml으로 구성할 경우 servlet-context.xml과 root-context.xml에서, java로 구성할 경우 @Configuration이 적용된 클래스에서 선언한다.

 

 

 

Component Scan 등록 조건

 컴포넌트 스캔 시 bean 등록 대상이 되려면 클래스 레벨에 @Component 어노테이션이 선언되어 있거나 @Component가 적용된 어노테이션이어야 한다.

 

 

 MVC 구조로 스프링 프로젝트를 만들다 보면 Controller, Service, Repository 등의 어노테이션을 자주 보게 되는데 이 어노테이션들을 보면 @Component가 적용되어 있기 때문에 컴포넌트 스캔 시 bean 등록 대상이 된다.

 

 

 또한 @Component가 적용된 @Controller 어노테이션을 적용한 경우에도 컴포넌트 스캔 대상이 된다. 결국 상위 어느 어노테이션이든 @Component가 적용되어 있기만 하면 된다는 것이다.

 

 

 

Component Scan - xml 방식

 스프링 프로젝트를 생성하면 기본적으로 xml 방식으로 설정 파일이 구성된다. 컴포넌트 스캔이 수행되는 시점은 서버 구동 시 배포 설명자(web.xml)가 로드될 때다. 배포 설명자가 실행되면 파일에 정의된 ContextLoaderListener, DispatcherServlet이 생성되는데 각각 root-context.xml, servlet-context.xml을 기반으로 실행되기 때문에 각 파일에 적절하게 컴포넌트 스캔을 명시해놓으면 된다.

 

 일반적으로 view에 가까운 bean(controller 등)은 servlet-context.xml에, 비지니스 로직 처리에 관련된 bean(service, dao, repository)은 root-context.xml에서 수행한다.

 

 

servlet-context.xml 의 일부 코드

 <context:component-scan> 태그를 사용하여 컴포넌트 스캔을 수행한다. base-package 값으로 패키지를 설정하면 해당 패키지를 포함하여 하위 모든 패키지에 있는 클래스를 탐색, @Component가 적용된 클래스를 bean 객체로 등록하게 된다. servlet-context.xml에는 초기에 HomeController를 bean으로 등록하기 위해서 기본적으로 이 태그가 적용되어 있지만 root-context.xml에는 직접 추가해야 한다.

 

 

 

Component Scan - java 방식

 xml에서 태그를 사용했다면 자바에서는 어노테이션을 사용한다. @Configuration을 선언한 클래스, 즉 스프링 설정관련 클래스에 @ComponentScan 어노테이션을 선언하고 basePackages 속성에 스캔할 패키지를 정의하면 된다. 

 

 만약 패키지 스캔이 아닌 클래스를 특정하여 지정하고 싶은 경우 basePackageClasses 속성을 사용하여 클래스를 직접 지정할 수도 있다.