프레임워크(Framework)/Spring

[Spring] 4-2. 스프링 동적 페이지 만들기 with Gradle (Thymeleaf 동작 구조)

잇트루 2022. 8. 29. 22:00
반응형

본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술'내용을 바탕으로 공부하여 정리한 것임을 알려드립니다.

 

 

Thymeleaf

타임리프(Thymeleaf)는 자바 라이브러리에서 제공하는 뷰 템플릿 엔진(View Template Engine)이다. 뷰 템플릿 엔진을 사용하면 동적 페이지를 개발할 수 있다. 타임리프는 스프링 MVC와 통합되어 모듈을 제공하며, JSP의 모든 기능을 대체할 수 있다. 또한, 순수 HTML의 구조를 유지하여 서버를 열지 않은 상태에서도 브라우저에서 변경 사항을 확인할 수 있는 장점이 있다.

 

동적 웹 페이지 개발

동적 페이지를 개발하기 위해 https://start.spring.io/에서 Gradle 프로젝트를 생성한다. Thymeleaf를 사용하여 웹 페이지를 개발하기 위해, Dependencies에 Spring Web과 Thymeleaf 라이브러리를 추가한다.

 

프로젝트 생성 후 build.gradle 파일에서 dependencies에 라이브러리가 존재하는지 확인한다.

// builde.gradle
plugins {
	id 'org.springframework.boot' version '2.7.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'hello-spring'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

만약, 프로젝트 생성 시 Dependencies를 추가하지 않았다면, 생성된 프로젝트의 build.gradle에서 dependencies를 추가하여 사용이 가능하다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

Controller 작성

이후 웹 페이지의 동작을 위한 웹 어플리케이션에서 첫 번째 진입점인 Controller를 작성한다.

src/main/그룹명/프로젝트명 아래에 Conteroller 패키지를 만든 뒤, HelloController.java 클래스를 생성하여 코드를 작성한다.

// HelloController.java
package hellospring.springstudy.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello";
    }
}

스프링은 어노테이션(@)을 사용하여야 한다. 어노테이션은 코드의 문법 에러를 체크하거나, 코드의 자동 생성 정보를 제공하며, 실행 시 특정 기능을 실행하도록 정보를 제공하는 역할을 한다.

 

@Controller 어노테이션

@Controller는 @Component를 구체화한 어노테이션으로, 해당 클래스를 IoC 컨테이너에 Bean으로 등록한다. 즉, 실행 시 해당 클래스가 Controller로 사용되었음을 스프링에 알려주는 역할을 한다.

 

@GetMapping 어노테이션

@Controller와 함께 사용하는 어노테이션으로 HTTP 요청 메서드 어노테이션인 @RequstMapping의  GET 방식으로 구체화된 어노테이션이다. GET, POST, PUT, DELETE, PATCH 등의 HTTP 메서드 중 GET 방식을 요청한다.

위 코드의 경우, 웹 어플리케이션에서 ~/hello에 들어가면 해당 메서드 hello(Model model)를 호출한다.

 

View 작성

src/resources/template 패키지 아래에 hello.html 파일을 생성하여 타임리프를 통해 보여줄 View를 작성한다.

<!-- hello.html -->
<!DOCTYPE HTML>

<!-- 타임리프 템플릿 엔진 선언 -->
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<title>Hello</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

<!-- th:text와 ${data} -->
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>

<html> 태그 안에 타임리프 템플릿 엔진을 선언하여 html 파일에 타임리프를 사용할 수 있다.

선언 후, 여러 태그 안에 타임리프 문법을 적용하여 순수 html 파일을 유지하면서 템플릿 엔진을 적용할 수 있다.

<p> 태그에 속성에 th:text 타임리프 문법과 내용에 ${data} 사용하여 컨트롤러에 요청할 수 있다.

${data}는 hello 메서드의 attributeName인 data를 뜻하며, hello 메서드의 attributeValue 값("hello!!")으로 치환된다.

 

실행 후 확인하기

프로젝트를 실행하여 웹 브라우저에서 http://localhost:8080/hello에 접속하면 다음과 같이 실행되는 것을 알 수 있다.

 

thymeleaf 템플릿 엔진의 동작 구조

1. http://localhost:8080/hello에 접속 시 톰캣 서버에서 요청을 받아 스프링 부트에 데이터를 넘긴다.

2. 스프링 부트는 @Controller 어노테이션을 통해 스프링 컨테이너 안에 있는 HelloController를 찾는다.

3. 웹 브라우저 URL(hello)의 매칭 되는 대상(GetMapping)을 호출한다. 즉 hello 메서드 실행.

4. 메서드를 실행하면서 model에 data:hello!! 데이터를 저장하고 hello.html의 이름인 hello를 반환한다. 즉, hello.html을 실행시키는 것이다.

5. 컨트롤러에서 문자열 'hello'를 반환할 때, hello.html을 찾는 과정을 viewResolver가 찾아준다.

6. viewResolver는 resources/templates를 기본적으로 먼저 찾으며, {ViewName} + .html 파일을 찾게 된다. 여기서 ViewName이 컨트롤러에서 반환한 hello가 된다.

반응형