스프링부트-자동구성(AutoConfig)

Shaun·2023년 3월 10일
1

SpringBoot

목록 보기
18/21
post-thumbnail

Auto Configuration(자동구성)

  • 스프링 부트는 자동 구성(Auto Configuration)이라는 기능을 제공하는데, 일반적으로 자주 사용하는 수 많은 빈들을 자동으로 등록해주는 기능

  • ex: JdbcTemplate, DataSource, TransactionManager..

  • @AutoConfiguration - 자동구성시 필요한 애노테이션, 인자로 들어오는 값 다음에 실행하도록 설정

  • @ConditionOnClass - if문과 비슷하다, 인자로 들어오는 클래스가 있는경우에만 동작함! 없으면 여기 있는 설정, 빈 다 무효화!

  • @ConditionalOnMissingBean - 위와 반대로, 인자로 들어오는 클래스가 없는경우에만 동작
    ->개발자가 직접 빈등록을 하는 경우에는 스프링에서 이것을 먼저 사용함

@Conditional

  • 빈으로 등록한 기능을 특정 조건에서만 사용하고 싶을때
public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
  • 이 기능을 사용하려면 Condition 인터페이스를 구현해야한다.

  • ConditionContext: 스프링 컨테이너, 환경정보

  • AnnotatedTypeMetadata : 애노테이션 메타 정보

  • key에 해당하는 환경정보가 true 이면 동작하도록 설정

  • 이렇게도 사용 가능, 따로 testCondition구현체를 만들 필요 없다 왜냐하면



  • 똑같이 Condition 인터페이스를 구현해 동작하기 떄문에

  • 이 외에도
    CondtionalOnBean
    CondtionalOnResource
    CondtionalOnExpression.
    .
    .

@Conditional 은 스프링 기능이며 @ConditionalOnXXX는 스프링 부트기능

라이브러리 만들기

라이브러리 만들기 순서

  1. 라이브러리 코드작성 후 빌드 -> jar 추출
  2. jar 를 libs안에 넣는다
  3. dependency -> implementation files(경로) 추가
  4. Bean 등록
  • 라이브러리 하나를 만드는데도 이런 복잡한 과정이 필요하다

  • 또한 라이브러리를 사용하는 클라이언트 개발자 입장에서는 어떤것을 빈으로 등록해야 하는지도 알아야한다

  • 이를 해결하기위해 스프링부트는 자동구성(AutoConfiguration) 을 지원한다.

AutoConfiguration

1. 애노테이션 선언

  • bean 등록해주는 config클래스에 선언 해준다.

2. 자동구성 대상지정

  • src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일생성

  • 이렇게 해주면 스프링부트에 자동 빈등록 된다.

  • 다른 프로젝트에서 자동빈등록 설정후 build한 파일을 이제는 다른 프로젝트 libs 넣고 위 옵션 + 디펜던시 추가만 해주면 자동으로 빈등록이 되기때문에 바로 사용 가능하다

3. 빌드후 사용할 프로젝트 libs에 넣기

  • 디펜던시는 기존방법과 동일하게 추가 해준다.
  • 이렇게 123순으로만 해주면 따로 빈등록이 필요 없다.

AutoConfiguration 원리

  • 스프링 부트가 시작이 되면 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 경로에 있는 파일을 읽어서 자동구성이 된다.

  • 순서는 @SpringBootApplication ->@EnableAutoConfiguration -> @Import(AutoConfigurationImportSelector.class) 순으로 진행 된다.

  • @Import는 주로 스프링 설정정보(@Configuration) 을 포함할때 사용한다. 그런데 AutoConfigurationImportSelector 을 열어보면 @Configuration이 아니다. 이것을 이해하기위해서는 ImportSelector 에대해 알아야한다.

ImportSelector 인터페이스

  • @Import를 통해 설정 정보를 추가하는 방법은 크게 두가지가 있다.

1. 정적방법 : @Import(클래스)
2. 동적방법 : @Import(ImportSelector)

  • 정적인 방법은 해당 클래스를 넣어주기만 하면 된다.

  @Configuration
  @Import({AConfig.class, BConfig.class})
  public class AppConfig {...}
  • 동적인 방법ImportSelector 인터페이스를 구현해야한다.
   public class HelloImportSelector implements ImportSelector {
      @Override
      public String[] selectImports(AnnotationMetadata importingClassMetadata) {
          return new String[]{"hello.selector.HelloConfig"};
} }
  • 패키지.config클래스
  • 여기에 설정 정보로 사용할 클래스를 동적으로 프로그래밍 하면 된다.

  • AutoConfigurationImporterSelector.class는 ImportSelector의 구현체이며 설정 정보를 동적으로 설정할 수 있다.
profile
호주쉐프에서 개발자까지..

0개의 댓글