@SpringBootApplication 어노테이션 뜯어보기

2022. 4. 22. 11:43CSE/Spring

내부에 @EnableAutoConfiguration을 확인할 수 있다.

AutoCOnfiguration기능이 해당 어노이테이션을 통해 이루어지는 것을 볼 수 있다.

(1) @EnableAutoConfiguration

이번에는 @EnableAutoConfiguration 안으로 들어오면 다음과 같다.

Import 하는 부분이 있다.

AutoConfigurationImportSelector이 import 되고 있는데 해당 클래스가 진짜 Autoconfiguration이 일어나게 하는 클래스이다.

AutoConfigurationImportSelector 클래스 안으로 들어오면 다음 메소드를 찾을 수 있다.

해당 부분에 debug를 해보면 다음과 같은 사실들을 확인할 수 있다.

getCandidateConfiguration을 통해 AutoConfiguration 목록을 가져온다.

  • getCandidateConfiguration 메소드

    해당 메소드를 열어보았다!

    SpringFactoryLoader를 통해 configurations 리스트를 받아오는 걸 볼 수 있다.

    따라서 loadFactoryNames도 열어보면 다음을 확인할 수 있다.

    위에 쓰여질 설명을 보면 META-INF/spring.factories를 통해 Configuration을 읽어온다는 것을 알 수 있다.

    해당 파일에는 인터페이스와 해당 인터페이스의 구현체들을 확인할 수 있다.

  • checkExcludedClass(), removeAll(), getConfigurationClassFilter()

    exclude한 것이 있다면, 해당 부분을 제외하기 위해 checkExcludedClasses, removeAll 메소드를 실행한다.

    디버그 도중 getConfigurationClassFilter()의 filter() 메소드로 들어가면 다음과 같다.

    for문에서 this.filters를 확인할 수 있는데, filters에 해당하는 부분은 다음 세가지였다.

    • OnClassCondition

    • OnWebApplicationCondition

    • OnBeanCondition

      filter를 걸면 131개였다가 31개로 줄은 것을 확인할 수 있다.

(2) 인터페이스 구현체 살펴보기

구현체들 중 하나인 JdbcTemplateAutoConfiguration 클래스를 확인해보자.

그 중, @ConditionalOnClass 어노테이션을 확인해보면 다음과 같다.

그리고 다음과 같은 설명을 볼 수 있다.

즉, Conditional이 매치가 될 때만 Application Context에 등록이 된다는 의미임을 확인할 수 있다.

매치가 된다는 의미는 해당 클래스들이 classpath에 존재한다는 의미이다.

그리고 JdbcTemplateAutoConfiguration 클래스의 Import 어노테이션에 있는 JdbcTemplate Configuration을 들어가보면 실질적인 Bean이 있는 것을 확인할 수 있다.

(3) 최종 결론

이를 통해 @SpringBootApplication이 AutoConfiguration에 의해서 Bean 설정들을 특정 조건에 맞게 자동화해주는 것을 알 수 있다.