스프링 부트는 자동 구성이라는 기능을 제공하는데, 일반적으로 자주 사용하는 스프링 빈들을 자동으로 등록해주는 기능이다.
spring-boot-autoconfigure
라는 프로젝트 안에서 자동 구성을 제공한다.예를 들어, 스프링 부트는 JdbcTemplate
, DataSource
, TransactionManager
등의 빈을 자동으로 등록한다.
스프링 부트가 제공하는 자동 구성 기능을 이해하려면, 두 가지 개념을 이해해야 한다.
@Conditional
@AutoConfiguration
@Conditional
어노테이션은 특정 조건이 참일 때만 해당 빈이 등록되도록 제어한다.
@Conditional(조건 클래스)
에서 조건 클래스가 참일 때 빈으로 등록된다.Condition
인터페이스를 구현한 구현 클래스이어야 한다.Condition
인터페이스에는 boolean matches()
메소드가 존재한다.// Condition 인터페이스
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
// 조건 클래스
public class MyCondition implements Condition {
@Override
boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
// 쉘에서 실행할 때 매개변수를 주면 context 변수로 들어온다.
// ex) java -Dturn=on -jar myProject.jar
String condition = context.getEnvironment().getProperty("turn");
return "on".equals(condition);
}
}
// 설정 정보 클래스
@Configuration
@Conditional(MyCondition.class)
// MyCondition 클래스의 matches 리턴값이 true일 때만 이 클래스가 설정정보로 적용된다.
public class AppConfig{
@Bean
public MemoryRespository memoryRepository() {
return new MemoryRepository();
}
}
스프링은
Conditional
과 관련해서 개발자가 편리하게 사용할 수 있도록ConditionalOnXxx
를 제공한다.
ConditionalOnClass
클래스가 존재하는 경우 동작한다.
ConditionalOnBean
빈으로 등록되어 있는 경우 동작한다.
ConditionalOnProperty
환경 정보가 있는 경우 동작한다.
ConditionalOnResource
리소스가 있는 경우 동작한다.
ConditionalOnWebApplication
웹 애플리케이션인 경우 동작한다.
외부 라이브러리를 사용해서 웹 애플리케이션을 개발한다고 가정해보자.
외부 라이브러리에는 다양한 클래스가 존재하고, 그 중에서 필요한 클래스들을 스프링 빈으로 등록해야할 것이다.
// 예를 들어 게시판 라이브러리를 가져왔다고 해보자.
@Configuration
public class AppConfig(){
@Bean
public Board board(){
return new Board();
}
@Bean
public PostRepository postRepository(){
return new PostRepository();
}
}
라이브러리 적용 방법
위의 게시판 라이브러리를 빌드해서
board.jar
파일을 만들었다고 가정해보자.
- 라이브러리를 적용할 프로젝트에서
libs
폴더를 생성한 뒤에board.jar
파일을 붙여넣는다.- 프로젝트의
build.gradle
에implementation files('libs/board.jar')
코드를 추가한다.
라이브러리를 사용할 고객들을 위해, 라이브러리를 추가만 하면 필요한 빈들이 자동으로 등록되도록 설정할 수 있다.
이 때 필요한 것이 바로
@AutoConfiguration
이다.
@AutoConfiguration
@ConditionalOnProperty(name = "board", havingValue = "on")
public class AppAutoConfig(){
@Bean
public Board board(){
return new Board();
}
@Bean
public PostRepository postRepository(){
return new PostRepository();
}
}
@AutoConfiguration
어노테이션을 적용한 설정정보 클래스를 만든 뒤에, 자동 구성 대상을 지정해줘야 한다.
src/main/resources/META-INF/spring/
위치에
org.springframework.boot.autoconfigure.AutoConfiguration.imports
파일을 추가한다.
해당 파일에 AppAutoConfig
를 지정해준다. (패키지도 포함해야 한다.)
이제 빈을 직접 등록할 필요 없이, 라이브러리만 땡겨오면 필요한 빈을 자동으로 등록해준다!
@SpringBootApplication
어노테이션에서 시작한다.@SpringBootApplication
안에는 @EnableAutoConfiguration
이 존재한다.@EnableAutoConfiguration
에는 @Import(AutoConfigurationImportSelector.class)
어노테이션이 존재한다.@Import
어노테이션은 스프링 설정 정보를 포함할 때 사용한다.
하지만! @Import
의 속성으로 들어가있는 AutoConfigurationImportSelector
는 설정정보가 아닌 selector 클래스이다.
@Import
에 설정 정보를 추가하는 방법은 2가지가 있다.
1.@Import(설정정보 클래스)
2.@Import(ImportSelector의 구현객체)
ImportSelector의 구현객체는 설정정보를 String 타입으로 반환한다.
즉, 설정 대상을 동적으로 선택할 수 있다.
스프링 부트는 @Import(AutoConfigurationImportSelector.class)
어노테이션을 통해, 다음 경로에 있는 파일을 읽어서 자동 구성으로 사용한다.
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports