스프링 부트 - 의존성 관리와 그 설정

600g (Kim Dong Geun)·2020년 9월 4일
0

본 글은 나중에 내가 볼려고 정리한 Document 입니다.

본 포스팅은 스프링 부트 Quick Start를 참고하여 작성했습니다 📖

저녁 먹기 전에 쓰는데 저녁메뉴 뭐먹을지 고민 중입니다.🍽🤔

스프링 부트의 의존성 관리

스프링 부트를 구성하는 핵심 요소는 스타터(Starter), 자동설정(AutoConfiguration), 액추에이터(Actuator)이다.

그리고 그 기능은 다음과 같다.

요소기능
스타터(Starter)스프링이 제공하는 특정 모듈을 사용할 수 있도록 관련된 라이브러리 의존성을 해결한다.
자동설정(AutoConfiguration)스타터를 통해 추가한 모듈을 사용할 수 있도록 관련된 빈 설정을 자동으로 처리해준다.
액추에이터(Actuator)스프링 부트로 개발된 시스템을 모니터링할 수 있는 다양한 기능을 제공한다.

스프링 부트의 자동설정

스프링부트는 Starter를 통해서 라이브러리들을 추가해준다. 그러나 라이브러리들이 추가되고 나면 추가된 모듈을 적절히 사용할 수 있도록 스프링 설정 파일에 빈도 등록하고 의존성 주입도 적절히 처리해야 한다.

기존의 스프링과는 다르게 스프링 부트는 이러한 기능을 자동으로 설정해준다.

자동 설정이란?

스프링 부트로 만든 프로젝트에는 어플리케이션 실행을 위한 메인 클래스가 기본적으로 제공된다.

이 메인 클래스를 실행하면 내장 톰캣이 구동되고 스프링 기반의 웹 어플리케이션이 잘 동작하는 것을 볼 수 있다.

스프링 MVC를 이용한 개발자라면, 아무리 간단한 웹 어플리케이션이라도 기본적으로 여러가지 설정이 필요하다라는 것을 잘 알텐데... 우리는 이러한 복잡한 설정 없이도 웹 어플리케이션을 만들고 실행할 수 있다.

그핵심은 바로 스프링 부트가 제공하는 @SpringBootApplication 이라는 어노테이션에 있다.

그러면 어떻게 스프링 부트는 메인클래스의 @SpringBootApplication 하나만으로 복잡한 설정들을 대신할 수 있을까?

@SpringBootApplication은 다양한 설정들을 포함하고 있기 때문이다.
중요하게 3가지의 어노테이션을 포함하고 있는데, @ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration 들이다.

그 외에도 어노테이션을 포함하고 있지만 별로 중요하지 않으므로 생략한다.

@SpringBootConfiguration

아무튼 각각에 대해서 설명을 하자면, 먼저 @SpringBootConfiguration에대해 먼저 설명하겠다.

음 @Configuration과 똑같다. 이 정도만 알고있는데 다른 것도 있으려나?

@ComponentScan

아무래도 @Compoent로 등록된 클래스를 빈에 등록하고 사용할 수 있게 해준다. 당연히 @Service,@Controller,@Configuration 등도 빈으로 등록이 된다.

xml에서 <context:component-scan base-package=""/>과 같은 기능을 한다.

@EnableAutoConfiguration

요게 중요하다. 스프링 부트는 스프링 컨테이너를 구동할 때 두 단계로 나누어 객체들을 초기화 한다. 예를들어서 업로드 기능이 추가된 BoardController 같은 컨트롤러를 구동하기 위해서는 MultipartFile과 같은 업로드 가능한 컨트롤러를 구현해야한다. 그러나 실제로 업로드 기능이 동작하기 위해서는 MultipartResolver객체가 반드시 필요하다.

즉 내가 만든 컨틀롤러 뿐만 아니라CommonsMultipartResolver와 같은 객체들을 메모리에 올리는 작업들을 수행한다.

또한 @EnableAutoConfiguration 어노테이션은 spring-boot-autoconfigure-2.1.5.RELEASE.jar 파일에 포함되어있다.

해당 jar파일 내부에는 META-INF폴더에 spring.factories파일이 존재하는데 스프링 부트의 메타데이터가 저장되있다. 스프링 부트는 위 파일을 참조하여 여러가지 Bean을 생성한다.

spring.factories 파일을 열어보면
org.springframework.boot.autoconfigure.EnableAutoConfiguration이라는 키값으로 엄청나게 많은 환경 설정 클래스들이 등록되어 있는 것을 확인할 수 있다.

이 중에서 WebMvcAutoConfiguration 클래스를 열어서 확인하면 다음과 같은 annotation이 존재하는 것을 볼 수 있다

  • WebMvcAutoConfiguration.java
@Configuration
@ConditionalOnWebApplication(Type = Type.SERVLET)
@ConditionalOnClass({Servlet.class, DispatcherSErvlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGIEST_PRECEDENCE + 10)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class,
    TaskExecutionAutoConfiguration.class,
    ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration{
}

로 설정되어있는데 하나하나 설명해보자면,

@ConditionalOnWebApplication

웹 어플리케이션 타입이 어떻게 설정되어있느냐를 확인하는 어노테이션이다.

type 속성값이 Type.SERVLET으로 설정되어있는데, 스프링 어플리케이션을 SERVLET으로 실행하겠다는 것이다.

이외에도 NONE, REACTIVE, SERVLET 중 하나로 저장할 수 있다.

@ConditionalOnClass

특정 클래스가 클래스 패스에 존재할 때, 현재 설정 클래스를 적용하라는 의미다.

따라서 위 설정은 클래스 패스에 Servlet, DispatcherSErvlet,WebMvcConfigurer 클래스가 존재하면 이 설정 클래스가 동작하도록 설정한 것이다.

@ConditionalOnMissingBean

특정 클래스 객체가 메모리에 없을 때, 현재 설정 클래스를 적용하라는 의미다.

따라서 WebMvcConfigurationSupport 객체가 없을때만 현재 설정 클래스가 동작한다.

@AutoConfigureOrder

자동 설정 클래스들의 우선 순위를 지정할 때 사용한다.

Ordered.HIGHEST_PRECEDENCE + 10 설정은 현재 자동 설정 클래스의 우선 순위를 가장 높은 우선순위보다 10단계 더 높게 설정한 것이다.

@AutoConfigureAfter

현재의 자동 설정 클래스가 다른 자동 설정 클래스 다음에 적용되도록 지정할 때 사용된다.

위 설정대로라면, DispatcherServletAutoConfiguration, TaskExecutionAutoConfiguration, ValidationAutoConfiguration이 모두 처리된 이후에 적용된 것이다.

profile
수동적인 과신과 행운이 아닌, 능동적인 노력과 치열함

0개의 댓글