Back-End/Spring Advance & Boot

스프링 부트 - 자동 구성

Meluu_ 2024. 11. 27. 15:27

✔️ 자동구성 요약


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 인터페이스를 구현하지 않아도 된다. 

 

 

 

 

 

다음에는 자동 등록된 빈들에 사용하는 설정 정보를 변경하는법에 대해서 알아본다.

 

🔖 학습내용 출처


스프링 부트 - 핵심 원리와 활용 / 김영한