파게로그

DevTools, Thymeleaf, View Resolver 본문

콤퓨타 왕기초/Spring Boot

DevTools, Thymeleaf, View Resolver

파게 2021. 5. 4. 11:56

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
Comments