본문 바로가기

Spring Study

[스프링 핵심 원리] - 기본편 #6

섹션 7 : 컴포넌트 스캔

컴포넌트 스캔 - 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록한다.

@Component 어노테이션이 붙은 모든 클래스를 스프링 빈으로 등록한다.

 

@Autowired - 의존관계를 자동으로 주입한다.

스프링 컨테이너는 타입을 기반으로 빈을 찾아 자동으로 주입한다.

 

basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함한 하위 패키지를 모두 탐색한다.

@Configuration
@ComponentScan(
        basePackages = "hello.core.member",
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {

}

위의 경우는 hello.core.member 클래스의 하위 패키지를 모두 탐색한다.

basePackages가 없으면 모든 자바 코드에서 찾기 때문에 매우 오래 걸리게 된다.

 

basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.

package hello.core;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

@Configuration
@ComponentScan(
        basePackages = "hello.core.member",
        basePackageClasses = AutoAppConfig.class,
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {

}

위의 경우는 hello.core에서부터 찾게 된다. 

만약 아무것도 지정하지 않는다면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

 

스프링 부트를 사용하면 @SpringBootApplication을 선언하게 되는데 그 설정 안에 @ComponentScan이 들어있어서, 자동으로 스프링빈에 등록이 된다. 

 

따라서 스프링 부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트 시작 루트 위치에 두는 것이 관례이다 .

 

스프링은 다음 어노테이션이 있으면 컴포넌트 스캔뿐만 아니라, 아래의 부가 기능을 추가로 수행하게 된다. 

 

@Controller : 스프링 MVC 컨트롤러로 인식된다.

@Repository : 스프링 데이터 접근 계층으로 인식된다. 

@Configuration: 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다.

@Service : 스프링이 따로 처리를 하지는 않지만, 핵심 비즈니스 로직이 여기에 있겠구나 하고 비즈니스 계층을 인식하는데 도움이 된다.

 

인텔리제이 단축키 ⇧ (shift 키를) 연속으로 두 번 누르면  아래의 사진처럼 검색할 수 있는 창이 뜬다.