Spring Boot 의 자동설정에 대한 이해

김종하·2020년 12월 23일
1

Spring boot booster

목록 보기
11/13

부트의 자동설정?

스프링 부트 래퍼런스에서 스프링 부트의 소개글로 다음과 같은 글이 있다

Spring Boot helps you to create stand-alone, production-grade Spring-based Applications that you can run. We take an opinionated view of the Spring platform and third-party libraries, so that you can get started with minimum fuss.

아주 간단하게 말해서, 어플리케이션이 사용할 스프링 내부의 플랫폼과 외부 라이브러리를 부트가 설정해줌으로써 개발자가 프로젝트의 초기 설정에 많은 비용을 소모하지 않도록 해준다는 뜻이다.

부트 프로젝트를 생성할 때, spring-boot-starter-web 의존성만 추가하고 프로젝트를 생성하면 아무런 작업을 하지 않아도 어플리케이션을 실행하면 8080포트위에서 톰캣서버가 돌아가는 것을 확인할 수 있다.
그렇다면, 이러한 설정들은 도대체 어디서 오는 것일까?

@SpringBootApplication

실마리를 찾을 단서는 바로 이 어노테이션이다. 어노테이션을 타고 들어가 보면 다음과 같다.

여기서 살펴보아야할 부분은 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan 이다.

  1. @SpringBootConfiguration 은 @Configuration 과 동일하게 생각해도 된다.

  2. @ComponenetScan을 기준으로 해당 클래스가 속한 패키지와 그 하부 패키지들의 @Component들을 스캔해 빈으로 등록해주는 역할을 한다.

  3. @EnableAutoConfiguration 에서 스프링 부트가 사용할 빈들을 자동으로 등록해주는 역할을 한다.

  • 참고
    @Target은 어노테이션이 적용가능한 요소를 설정하는 어노테이션이고,
    @Retention 은 어노테이션이 언제까지 유지될지를 설저하는 어노테이션이다.
    @Documented 는 javadoc으로 문서 생성 시 현재 어노테이션에 대한 설명을 추가해주고, @Inherited 어노테이션을 붙인 클래스의 자식 클래스에도 어노테이션이 적용 되도록 하는 어노테이션이다.

@EnableAutoConfiguration

그렇다면, @EnableAutoConfiguration 은 무엇을 기준으로 빈들을 등록해주는 것일까? 바로 META-INF 디렉토리의 spring.factories 파일이다. spring.factories 파일의 org.springframework.boot.autoconfigure.EnableAutoConfiguration 에 대한 키값으로 설정된 클래스들을 자동으로 또 조건에 따라 빈으로 등록시켜준다.

그렇다면, 우리가 생성한 프로젝트를 자동설정하여 빈으로 등록할 순 없을까?
물론 가능하니, 해보도록 하자.
다음과 같은 방법으로 해보도록하겠다

  1. Jaden Class 를 가진 프로젝트
  2. Jaden Class 에 대한 자동설정을 하는 프로젝트
  3. Jaden Class 자동설정을 사용하는 프로젝트

자동설정클래스를 생성하고 사용해보기

  1. Jaden Class 를 가진 프로젝트

maven 으로 jadenproject 를 생성하고 다음과 같은 클래스를 생성했다.

public class Jaden {
    
    public String name;
    
    public String hobby;

    public String getName() {
        return name;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

그리고 설정파일에서 의존성을 추가할 수 있게끔 mvn install 을 통해 로컬 저장소에 해당 프로젝트를 추가했다.

성공적으로 추가된 것을 확인하고, 다음으로 넘어가자.

  1. Jaden Class 에 대한 자동설정을 하는 프로젝트

굳이, 사용할 클래스와 자동설정 클래스를 서로 다른 프로젝트에서 만들필요는 없지만, 이렇게 사용되는 경우가 많기 때문에, 나누어서 진행해보았다.
AutoConfiguration 을 만들기 위해서는 의존성을 추가해야한다.

노란색 박스 안의 의존성들이 자동설정클래스를 생성하기 위한 의존성이고
하늘색 박스 안의 의존성은 바로 위에서 생성한 Jaden 을 사용하기 위해 가져왔다.

그럼 이제, 자동설정파일을 생성해 보자.

@Configuration
public class JadenAutoConfig {

    @Bean
    public Jaden jaden(){
        Jaden jaden = new Jaden();
        jaden.setName("JaDaN");
        jaden.setHobby("programming");
        return jaden;
    }

}

자동설정 파일을 생성했으면, 최종적으로 자동설정이 적용될 프로젝트의 @EnableAutoConfigurtaion 이 읽을 수 있도록 resources 디렉토리 밑에 META-INF 디렉토리를 생성하고 spring.factories 파일을 만들어 다음과 같이 설정해주도록 하자.

마찬가지로 mvn install 을 통해 로컬 저장소에 올리도록 하겠다.

  1. 자동설정을 사용하는 프로젝트

마지막으로, Jaden 에 대한 자동설정을 사용하는 스프링 프로젝트를 하나 생성했다. 그리고, 설정파일에 대한 의존성을 추가하고, 아무런 설정을 하지 않은 상태에서 빈을 주입받아 로그를 찍어 자동설정한 대로 들어가는지 확인해보았다.

잘 적용되고 있음을 확인할 수 있다.

application.properties 활용하기

@ConfigurationProperties("jaden")
public class JadenProperties {

    private String name;
    private String hobby;

    public JadenProperties() {
    }

    public String getName() {
        return name;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

다음과 같은 프로퍼티를 설정할 수 있는 클래스를 생성하고 기존에 만들어두었던 설정클래스를

다음과 같이 변경하였다.

그리고 자동설정을 사용하는 스프링 프로젝트의 applicaton.properties 에서 원하는 값을 넣으면

다음과 같이 잘 적용되는 모습을 볼 수 있다.


*참고: 이 포스팅은 백기선님의 스프링부트 강의를 듣고, 제 나름대로 다시 공부하고 정리한 포스팅 입니다. 만약, 조금 더 자세한 내용을 듣고 싶으시다면 이곳의 강의를 참고해보시기 바랍니다

0개의 댓글