SPRING/스프링부트 개념과 활용

[스프링 부트 개념과 활용] 자동 설정 @EnableAutoConfiguration

JUMP개발자 2020. 12. 13. 23:22

메인 클래스에 붙어 있는 @SpringBootApplication은 크게 3가지가 합쳐져 있다고 볼 수 있다.
1. @SpringBootConfiguration
2. @ComponentScan
3. @EnableAutoConfiguration

 

스프링 부트 어플리케이션은 Bean을 2번 등록한다.

처음에 ComponentScan으로 통하여 등록하고, 그 후에 EnableAutoConfiguration으로 추가적인 Bean들을 읽어서 등록한다.

 

@ComponentScan 은 아래와 같은 Component들을 Scan 합니다.

  • @Component
  • @Configuration @Repository @Service @Controller @RestController

@EnableAutoConfiguration

AutoConfiguration은 Bean을 등록하는 자바 설정 파일이다.

spring.factories 내부에 여러 Configuration 들이 있고, 조건에 따라 Bean을 등록한다.

 

 

아래와 같이 의존성을 pom.xml에 추가하도록 한다.

  <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>

 

아래 스크린샷과 같이 클래스를 생성합니다.

Configuration 작성

-> @EnableConfigurationProperties 어노테이션을 이용하여 Property 파일 관련 설정을 합니다.

-> @ConditionalOnMissingBean은 Component Scan단에서 Bean이 등록되어 있지 않을 때에만, 아래의 Bean이 등록되도록 하는 설정이다.

(스프링부트는 Bean을 2번 등록하는데, 먼저 componentScan을 하고, 그 다음에 EnableAutoConfiguration을 하기때문에, 새로 만들어준 Bean이 componentScan에 의해 먼저 등록된 후에 EnableAutoConfiguration에 의해 덮어써진다.)

@Configuration
@EnableConfigurationProperties(JumpProperties.class)
public class JumpConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Jump jump(JumpProperties jumpProperties) {

        Jump jump = new Jump();
        jump.setAge(jumpProperties.getAge());
        jump.setName(jumpProperties.getName());
        return jump;
    }

}

Properties 작성

-> @ConfigurationProperties 를 추가하고, application.properties에서 사용할 prefix를 괄호 안에 기입한다.

@ConfigurationProperties("jump")
public class JumpProperties {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Jump{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

spring.factories 파일 생성

main - resources에 META-INF 디렉토리를 만들고, 그 안에 spring.factories 파일을 만들어준다.

아래와 같이 하면 패키지이름.Configuration파일명을 자동으로 불러온다. (EnableAutoConfiguration이 켜져있을 경우)

아래와 같이 maven 빌드를 하면, local maven storage에 jar파일이 생성, 설치됩니다.

 

다른 프로젝트에서 Bean 사용하는 방법

-> 아래 <artifactId></artifactId> 가 있는 3줄을 복사하여 다른 프로젝트 dependecy에 추가합니다.

Maven build 후 External Libraries 를 보면 정상적으로 Maven library 설치가 된 것을 알 수 있을 것이다.

아래 프로젝트 테스트를 할 수 있는 Runner Class를 작성합니다.

 

Properties 값을 가져오도록 하기 위해서 아래와 같이 resources-> application.properties 에 key, value를 작성합니다.

위 console은 실행 결과입니다.