BackEnd/Thymeleaf

[Thymeleaf] 자바스크립트 인라인

샤아이인 2022. 1. 28.

인프런 김영한님의 Spring강의에서 공부한것을 올리며, Thymeleaf의 경우 unit 단위로 공부후 각각 정리하는 글을 작성하겠습니다.

 

자바스크립트 인라인

타임리프는 자바스크립트에서 타임리프를 편리하게 사용할 수 있는 자바스크립트 인라인 기능을 제공한다.

자바스크립트 인라인 기능은 다음과 같이 적용하면 된다.

<script th:inline="javascript">
 

우선 컨트롤러와 뷰를 확인해 봅시다!

@GetMapping("/javascript")
public String javascript(Model model){
    List<User> list = new ArrayList<>();
    list.add(new User("UserA", 10));
    list.add(new User("UserB", 20));
    list.add(new User("UserC", 30));

    model.addAttribute("users", list);
    model.addAttribute("user", new User("UserA", 10));

    return "basic/javascript";
}
 
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- 자바스크립트 인라인 사용 전 -->
<script>

    var username = [[${user.username}]];
    var age = [[${user.age}]];

    //자바스크립트 내추럴 템플릿
    var username2 = /*[[${user.username}]]*/ "test username";

    //객체
    var user = [[${user}]];
</script>

<!-- 자바스크립트 인라인 사용 후 -->
<script th:inline="javascript">
    var username = [[${user.username}]];
    var age = [[${user.age}]];

    //자바스크립트 내추럴 템플릿
    var username2 = /*[[${user.username}]]*/ "test username";

    //객체
    var user = [[${user}]];
</script>

<!-- 자바스크립트 인라인 each -->
<script th:inline="javascript">

    [# th:each="user, stat : ${users}"]
    var user[[${stat.count}]] = [[${user}]];
    [/]

</script>

</body>
</html>
 

결과는 다음과 같습니다.

 

● 텍스트 렌더링

결과 창에서 F12 를 눌러 개발자도구를 열어보면 다음과 같은 경고를 확인할 수 있습니다.

UserA가 정의되지 않았다는 경고를 보여주고 있습니다.

이는 var username = UserA; 부분에서 오류가 있기 때문입니다. 문법이 오류이기 때문이죠!

var username = [[${user.username}]]; // 틀린 문법
var username = "[[${user.username}]]";
 

문자이기 때문에 두번째 줄 처럼 ""로 묶어줘야 정상적으로 작동하게 됩니다.

 

이번에는 인라인을 적용한 후의 코드를 통해 비교해 봅시다.

- 인라인 사용 전 var username = userA;

- 인라인 사용 후 var username = "userA";

 

인라인이 적용된 후의 코드는 기존 코드와 같이 다음처럼 사용했다.

<script th:inline="javascript">
    var username = [[${user.username}]];
</script>
 

기존과 똑같이 사용했지만, 인라인 사용후 렌더링 결과를 보면 문자 타입인 경우 "를 포함해준다.

추가로자바스크립트에서문제가될 수 있는 문자가 포함되어 있으면 이스케이프 처리도 해준다. 예) " \"

 

● 네추럴 템플릿

타임리프는 HTML 파일을 직접 열어도 동작하는 내추럴 템플릿 기능을 제공합니다.

자바스크립트 인라인 기능을 사용하면 주석을 활용해서 이 기능을 사용할 수 있다.

var username2 = /*[[${user.username}]]*/ "test username";
 

인라인 사용 전 var username2 = /*userA*/ "test username";

인라인 사용 후 var username2 = "userA";

 

인라인 사용 전 결과를 보면 정말 순수하게 그대로 해석을 해버렸다.

따라서 내추럴 템플릿 기능이 동작하지 않고, 심지어 렌더링 내용이 주석처리 되어 버린다.

하지만 인라인 적용 결과 기대한 "UserA"가 정상적으로 적용된다.

 

● 객체

인라인을 사용하지 않으면 객체의 toString() 메서드가 호출되어 문자가 출력된다.

하지만 인라인 기능을 사용하면 자동으로 JSON으로 변환해 준다.

 

var user = [[${user}]];

- 인라인 사용 전 var user = BasicController.User(username=userA, age=10);

- 인라인 사용 후 var user = {"username":"userA","age":10};

'BackEnd > Thymeleaf' 카테고리의 다른 글

[Thymeleaf] 레이아웃  (0) 2022.01.30
[Thymeleaf] 템플릿 조각  (0) 2022.01.29
[Thymeleaf] 블록  (0) 2022.01.28
[Thymeleaf] 주석  (0) 2022.01.28
[Thymeleaf] 조건부 평가  (0) 2022.01.27

댓글