Thymeleaf-inline 속성에 대해 알아보기



먼저 프로젝트를 생성해 보자.


의존성으로는

  • Thymeleaf
  • Spring Boot DevTools
  • Lombok
  • Spring Web

을 설정한다.


프로젝트가 완성되었으면 applicaton.properties를 열고 다음 내용을 추가해 준다.


위 설정은 Thymeleaf를 이용하는 프로젝트가 변경 후에 만들어진 결과를 보관(캐싱)하지 않도록 설정하는 것이다.

이제 아래 사진과 같이 패키지와 자바 파일을 생성한다. 그리고 코드를 적는다.

exInline() 메소드는 내부적으로 RedirectAttributes를 이용하여 ‘/ex3’으로 result와 dto라는 이름의 데이터를 심어서 전달한다. result는 단순한 문자열이지만, dto는 SampleDTO의 객체이다.


SampleDTO

package org.techlead.thymeleafexample.dto;

import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@Builder(toBuilder=true)
public class SampleDTO {
    private Long sno;
    private String first;
    private String last;
    private LocalDateTime regTime;
}

SampleController

package org.zerock.ex3.controller;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.ex3.dto.SampleDTO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Controller
@RequestMapping("/sample")
@Log4j2
public class SampleController{
    @GetMapping({"/exInline"})
    public String exInline(RedirectAttributes redirectAttributes){
        log.info("exInline..............");

        SampleDTO dto=SampleDTO.builder()
                .sno(100L)
                .first("First..100")
                .last("Last..100")
                .regTime(LocalDateTime.now())
                .build();
        redirectAttributes.addFlashAttribute("result","success");
        redirectAttributes.addFlashAttribute("dto",dto);

        return "redirect:/sample/ex3";
    }

    @GetMapping("/ex3")
    public void ex3(){
        log.info("ex3");
    }

}

실제 화면은 ex3.html로 확인할 수 있으므로 templates 폴더에 추가한다.


ex3.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
  </head>
  <body>
    <h1 th:text="${result}"></h1>
    <h1 th:text="${dto}"></h1>
    <script th:inline="javascript">

      var msg=[[${result}]]
      var dto=[[${dto}]]
    </script>
  </body>
</html>


ex3.html에서 가장 중요한 부분은 <script> 태그에 사용된 th:inline 속성이다. 속성값이 javascript로 지정되었는데 이로 인해 많은 변화가 생겨난다. 브라우저에서 경로는 ‘/sample/exline’으로 호출된다.

이제 앱을 실행하고 브라우저를 킨다음 F12를 눌러 해당 url로 들어가본다.

아래 사진과 같이 별도의 처리가 없음에도 불구하고 문자열은 자동으로 ““이 추가되어 문자열이 되는 것을 볼 수 있고 같이 전송된 dto는 JSON 포맷의 문자열이 된 것을 볼 수 있다.

만일 위의 코드를 javaScript 객체로 변환해서 사용하고자 한다면 간단히 JSON.parse(‘"‘+dto+’'”); 와 같은 형태로 ““을 추가해서 사용할 수 있다.


그리고 추가적으로 script 태그에 th:inline=”javascript” 속성을 정의하면 그 안에 포함된 스크립트에서는 [[..]] 표현식으로 서버 데이터를 스크립트 영역에 표현할 수 있다.


YoungKyonYou

Integration of Knowledge