Spring Framework 도 훌륭한 도구이지만 매번 설정을 해줘야해서 초기 개발 시간에 들어가는 비용이 많다는 문제점이 있다. 또한 이러한 설정들을 사람이 하다보면 실수가 생기게되고 초반 오류를 잡아내는 것에서 시간이 오래걸린다.
이러한 문제점을 해결하기 위해서 나온것이 SpringBoot이다.
SpringBoot는 평소 개발을 하면서 많이 사용하는 내부 디펜던시를 관리합니다.
스프링 부트에서 웹 자원들을 실행하기 위한 규약
- 스프링 부트는 기본적으로 Runnable JAR로 실행되므로 WAR 규격에 맞춰서 WEB-INF 폴더를 만들거나 webapp 폴더를 만들지 않고 웹 자원들을 사용하기 위한 몇 가지 규약을 제공한다.
웹자원 | 경로 |
정적 HTML 파일 | src/main/resources/static src/main/public |
웹 페이지 대표 아이콘(Favicon) | src/main/resources/favicon.ico |
템플릿 | src/main/resources/templates html - Thymeleaf tpl - Groovy ftl - Freemarker vm-velocity |
Spring Boot는 기본적으로 WAR가 아니라 JAR 형태로 동작한다. 그래서 main 메서드를 이용해서 실행한다.
main 메서드가 실행되면 내장된 톰캣이 실행되서 웹을 통해 접근할 수 있다. 스프링 부트에서는 설정들에 소모되는 시간들 단축하기 위해서 EnableAutoConfiguration 어노테이션을 제공한다.
EnableAutoConfigurlation 어노테이션은 공통적으로 필요한 DispatcherServlet같은 설정을 어노테이션을 제공한다.
@SpringBootApplication 어노테이션의 역할
@SpringBootApplication이 없다면 컨트롤러 클래스들을 읽은 수 있도록 스캔 패키지를 지정하는 ComponentScan과 설정임을 나타내는 @Configuration 그리고 미리 정의된 xxxConfiguaration 클래스들을 읽을 수 있도록 하는 @EnableAutoConfiguration 어노테이션이 필요하다.
정적 자원 관리
정적 자원이란 html, css, image, javascript와 같이 컴파일이 필요 없는 파일들을 말한다. 스프링 부트에서 제공하는 정적 자원 경로는 다음과 같다.
이 세 개의 폴더를 이후부터는 웹 리소스 폴더(web resource folder)라고 하자. 스프링 부트에서 웹 MVC 설정을 담당하는 WebMvcAutoConfiguration 클래스는 기본 설정으로 웹 리소스 폴더에서 정적 자원들을 찾고, 이때 프리마커(FreeMarker), 그루비(Groovy), 타임리프(Thtmeleaf), 머스터시(Mustache)와 같은 템플릿 엔진 의존성을 클래스패스에 추가하면 스프링 부트에서는 자동적으로 src/main/resources/templates 경로를 기본 경로로 인식하게 된다. 이는 패키징 결과에 따른 차이라고 볼 수 있다. 기존에 스프링 MVC 모듈로 개발을 할 때는 늘 패키징 유형이 'WAR'였으므로 늘 src/mai/webapp 폴더를 만들고 webapp 하위에 jsp, html과 같은 파일들을 두었다. 하지만 스프링 부트로 개발할 때는 기본 패킹 설정이 'JAR' 이므로 기본 디렉터리 설정이 차이가 있다.
쉽게 말해 /src/main/resources는 클래스패스와 같고 static 폴더는 WeBMvc AutoConfiguration 클래스에서 인식하므로 브라우저에서는 추가한 images 경로만 있으면 된다.
localhost:8080/images/icon-spring-framework.svg 라고하면 static.images.icon-spring-framework 파일이 화면에 보여진다.
스프링 부트의 기본설정대신 내가만들 폴더를 접근 할려고한다면 WebMvcConfigureAdapter 클래스의 addResourceHandlers 메서드를 오버라이드해서 설정할 수 있다.
클래스패스란(Class Path)란??
클래스패스란 말 그대로 클래스를 찾기위한 경로이다. 자바에서 클래스패스의 의미도 똑같다. 즉, JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일 경로를 말하는 것이다. 소스 코드(.java로 끝나는 파일)를 컴파일하면 소스 코드가 “바이트 코드”(바이너리 형태의 .class 파일)로 변환된다. java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 한다. 이때 .class 파일을 찾을 때 classpath에 지정된 경로를 사용한다. classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록이다. java runtime은 이 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 .class 파일을 찾는다. 찾으려는 클래스 코드가 포함된 .class 파일을 찾으면 첫 번째로 찾은 파일을 사용한다.
classpath를 지정할 수 있는 두 가지 방법이 있다. 하나는 환경 변수 CLASSPATH를 사용하는 방법이고, 또 하나는 java runtime에 -classpath 플래그를 사용하는 방법이다. (-classpath 플래그 사용에 대한 자세한 설명은 java 메뉴얼 페이지를 참조하라.)
@configuration
public class WebConfig extends WebMvcConfigurereAdapter{
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**")
.addResourceLocations("classpath:/assets/","/assets/");
}
}
이제 locallhost:8080/assets 접근할수 있다.
리소스 주소에 MD5 값 설정
브라우저에 내장된 캐시는 파일 내용과는 상관없이 요청한 리퀘스트 파일명이 같으면 동작한다.
브라우저의 캐시 제어와는 상관없이 애플리케이션 에서 웹 리소스에 대한 캐시를 관리하고 싶을 때가 있다.
그런 경우에는 스프링에서 제공하는 콘텐츠 버전 정책을 사용하면 URL 주소에 해시값이 추가되고 캐시 주기도 별도로 설정할 수 있다. 기존에 만든 WebConfig클래스의 addResourceHandlers 메서드에 캐시 관련 내용을 추가하자.
@configuration
public class WebConfig extends WebMvcConfigurereAdapter{
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**")
.addResourceLocations("classpath:/assets/","/assets/");
.setCachPeriod(60 * 60 * 24 * 365) // 1년
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
'개인공부' 카테고리의 다른 글
Spring mybatis mapper 설정 및 repo 설정 (0) | 2020.08.09 |
---|---|
lombok을 사용해보자. (0) | 2020.08.09 |
엔터프라이즈 어플리케이션 (0) | 2020.08.08 |
서블릿 관련 객체들(필터,쿠키,세션) (0) | 2020.08.08 |
MultiPartConfig 어노테이션 (0) | 2020.08.08 |