프레임워크 별 Configuration 제어
Spring 과 Spring Boot 는 버전에 따라 Configuration 을 구성하는 방식이 다르다. Spring 은 전통적인 XML 기반의 비교적 가독성이 떨어지는 구성 방식을 탈피하였고, Spring Boot 는 자동설정 기능을 통해 빠른 개발환경 구성을 할 수 있게 진화하고 있다.
구분 | Spring 2.5 미만 | Spring 2.5 이상 | Spring Boot |
---|---|---|---|
생성형식 | XML | XML, 어노테이션 | 어노테이션 |
자동설정 여부 | - | - | 가능 |
Spring 의 전통적인 Configuration 구조 생석 방식
Spring 의 전통적인 Configuration 파일의 생성법(XML 기반)은 다음과 같다.
<beans>
<context:annotation-config />
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.demo" use-default-filters="false">
<context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value=""/>
</bean>
<!-- ... -->
</beans>
보편적으로 오래된 레거시 프로젝트에 적용되는 경우가 많아 자잘한 설정이 많다는 점도 있겠지만, 기본적인 부분들까지도 일일이 설정해줘야 하는 번거로움이 있는 것은 사실이다.
Spring Boot 의 AutoConfiguration
Spring Boot 의 Configuration 구성 방식은 다음과 같다.
package com.nexon.quicksample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QuicksampleApplication {
public static void main(String[] args) {
SpringApplication.run(QuicksampleApplication.class, args);
}
}
@SpringBootApplication 어노테이션은 기존 Spring 서비스를 구동시키기 위한 모든 기본 설정을 지정해 놓은 어노테이션으로, 그의 내부는 아래 3개의 주요한 어노테이션 기능으로 구성되어 있다.
어노테이션 명 | 설명 |
---|---|
@SpringBootConfiguration | Spring Boot 의 고유 설정을 나타내는 어노테이션, Configuration Bean 의 자동검색을 가능하게 해주는 역할을 한다 |
@EnableAutoConfiguration | classpath 로 지정된 경로 내용을 기반으로 영리하게 설정 자동화를 수행하는 자동 설정의 핵심 어노테이션(중요*) |
@ComponentScan | 특정 패키지 경로를 기반으로 @Configuration 에서 사용할 @Component 설정 클래스를 찾는 어노테이션 |
@SpringBootApplication 어노테이션 하나만으로 앞 절의 수많은 설정들 중 (거의) 절반 이상이 자동 설정된다. Spring Boot 는 표준이 되는 기본 설정은 굳이 명시하지 않아도 자동 설정된다는 뜻이다. (이를 Spring Boot 의 AutoConfiguration 이라 한다)
Spring Boot 에서 어떠한 기본 설정을 쓰고 있는지는 interface WebMvcConfigurer 의 구현체는 class WebMvcAutoConfigurationAdapter 를 살펴보면 알 수 있다.
Spring Boot 의 Configuration 구조 생성 방식
앞절의 내용대로, Spring Boot 는 대부분의 설정을 자동적으로 생성해 주지만, 모든 서비스마다 고유한 커스텀 설정은 필요하기에 아래의 방법으로 커스텀 설정을 제어할 수 있다.
package com.nexon.quicksample.core.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class ContextConfig implements WebMvcConfigurer {
/*
... 커스텀하게 제어할 설정만 @Override 하여, 추가 제어한다
*/
}
우선 @Configuration 어노테이션으로 해당 클래스가 Configuration 설정을 위한 클래스 임을 선언한다. 이는 전통적인 구성 방식에서
두 번째로 WebMvcConfigurer 를 상속 받는다. 이는 커스텀 설정할 내용에 대한 메서드를 재정의 하기 위한 행동이다. 상속받은 메서드들 중 하나를 재정의(Override) 하는 것이, 곧 기본 설정을 고치는 행위라고 볼 수 있다.
interface WebMvcConfigurer 의 메서드 리스트를 살펴보면 어떠한 설정을 제어할 수 있는지(=어떠한 메서드를 Override 할 수 있는지) 확인할 수 있다