Spring boot
Spring MVC의 문제점
- 다양한 모듈들읠 설정을 적용해야 함
- 클라이언트가 구현 코드에 직접적으로 접근하게 하지 않고 인터페이스를 통해 접근할 수 있도록 하는 방법은 좋은 방법
- 하지만 설정해야 할 일이 많아 실제로 구현해야 하는 비즈니스 로직과는 무관한 설정 오류 때문에 시간 허비
- 이를 해결하기 위해 spring boot가 만들어짐
- 처음 스프링은 본래 웹을 위해 마든 프레임 워크가 아님
- 즉, 웹을 위한 스프링 MVC를 이용하려면 추가 설정이 필요
Spring boot project layout
빌드 결과 파일 포맷에 따른 폴더 규격 구분
- 결과 파일 포맷
- JAR
- 로컬에서 실행
- WAR
- 웹 애플리케이션 컨테이너에서 실행
- 웹 페이지에서 보여 줘야 하는 정적 자원들과 자바 클래스들이 WEB-INF 폴더를 기주느로 클래스 폴더들이 위치함
스프링 부트에서 웹 자원들을 실행하기 위한 규약
- JAR
- 정적 html 파일
src/main/resources/static
src/main/public
- 웹 페이지 대표 아이콘
src/main/resources/favicon.ico
- 템플릿
src/main/resources/templates
webJAR을 이용한 외부 프론트엔드 라이브러리 관리
- JS 라이브러리들은 웹 페이지상에 추가해서 사용
- 일괄적으로 관리하기 어려움
- webJAR을 이용하면 다른 서버측 라이브러리들처럼 jar 형태로 메이븐이나 그래들을 이용해서 관리 가능
Spring boot 실행
spring-boot-cli
- 스프링 부트 명령 실행 도구
- 다운 링크
- 경로 설정 필수
- bin 폴더를 기준으로 한다.
- 실행
- test.groovy를 만들어서 실행
spring run test.groovy
@RestController
class App{
@RequestMapping("/")
def home(){
"hello, World"
}
}
gradle을 이용한 스프링 부트 설정
- 기존 프로젝트들은 메이븐이나 그래들 같은 빌드도구를 사용함
- Build.gradle
plugins { id 'java' id 'org.springframework.boot' version '1.5.8.RELEASE' } ext{ springBootVersion='1.5.8.RELEASE' } sourceCompatibility = 1.8 targetCompatibility = 1.8 sourceSets{ main{ java { srcDir 'src/main/java' } resources{ srcDir 'src/resources' } } } repositories { jcenter() } dependencies { compile 'org.springframework.boot:spring-boot-starter-web' compile "org.springframework.boot:spring-boot-starter-thymeleaf" compile "org.springframework.boot:spring-boot-devtools" compile group: 'org.webjars', name: 'webjars-locator', version: '0.32' compile 'org.webjars:jquery:3.1.0' compile 'org.webjars:bootstrap:3.3.1' compile 'org.webjars:materializecss:0.96.0' compile 'org.slf4j:slf4j-api:1.7.7' }
- 스프링 부트 플러그인을 사용할 수 있도록 설정
- 스프링 부트를 사용할 때는 설정을 스프링 부트로 위임, 버전 관리도 스프링 부트에 의해 관리
controller를 이용해서 Testing
HemeController
@RestController public class HomeController { @RequestMapping("/") public String hello() { return "hello"; } }
-
@RestController
- 기존ResponseBody 어노테이션과 컨트롤러 어노테이션을 조합해서 만들던 부분을 좀 더 간결하게 사용하기 위한 어노테이션
main
@SpringBootApplication
public class UIMain {
public static void main(String ar[]){
SpringApplication.run(UIMain.class, ar);
}
}
- 스프링 부트는 기본적으로 WAR이 아닌 JAR 혀애로 동작
- 따라서, main 메서드를 이용해서 실행
-
@SpringBootApplication
-
@Configuration과 @EnableAutoConfiguration, @ComponentScan 세 가지의 어노테이션의 역할을 합침
-
@ComponentScan
- 컨트롤러 클래스들을 읽을 수 있도록 스캔 패키지를 지정함
-
@EnableAutoConfiguration
- 설정들에 소모되는 시간을 단축하기 위한 스프링 부트 제공 서비스
- 공통적으로 필요한 DispatcherServlet 같은 설정을 어노테이션을 이용해 대신할 수 있도록 함
-
@Configuration
- 설정임을 나타내는 어노테이션
-
@ComponentScan
-
@Configuration과 @EnableAutoConfiguration, @ComponentScan 세 가지의 어노테이션의 역할을 합침
정적 자원 관리
- 정적 자원
- html, css, image, javascript와 같이 컴파일이 필요 없는 파일들
웹 리소스 폴더
- html, css, image, javascript와 같이 컴파일이 필요 없는 파일들
- web resource folder
-
/META-INF/
resource, static, public
- 웹 MVC 설정을 담당하는 WebMvcAutoConfiguration 클래스는 기본 설정으로 웹 리소스 폴더에서 정적 자원을 찾는다.
-
- 템플릿 엔진 의존성을 클래스 패스에 추가하면 스프링 부트에서는 자동으로
src/main/resources/templates
경로를 기본 경로로 인식함
웹 리소스 폴더 설정
- 스프링 부트의 기본 설정 대신 javaConfig 클래스 파일을 만들어서 설정 추가 가능
- static이나 pulic 폴더 이외 다른 폴더 지정하기 위해
- 또는 별도의 리졸버를 추가하거나 캐시 설정 변경하는 등의 작업을 위해
- WebMvcConfigurationaDAPTER 클래스의 ADDrESOURCEhANDLERS 메서드를 오버라이드 해서 설정 가능
assets 폴더 추가
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**")
.addResourceLocations("classpath:/assets/", "/assets/");
}
}
- addResourceHandlers
- 이 메서드 내부에서 두 개의 파라미터들을 입력해서 설정할 수 있음
- addResourceHandler
- 호출 경로로 사용될 URI 값 입력
- addResourceLocations
- 실제로 파일이 위치할 폴더 경로
리소스 주소에 MD5 값 설정
- 브라우저에 내장된 캐시는 파일 내용과는 상관없이 요청한 request 파일명이 같으면 동작
- 브라우저의 캐시 제어와 무관히 애플리케이션에서 웹 리소스에 대한 캐시를 관리할 때
- 스프링에서 제공하는 콘텐처 버전 정책을 사용
- URL 주소에 해시값이 추가, 캐시 주기도 별도 설정 가능
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**") .addResourceLocations("classpath:/assets/", "/assets/") .setCachePeriod(3600) //60 * 60 * 24 * 365 1year .resourceChain(true) .addResolver(new VersionResourceResolver() .addVersionStrategy(new ContentVersionStrategy(), "/**")) }
웹 페이지에 버전 리소스 리졸버 적용
- 설정한 versionResourceResolver를 통해 웹 리소스 파일을 호출하려면 ResourceUrlProvider를 이용해 로드하는 것이 좋음
- ResourceUrlProvider를
- 정적 자원들을 우리가 설정한 리졸버에 맞춰 로드할 수 있게 해 줌
@ControllerAdvice
public class ResourceAdvice {
@Autowired
private ResourceUrlProvider resourceUrlProvider;
@ModelAttribute("versionResourceResolver")
public ResourceUrlProvider versionResourceResolver() {
return this.resourceUrlProvider;
}
}
- 타임리프나 JSTL 같은 템플릿 엔진을 사용할 때는 상단에 템플릿 엔진의 alias를 추가한 후 태그를 사용하면 된다.
-
<html xmlns:th="http://www.thymeleaf.org">
```html <!DOCTYPE html>
-