✔️ 자동구성 요약
datasource, jdbcTemplate등 이런 라이브러리에 있는 것들이 스프링 빈으로 자동 등록된다 .
그 이유는 스프링 부트의 자동 구성(Auto Configuration)이라는 기능을 제공하기 때문이다.
먼저 자동 구성 없이라이브러리를 등록하고 사용해보자.
순수 라이브러리 사용
순수 라이브러리를 사용하려면 jar파일을 project/libs 폴더에 넣는다
build.gradle 에서 implementation files('libs/xx.jar') 로 추가한다.
그리고 설정 클래스를 만들어서 직접 @Bean으로 수동 등록해줘야한다.
만약 많은 라이브러리를 손수 등록하려하면 정말 많은 시간을 사용해야할 것이다.
스프링 부트의 자동 구성 기능을 쓰면 알아서 등록해준다. 한번 알아보자
자동 구성 라이브러리
라이브러리안에 있는 설정 클래스에 @AutoConfiguration 애노테이션이 붙인다
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
해당 경로의 파일에 만든 설정클래스 패키지명을 적는다. (아래 자동 구성대상 지정 확인)
jar로 빌드한 후 사용할 프로젝트에서 /libs 폴더 안에 넣는다. (없으면 폴더 생성)
build.gradle 에서 만든 라이브러리를 implementation files('libs/xx.jar') 로 추가
자동 구성 대상 지정
자동 구성 대상 대상인 라이브러리는 내부 아래의 경로에 스프링 부트 자동 구성 파일이 있다.
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
여기에 자동 구성 패키지가 저장되어있다.
ex)
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
@SpringBootApplication
이 애노테이션 안에는 @EnableAutoConfiguration 이 있고
그 안에는@Import(AutoConfigurationImportSelector.class) 이 있다.
ImportSelector 는 동적인 방법으로 설정 정보를 Import하는 기능이다.
AutoConfigurationImportSelector.class는 위에서 봤듯이
String location = String.format("META-INF/spring/%s.imports", annotation.getName());
org.springframework.boot.autoconfigure.AutoConfiguration.imports 이 경로의 내용을 읽어서 설정 정보를 선택하고 해당 라이브러리들을 스프링 컨테이너에 등록한다.
정리
@Conditional
if문과 같은 기능으로 특정 조건일때만 특정 빈을 등록하는 기능이다.
Condition (스프링 프레임워크) 인터페이스를 구현해야한다 .
구현한 클래스에는 matches라는 메서드를 오버라이딩하는데 특정 조건에따라 true / false를 반환하고,
설정 클래스에 @Conditional(Condition 구현체.class) 를 넣는다.
true이면 해당 설정클래스를 컨테이너에 등록하고, false면 등록하지 않는다.
그런데 스프링 부트에서는 이 애노테이션을 더 좋게 만들었다.
// 클래스 존재 여부에따른 동작
@ConditionalOnClass
@ConditionalOnMissingClass // 없으면 동작
// 빈이 있으면 동작
@ConditionalOnBean
@ConditionalOnMissingBean // 없으면 동작
// 환경정보 존재시 동작
@ConditionalOnProperty
// 리소스 존재시 동작
@ConditionalOnResource
// 웹 애플리케이션인 경우 동작
// 웹 애플리케이션인 경우는 아마도 서블릿이나 mvc 등에관련된 정보가 있을 경우라는 의미로 해석됨
// 공식문서 참조
@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
//SpEL 표현식에 만족하는 경우 동작
//Spring Expression Language(약칭 "SpEL")는 런타임에 객체 그래프를 쿼리하고 조작하는 것을 지원하는 강력한 표현 언어
// 공식 문서 참조
@ConditionalOnExpression
이제 Condition 인터페이스를 구현하지 않아도 된다.
다음에는 자동 등록된 빈들에 사용하는 설정 정보를 변경하는법에 대해서 알아본다.
🔖 학습내용 출처
'Back-End > Spring Advance & Boot' 카테고리의 다른 글
스프링 부트 - 외부 설정과 프로필2 (0) | 2025.01.21 |
---|---|
스프링 부트 - 외부 설정과 프로필 (0) | 2025.01.21 |
스프링 부트 - 부트와 내장 톰캣 (0) | 2024.11.19 |
스프링 부트 - 웹 서버와 서블릿 컨테이너 (2) | 2024.11.15 |
스프링 고급편 - 실무 주의사항 (내부호출, 기술과 한계) (1) | 2024.11.13 |