본문 바로가기

SpringFramework Core - I. IoC 컨테이너/10. 클래스패스 스캐닝과 관리받는 컴포넌트들

10.9. 후보 컴포넌트들의 인덱스 생성하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-scanning-index

 

 

클래스패스 스캐닝은 매우 빠르지만, 후보들의 정적인 리스트를 만들어놓음으로써 대규모 애플리케이션의 startup 퍼포먼스를 향상시킬 수 있다. 이 모드에서는 컴포넌트 스캔의 대상이 되는 모든 모듈들이 이 메커니즘을 사용해야만 한다.

 

context에게 특정 패키지들에 있는 후보들을 스캔해달라고 요청할 때처럼, @ComponentScan이나 <context:component-scan> 디렉티브들은 생략되어서는 안 된다. ApplicationContext가 인덱스를 찾으면, 자동적으로 클래스패스 대신에 인덱스를 사용한다.

 

인덱스를 생성하기 위해서는, 추가적인 의존성을 각 모듈에 추가하면 된다. 이때 모듈은 컴포넌트 스캔 디렉티브들의 대상이 되는 컴포넌트를 포함하고 있다. 다음 예시는 메이븐에서 이를 어떻게 하는지 보여준다.

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-indexer</artifactId>
        <version>5.2.5.RELEASE</version>
        <optional>true</optional>
    </dependency>
</dependencies>

그래들 4.5나 이전 버전에서는, 의존성이 'compileOnly' 설정 안에 선언되어야 했다. 다음 예시를 보자.

dependencies {
    compileOnly "org.springframework:spring-context-indexer:5.2.5.RELEASE"
}
그래들 4.6과 그 이후 버전에서는, 의존성이 annotationProcessor 설정 안에 선언되면 된다. 다음 예시를 보자.
dependencies {
    annotationProcessor "org.springframework:spring-context-indexer:{spring-version}"
}

이 과정은 jar 파일에 포함되는 META-INF/spring.components 파일을 생성한다.

 

※ 여러분의 IDE에서 이 모드로 작업을 할 때는, spring-context-indexer가 틀림없이 어노테이션 처리기로써 등록되어 있을 것이다. 이 처리기는 후보 컴포넌트들이 수정되었을 때, 인덱스를 최신으로 유지해준다.

 

META-INF/spring.components가 클래스패스에서 발견되면 인덱스는 자동적으로 사용가능해진다. 만약 인덱스가 몇몇 라이브러리들에서만 부분적으로 사용가능하고 전체 애플리케이션에 대해서는 빌드가 불가능하다면, spring.index.ignore를 true로 세팅함으로써 일반적인 클래스패스 준비를 대비책으로 사용하면 된다(마치 인덱스가 아예 없는 것처럼 말이다). 이는 시스템 프로퍼티나 루트 클래스패스의 spring.properties 파일 안에서도 마찬가지이다.