https://megamaker.tistory.com/380
[Spring Boot] 스프링 부트 자동 구성 및 @Conditional 알아보기
스프링 부트 자동 구성 스프링에서 DB를 사용하는 방법 중 하나가 Config 클래스를 만들어 사용하는 것이다. @Slf4j@Configurationpublic class DbConfig { @Bean public DataSource dataSource() { log.info("dataSource 빈 등
megamaker.tistory.com
ㄴ 이전 게시글
기존의 스프링 @Configuration 설정 클래스를 담고 있는 외부 라이브러리를 가져오면 개발자가 어떤 빈이 있고 등록은 어떤 빈을 해야하는지 파악하고 직접 등록해야하는 번거로움이 있었다. 그런 번거로움과 어려움을 해소하기 위해 스프링은 AutoConfiguration을 통해 라이브러리만 등록하면 스프링 컨테이너에 빈을 자동으로 등록해주는 기능을 제공한다.
자동 구성되는 외부 라이브러리
스프링 부트에서 자동 구성을 해주는 것은 알겠는데 그럼 TransactionManager나 DataSource와 같은 라이브러리들은 어떻게 빈으로 등록하고 기본 설정을 가지고 있는걸까?
@AutoConfiguration
@ConditionalOnProperty(name = "memory", havingValue = "on")
public class MemoryAutoConfig {
@Bean
public MemoryController memoryController() {
return new MemoryController(memoryFinder());
}
@Bean
public MemoryFinder memoryFinder() {
return new MemoryFinder();
}
}
위와 같이 직접 라이브러리를 만든다고 가정하고 설정 클래스를 만든다.
@AutoConfiguration 어노테이션을 붙이면 자동 구성을 사용하겠다는 의미이다.
다만 그대로는 원하던 방식대로 작동하지 않고, 한 가지 방법을 더 수행해야 한다.
resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일에 위에서 만든 설정 클래스를 등록해야 한다.
이렇게 하면 해당 프로젝트를 빌드하고 다른 곳에 외부 라이브러리로 가져다 사용할 때 해당 프로젝트를 실행하면 자동으로 MemoryAutoConfig의 빈들을 스프링 컨테이너에 등록할 수 있게 된다.
주의할 점은 해당 설정 클래스(MemoryAutoConfig) 내부에서 컴포넌트 스캔을 사용하면 안 된다.
하지만 특별한 상황이 아니면 걱정하지 않아도 된다.
그저 할 일은 위 스크린샷의 파일 내부에만 작성하도록 하는 것이다.
스프링 부트는 이런 외부 라이브러리 내의 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 모두 열어봐서 내부에 작성된 클래스를 설정 클래스로 가져와 빈을 등록하는 것이다.
그럼 개발자는 그냥 가져다 사용하기만 하면 된다.
@ImportSelector
스프링 부트 프로젝트를 생성해서 열어보면 ~Application 클래스에 @SpringBootApplication이 붙어 있는 것을 볼 수 있다.
해당 어노테이션 내에는 컴포넌트 스캔, 자동 구성 등을 위한 어노테이션이 있는 것을 확인할 수 있는데 여기서 @EnableAutoConfiguration 덕분에 자동 구성을 수행할 수 있다.
@Import는 원하는 스프링 설정 클래스를 포함시키는 역할을 하는 어노테이션이다.
그런데 위 스크린샷을 보면 AutoConfigurationImportSelector라는 것을 포함시키는 것을 알 수 있다.
~ImportSelector는 스프링에서 제공하는 인터페이스인 ImportSelector를 구현한 클래스이다.
public class HelloImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] { "hello.selector.HelloConfig" };
}
}
이런식으로 코드를 통해 각 상황에 맞는 자동 구성을 변경을 가능하도록 해주는 인터페이스이다.
상황에 맞게 if 문이나 기타 방법으로 다른 설정 클래스를 불러오도록 할 수 있다.
아무튼 다시 AutoConfigurationImportSelector로 돌아오면 해당 클래스 내에서 앞서 살펴봤던 외부라이브러리 내의 org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일의 @AutoConfiguration이 붙은 설정 클래스들을 가져와 내부 빈을 등록하는 과정을 거치게 된다.
스프링 부트 - 핵심 원리와 활용 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., 백엔드 개발자를 위한 스프링 부트 끝판왕! 실무에 필요한 내용을 모두 담았습니다. [임베딩 영상] 김영한의 스
www.inflearn.com
'공부 > Spring' 카테고리의 다른 글
[Spring Boot] Environment, @Value, @ConfigurationProperties (0) | 2024.09.07 |
---|---|
[Spring Boot] 외부 설정 알아보기 (0) | 2024.08.31 |
[Spring Boot] 스프링 부트 자동 구성 및 @Conditional 알아보기 (0) | 2024.08.27 |
[Spring Boot] 자동 라이브러리 관리 알아보기 (0) | 2024.08.26 |
[Spring] 톰캣 라이브러리로 직접 실행하기 및 jar의 문제점 (0) | 2024.08.05 |