ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 부트 자동설정 과정
    spring/core 2021. 4. 6. 14:54

    배경

    스프링을 알기 이전에 스프링부트를 접했고, 대략 5개월 정도 스프링 부트를 공부하고 있다. IDE 또는 커맨드라인에서 java -jar ...jar를 이용해 수도 없이 애플리케이션을 실행했고 그런가보다하고 그냥 사용해 왔다.

     

    최근에 토비의 스프링으로 스프링에 대해 공부하고 있는데, 스프링을 이용해서 WAS 하나를 띄우기 위해 굉장히 복잡한설정과 많은 작업이 이루어진다는 걸 알아가고 있다. 그러한 굉장히 복잡한 작업을 나는dependency추가와 실행버튼 클릭만으로 자동으로 수행하고 있었다. 

     

    늘 그렇듯 추상화된 Layer를 알고 경험해봤다면 그 경험과 지식을 구체화시켜야 한다. 딥하게는 아니더라도 디버거를 따라가 보며 자동화된 설정을 경험해보자^^

    www.youtube.com/watch?v=ssT24xB9UTc

    위 동영상에서 많은 도움을 얻었다.

     

    main

    인내를 갖고 첫 시작부터 확인해보자. 우선 메인메소드 실행과 동시에 SpringApplication 클래스의 static 메소드인 run이 수행되고 현재 메인 클래스가 파라미터로 전달된다. 또한 반환형이 스프링의 핵심엔진인applicatoinContext임을 확인할 수 있다.(눈으로 확인할 수 있게 반환값을 ac에 받았다) 즉, 내부적으로  ApplicationContext를 만드는데 빈을 생성하고 초기화한다. 여기서 중요한 건 @SpringBootApplication의 내부 동작이다.

     

     

    @SpringBootApplication 동작

    @SpringBootApplication 자체는 복합 애노테이션이다. 이 내부에 있는 애노테이션을 살펴보자

    @ComponentScan은 내가 직접 작성한 빈을 등록해준다고 생각하면 될 것 같다. @SpringBootConfiguration도 단지 이 애노테이션이 설정정보 애노테이션임을 알려준다. 중요한 건 @EnableAutoConfiguration이다

     

    @EnableAutoConfiguration

    여기서 AutoConfigurationImportSelector 클래스에서 설정정보를 가져온다. 진짜 핵심이다.

     

     

    AutoConfigurationImportSelector에서 자동설정을 위한 엔드리를 얻는 과정인데getCandidateConfigurations()를 통해 후보가 될 엔트리를 전부 가져온다.

     

    그리고 기본적으로 META-INF/spring.factories에서 자동설정 후보가 될 클래스를 String으로 가져오고 130개나 가져오는 걸 확인할 수 있다. 여기에는 자동설정 지원하는 모든 클래스가 포함되고 프로젝트에서 사용하는 대부분의 오픈소스 프레임워크는 다 들어 있다고 보면 된다(security, jpa 등등)

     

     

    @Conditional(조건부 빈 등록 애노테이션)

    이제 여기서 모든 설정클래스를 로딩하며 체크하는 건 맞지만 컨테이너에 전부 올리지는 않는다. @Conditional이란 애노테이션을 통해 조건을 통과한 클래스만 컨테이너에 올라가게 되고 컨테이너에 올라간 설정클래스는 비로소 설정과 관련한 작업을 수행하게 된다. @Conditional을 이용해 상상가능한 모든 조건을 구현할 수 있으며 spring boot는 미리 확장해 구현해놨다.

    @ConditionalOnBean, @ConditionalOnMissingBean

     

    지정한 클래스가 빈으로 등록되어 있는 경우에만 해당 클래스를 빈으로 등록. JPA설정 시 DataSource가 빈으로 등록되어 있는지 확인할 때 등등 사용된다.

     

    @ConditionalOnClass, @ConditionalOnMissingClass

    이 두 조건 애노테이션으로 gradle로 의존성을 추가해주는 작업만으로 자동설정클레스가 빈으로 등록되게 할 수 있다. spring security의존성을 추가해주기만 해도 마법처럼 login화면을 렌더링하는 작업을 처리하는 것이다!

    @ConditionalOnProperties

    환경변수 유무로 확인

     

     

    MailSenderAutoConfiguration 확인해보기

    @Configuration을 통해 빈 설정 클래스임을 확인하고 @ConditionalOnClass를 통해 MimeMessage, MailSender 클래스가 라이브러리로 추가되었는지 확인한다. @ConditionalOnMissingBean을 통해 MailSender의 중복 등록을 막아주고 위조건을 통과했으면 @Import를 통해  MailSenderJndiConfiguration을 수행한다.

     

    MailSenderJndiConfiguration 클래스의 빈 등록 메서드이며 이 메서드 수행을 통해 리턴되는JavaMailSenderImpl 객체는 내가 원하는 곳에 AutoWired해서 사용할 수 있다.

     

     

    'spring > core' 카테고리의 다른 글

    Spring Interceptor 사용 및 동작 정리  (0) 2021.05.14
    스프링 DI 방법  (0) 2021.05.06
    DispatcherServlet에서 요청을 처리하는 과정  (0) 2021.04.05
    HandlerMethodArgumentResolver 동작 원리  (0) 2021.03.08
    AOP 동작 원리  (0) 2021.03.06

    댓글

Designed by Tistory.