스프링 부트

자동 구성(Auto Configuration)

yanJuicy 2024. 5. 19. 01:53
반응형
  • 해당 게시물은 인프런 - "스프링 부트 - 핵심 원리와 활용" 강의를 참고하여 작성한 글입니다
  • 유료강의이므로 자세한 내용은 없고, 간단한 설명 위주로 정리했습니다
    강의 링크

스프링 부트의 자동 구성

스프링 부트는 자동 구성(Auto Configuration) 기능을 통해 일반적으로 자주 사용하는 많은 빈들을 자동으로 등록해 준다

spring-boot-autoconfigure라는 프로젝트 안에서 수많은 자동 구성을 제공한다

JDBCTemplate을 설정하고 빈으로 등록하는 자동 구성은 다음과 같다

@AutoConfiguration(
    after = {DataSourceAutoConfiguration.class}
)
@ConditionalOnClass({DataSource.class, JdbcTemplate.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({JdbcProperties.class})
@Import({DatabaseInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class})
public class JdbcTemplateAutoConfiguration {
    public JdbcTemplateAutoConfiguration() {
    }
}

@AutoConfiguration

자동 구성을 사용하려면 위 애노테이션을 등록해야 한다

after = ...을 통해 자동 구성이 실행되는 순서를 지정할 수 있다

@ConditionalOnClass

지정된 클래스가 있는 경우에만 설정이 동작한다

@Conditional... 시리즈가 있고 자동 구성의 핵심이다

@Import

스프링에서 자바 설정을 추가할 때 사용한다

스프링 부트가 제공하는 자동 구성(AutoConfiguration)

https://docs.spring.io/spring-boot/docs/current/reference/html/auto-configuration-classes.html

스프링 부트는 수많은 자동 구성을 제공하고 spring-boot-autoconfigure에 모아둔다

image

@Conditional

같은 소스 코드인데 특정 상황일 때만 특정 빈들을 등록해서 사용하도록 도와주는 기능

이 기능을 사용하려면 Condtion 인터페이스를 구현해야 한다

Condition

package org.springframework.context.annotation;

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

matches() 메서드가 true를 반환하면 조건에 만족해서 동작한다

위 인터페이스를 구현해 자바 시스템 속성이 memory=on일 때만 동작하도록 하려면 다음과 같이 한다

@Slf4j
public class MemoryCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String memory = context.getEnvironment().getProperty("memory");
        log.info("memory={}", memory);
        return "on".equals(memory);
    }
}

아래 MemoryConfig의 적용 여부는 MemoryCondtion의 조건에 따라 달라진다

@Configuration 
@Conditional(MemoryCondition.class) //추가 
public class MemoryConfig {
...

@CondtionalOn...

스프링은 @Condtional과 관련해서 편리하게 사용할 수 있도록 수 많은 @CondtionalOn... 를 제공한다

  • @CondtionalOnClass, @ConditionalOnMissingClass
    • 클래스가 있는 경우 동작한다, 나머지는 반대
  • @CondtionalOnProperty
    • 환경 정보가 있는 경우 동작한다
    • ...

자동 구성 라이브러리 직접 만들기

자동 구성에 대해 알아보기 위해 간단한 예제를 만든다

실시간으로 자바 메모리 사용량을 확인하는 예제고 나머지 코드는 생략한다

@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

스프링 부트가 제공하는 자동 구성 기능을 적용할 때 사용하는 애노테이션

@ConditionalOnProperty

memory=on이라는 환경 정보가 있을 때 라이브러리를 적용한다

라이브러리를 가지고 있더라도 상황에 따라서 기능을 켜고 끌 수 있다

자동 구성 대상 지정

스프링 부트 자동 구성을 적용하려면 다음 파일에 자동 구성 대상을 꼭 지정해줘야 한다

src/main/resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports

image

파일 안에 작성하는 내용은 다음이다

memory.MemoryAutoConfig

이는 앞서 만든 자동 구성인 memory.MemoryAutoConfig를 패키지에 포함해서 지정해 준다

스프링 부트는 시작 시점에 org.springframework.boot.autoconfigure.AutoConfiguration.imports 정보를 읽어서 자동 구성으로 사용한다

빌드

스프링 부트 자동 구성 기능이 포함된 jar 파일을 만든다

  • 빌드 명령어
    • ./gradlew clean build
  • 빌드 결과
    • build/libs/*.jar

image

자동 구성 라이브러리 사용

새 프로젝트(project-v2)를 만들어서 위에서 만든 자동 구성 라이브러리를 적용한다

  • project-v2/libs 폴더에 자동 구성 라이브러리(memory-v2.jar) 추가
  • dependencies { implementation files('libs/memory-v2.jar') //추가

라이브러리 설정

memory-v2의 자동 구성은 memory=on 조건을 만족할 때 실행한다

아래와 같이 설정한다

image

자동 구성 이해

스프링 부트 자동 구성이 동작하는 방식은 다음 순서로 확인할 수 있다

  • @SpringBootApplication
  • -> @EnableAutoConfiguration
  • -> @Import(AutoConfigurationImportSelector.class)
  • -> resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 열어서 설정 정보 선택
  • 해당 파일의 설정 정보가 스프링 컨테이너에 등록되고 사용

@EnableAutoConfiguration 동작 방식

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {...}

AutoConfigurationImportSelectorImportSelector 의 구현체고 설정 정보를 동적으로 선택할 수 있다.

이 코드는 모든 라이브러리에 있는 다음 경로의 파일을 확인한다

META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports

스프링 부트는 org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 읽어서 자동 구성으로 사용한다

memory-v2 - org.springframework.boot.autoconfigure.AutoConfiguration.imports

image

spring-boot-autoconfigure - org.springframework.boot.autoconfigure.AutoConfiguration.imports

image

 

반응형

'스프링 부트' 카테고리의 다른 글

엔터티 update 후 findById vs findAll  (2) 2024.07.24
외부설정과 프로필2  (0) 2024.06.07
외부설정과 프로필 1  (0) 2024.06.01
타임리프 스프링 통합과 폼  (0) 2024.05.29
타임리프 기본  (0) 2024.05.23