실무 프로젝트로 배우는 Kotlin & Spring/스프링 부트 스타트

스프링 부트 자동 설정

webmaster 2022. 10. 23. 14:35
728x90

자동 설정

  • 자동 설정은 스프링 부트의 핵심 기술이다.
  • 자동 설정은 개발자들이 스프링 관련 프레임워크나, 라이브러리를 추가했을 때 번거로운 설정 없이 동작하도록 최적화된 자동 설정을 내장하는 것을 말한다.
  • 스프링 부트 프로젝트에 SpringDataJPA, SpringDataMongoDB와 같은 프로젝트를 적용하면, 내장된 설정이 동작하여, 개발자는 최소한의 설정값만 넣어주거나, 새로운 설정을 새롭게 구성할 수 있다.

자동 설정 살펴보기

autoconfigure 모듈 하위의 META-INF

...
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration
...
  • 자동 설정을 하기 위해 스프링 부트는 애플리케이션 실행 시점에 autoconfigure 모듈 내부의 META-INF 하위의 메타데이터 파일을 우선적으로 검색한다.
  • 메타데이터 파일은 이전에 META-INF/spring.factories 였으나 현재는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import s이다.
  • 메타 데이터 내부에는 자동 설정을 구현한 후보 클래스들의 목록이 등록되어 있다
  • 스프링 부트는 @EnableAutoConfiguration 애노테이션이 존재하면 자동 설정 클래스를 검색하고, 조건에 따라 자동 설정 클래스를 로드한다.
  • 기본적으로 @SpringBootApplication 애노테이션에 포함되어 있기 때문에 따로 선언할 필요가 없다(직접 사용할 수도 있음)

조건부 애노테이션

@Conditional 애노테이션
@ConditionalOnProperties

  • 스프링 부트에는 많은 라이브러리에 대한 자동 설정 클래스가 준비되어 있다.
    • 자동 설정이 많다는 것은 해야 할 설정이 적어 편하지만, 사용하지도 않는 모든 설정 클래스를 한 번에 로드하는 것은 불필요하다.
    • 스프링 부트는 조건부 애노테이션인 @Conditional을 사용해 조건에 따라 자동 설정 클래스를 로드한다.
  • 스프링 부트는 자주 사용되는 조건부 애노테이션을 재사용성을 위해 미리 정의하여 제공한다. 이러한 애노테이션은 @ConditionalOn이라는 이름으로 시작한다.
    • 클래스가 존재하는 경우에만 동작/ 클래스가 존재하지 않는 경우에만 동작(@ConditionalOnClass/ @ConditionalOnMissingClass)
    • 빈이 애플리케이션 컨텍스트에 존재하는 경우에만 동작/ 빈이 애플리케이션 컨텍스트에 존재하지 않는 경우에만 동작( @ConditionalOnBean / @ConditionalOnMissingBean)

AOPAutoConfiguration을 살펴보자

@AutoConfiguration
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {
  • 프로퍼티가 존재하는 경우만 동작하는 @ConditionalOnProperty가 적용되어 있다.
  • prefix는 spring.aop로 시작하는 프로퍼티가 있는지를 검사, name은 prefix 뒤에 들어가는 프로퍼티 이름을 의미한다.
  • havingValue는 프로퍼티 값이 일치하면 동작한다.
  • 따라서 application.properties에 "spring.aop.auto = true"로 설정되어 있으면, 동작한다.
    • matchIfMissing이 true로 설정이 되어 있어, 프로퍼티를 선언하지 않더라도 동작하게 된다.
    • 해당 프로퍼티가 설정되어 있지 않더라도 matchIfMissing 값을 읽어 들여 동작하게 된다.
728x90