본문 바로가기
스프링(부트)/스프링부트 내용 정리

[스프링부트] SpringBoot AutoConfigure

by doflamingo 2020. 6. 3.

아래의 내용은 inflearn 강좌인 스프링 부트 개념과 활용을 보고 정리한 글입니다.


Backgrounds

SpringBoot를 실행하게 되면 다양한 설정들이 뜨는 걸 볼 수 있다. 그러나 우리는 Bean으로 등록한 적이 없는데 이런 설정들이 어디서 어떻게 주입이 되는지 알아볼 필요가 있다.

 

@SpringBootApplication

main함수를 보게 되면 보통 @SpringBootApplication 이라는 어노테이션이 존재한다.

 

 

어노테이션을 타고 들어가보면 아래와 같이 다양한 어노테이션이 붙어있다.

 

 

그 중에서 우리가 살펴볼 만한 것은 아래 3개의 어노테이션이다.

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootConfiguration은 그냥 단순히 Configuration으로 등록해놓은 것으로 특별한 것은 없다.

더 유심히 봐야 할 것은 @EnableAutoConfiguration과 @ComponentScan이다.

@ComponentScan

@ComponentScan은 기존 Spring에서도 사용하던 것으로 ComponentScan이 있는 디렉터리부터 하위 디렉터리를 찾아서 @Service, @Repository, @Controller, @RestController,@Component 등의 어노테이션이 붙어 있는 Bean들을 찾아서 등록해준다.

여기서는 @SpringBootApplication 즉, 메인함수가 있는 패키지를 포함한 하위 디렉터리에 있는 Component를 Bean으로 등록해준다.

@EnableAutoConfiguration

@EnableAutoConfiguration이 대부분의 SpringBoot의 설정들을 자동으로 주입해주기 때문에 내장 톰캣이나, DispatcherServlet를 설정해주지 않더라도 쉽게 실행할 수 있게 된다.

이 어노테이션은 org.springframework.boot:spring-boot-autoconfigure라는 프로젝트 내부에 META-INF에 있는 spring.factories 파일에
org.springframework.boot.autoconfigure.EnableAutoConfiguration 라는 key가 존재하고 그 밑에 다양한 value가 존재하는데 그 value값에 해당하는 클래스들을 빈으로 등록하게 된다.

 

그러나 모든 class가 빈으로 등록되는 것이 아닌 조건에 따라서 등록되는 Bean이 있고 아닌 Bean이 있다.

AutoConfigure 만들기

새로운 프로젝트를 하나 생성하고 아래의 dependency를 추가해준다.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.3.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

그리고 bean으로 등록할 class를 하나 생성하고 그에 해당하는 Configuration파일을 만들어준다.

public class Holoman {

    String name;
    int howlong;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHowlong() {
        return howlong;
    }

    public void setHowlong(int howlong) {
        this.howlong = howlong;
    }

    @Override
    public String toString() {
        return "Holoman{" +
                "name='" + name + '\'' +
                ", howlong=" + howlong +
                '}';
    }
}
@Configuration
public class HolomanConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setHowlong(16);
        holoman.setName("Holoman");
        return holoman;
    }
}

위와 같이 두개의 클래스를 생성한 후 resources 에 META-INF 라는 디렉터리를 생성하고 그 안에 spring.factories 라는 파일을 생성한 후 아래의 내용을 추가해준다.

이 과정이 @EnableAutoConfiguration이 해당 클래스를 Bean으로 등록하도록 해주는 기능이다.

org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
  me.doflamingo.HolomanConfiguration

프로젝트 전체의 구조를 보면 아래와 같다.

 

 

프로젝트 구조

 

이 후 Maven Install 을 진행하면 로컬 maven repository에 저장된다.

그리고 또 다른 프로젝트를 하나 만든 후, pom.xml파일에 아까 만들었던 프로젝트를 dependency에 추가해주면 Holoman을 주입받아서 사용할 수 있다.

<dependency>
    <groupId>me.doflamingo</groupId>
    <artifactId>doflamingo-spring-boot-starter</artifactId>
    <version>1.0.2</version>
</dependency>
@Component
public class HolomanRunner implements ApplicationRunner {

    @Autowired
    Holoman holoman;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(holoman);
    }

}

참고로 하나 말하면 ApplicationRunner를 구현한 클래스를 만든 후 Component로 등록하면 SpringBootApplication이 실행할 때 위의 코드가 실행된다.

 

이렇게 우리가 직접 AutoConfiguration을 만들어서 사용할 수 있다.

'스프링(부트) > 스프링부트 내용 정리' 카테고리의 다른 글

SpringBoot 내장 웹서버  (0) 2020.06.04

댓글