파게로그
DevTools, Thymeleaf, View Resolver 본문
Spring Tool Suite 4를 이용해 Spring Boot 프로젝트 만들기
IntelliJ에서 Gradle 프로젝트로 만들어보고 싶지만 일단은 강의를 따라서 Spring Tool Suite 4에서 Maven 프로젝트로 생성해본다. 물론 큰 차이는 없다.
차후에 Gradle을 사용해보기로 하고 일단은 Maven project로 생성해준다.
dependencies에 Spring Web을 추가해준다.
오랜만에 main( )을 만났다. Tomcat도 Spring Boot 아래에 있다는 것을 알 수 있다.
com.ddoongi.springweb.controller 패키지에 HomeController 클래스를 추가해준다. 이 때 annotation의 스캔 범위가 com.ddoongi.springweb인 점을 참고한다.
package com.ddoongi.springweb.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@RequestMapping("/index")
public String foo() {
return "hello";
}
@RequestMapping("/help")
public String bar() {
return "hi";
}
}
이렇게 하고 보편적인 Java application처럼 main( )을 실행하면 서버가 시작된다.
한편 파일들에 대한 홈 디렉터리는 다음과 같다.
동적 파일 홈 디렉터리
src/main/webapp
정적 파일 홈 디렉터리
src/main/resources/static
하지만 이는 둘 다 접근 가능한 경로인데, 예를 들어 src/main/resources/static에 index.html을 넣고 locahost:8080/index.html로 접속하면 곧바로 접근이 가능하다.
한편 클래스에 붙일 수 있는 대표적인 annotation으로는 @Controller 외에 @RestController도 있다. @Controller는 View단이 있을 때 사용하며, @RestController는 String을 반환한다. 메서드에 붙이는 annotation인 @ResponseBody와 유사하다.
package com.ddoongi.springweb.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller // View단이 있을 때
// @RestController String 반환
public class EmpController {
@RequestMapping("/group/emp/list")
public String list(Model model) {
model.addAttribute("test", "helllooo");
// return "/group/emp/list.jsp"; 경로가 같으면 생략 가능
return "list.jsp";
}
}
View Resolver를 설정하여 View의 접두사 및 접미사 설정하기
정적 파일에 대한 직접적인 접근을 막기 위해서 아래와 같이 개선할 수 있다. View단 파일의 위치를 예를 들면 src/main/webapp/WEB-INF/view/customer/notice/index.jsp로 한다. 이로써 바로 접근할 수 없도록 하며, Controller와 구조를 맞추어준다.
@Controller
@RequestMapping("/customer/notice/")
public class EmpController {
@GetMapping("list")
public String list(Model model) {
model.addAttribute("test", "Hello, List Test!");
return "/WEB-INF/view/customer/notice/list.jsp";
}
}
다만, 이렇게 하면 return하는 view단의 파일명이 너무 길어진다. application.properties에서 View Resolver를 설정해준다.
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
Spring에서 Bean 객체(spring-webmvc-5.x.x.jar > org.springframework.web.servlet.DispatcherServlet.class)를 만들었던 것을, Spring Boot에서는 간단한 설정으로 대신할 수 있다.
JSP 대신 Thymeleaf 써보기
⚽ 공식 문서
www.thymeleaf.org/documentation.html
⚽ 설정 방법
Maven dependencies에 다음을 추가해준다.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
그리고 application.properties에서 아무것도 설정하지 않은 경우, 예를 들어 @GetMapping 메서드가 "board/berry"이라는 문자열을 반환하면 src/main/resources/templates/board/berry.html이 반환된다. 즉 resources/templates가 기본 디렉터리인 것이다. 그리고 동시에, resources/static 디렉터리의 정적 파일은 후순위로라도 탐색하지 않는다.
package com.ddoongi.springweb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/board")
@Controller
public class HomeController {
@GetMapping("/berry")
public String fightingay(Model model) {
model.addAttribute("rank", 'C');
model.addAttribute("height", 169);
return "board/berry";
}
}
DevTools를 설정하여 automatic restart와 live reload 경험하기
⚽ 공식 문서
docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/html/using-boot-devtools.html
⚽ 기능
Property Defaults
Automatic Restart
Live Reload
Global Settings
Remote Applications
⚽ 설정 방법
▪ Maven dependencies에 org.springframework.boot의 spring-boot-devtools를 추가한다.
▪ DevTools는 classpath가 갱신될 때 자동으로 서버를 재시작한다. Eclipse에서는 소스 코드의 저장(Ctrl+S)이 갱신을 유발하며, IntelliJ에서는 프로젝트 빌드(Ctrl+F9)가 갱신을 유발한다.
'콤퓨타 왕기초 > Spring Boot' 카테고리의 다른 글
[Persistence Framework] Model(DAO, DTO, Service) (0) | 2021.05.07 |
---|---|
[Persistence Framework] JPA vs MyBatis (0) | 2021.05.07 |
Thymeleaf (0) | 2021.05.05 |
Controller의 객체명 설정 (0) | 2021.05.04 |
Why Spring Boot? (0) | 2021.05.04 |