[Spring] 스프링 MVC 2편 1-15. 자바스크립트 인라인

강우엉·2023년 8월 15일

Spring

목록 보기
144/359

타임리프는 자바스크립트에서 타임리프를 편리하게 사용할 수 있는 자바스크립트 인라인 기능을 제공한다.
자바스크립트 인라인 기능은 다음과 같이 적용하면 된다.
<script th:inline="javascript">

BasicController 추가

  	@GetMapping("/javascript")
    public String javascript(Model model) {
        model.addAttribute("user", new User("UserA", 10));
        addUsers(model);
        return "basic/javascript";
    }

/resources/templates/basic/javascript.html

<!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}]];

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

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

</script>
</script>
</body>
</html>

자바스크립트 인라인 사용 전 - 결과

<script>
var username = userA;
var age = 10;

//자바스크립트 내추럴 템플릿
var username2 = /*userA*/ "test username";

//객체
var user = BasicController.User(username=userA, age=10);
</script>

자바스크립트 인라인 사용 후 - 결과

자바스크립트 인라인 사용 후
<script>
var username = "userA";
var age = 10;

//자바스크립트 내추럴 템플릿
var username2 = "userA";

//객체
var user = {"username":"userA","age":10};
</script>

자바스크립트 인라인을 사용하지 않은 경우 어떤 문제들이 있는지 알아보고, 인라인을 사용하면 해당 문제들이 어떻게 해결되는지 확인해보자.

텍스트 렌더링

  • var username = [[${user.username}]];
    • 인라인 사용 전 var username = userA;
    • 인라인 사용 후 var username = "userA";

자바스크립트 내추럴 템플릿
타임리프는 HTML 파일을 직접 열어도 동작하는 내추럴 템플릿 기능을 제공한다. 자바스크립트 인라인기능을 사용하면 주석을 활용해서 이 기능을 사용할 수 있다.

  • var username2 = /[[${user.username}]]/ "test username";
    • 인라인 사용 전 var username2 = /userA/ "test username";
    • 인라인 사용 후 var username2 = "userA";
  • 인라인 사용 전 결과를 보면 정말 순수하게 그대로 해석을 해버렸다. 따라서 내추럴 템플릿 기능이 동작하지 않고, 심지어 렌더링 내용이 주석처리 되어 버린다.
  • 인라인 사용 후 결과를 보면 주석 부분이 제거되고, 기대한 "userA"가 정확하게 적용된다.

객체
타임리프의 자바스크립트 인라인 기능을 사용하면 객체를 JSON으로 자동으로 변환해준다.

  • var user = [[${user}]];
    • 인라인 사용 전 var user = BasicController.User(username=userA, age=10);
    • 인라인 사용 후 var user = {"username":"userA","age":10};
  • 인라인 사용 전은 객체의 toString()이 호출된 값이다.
  • 인라인 사용 후는 객체를 JSON으로 변환해준다.

자바스크립트 인라인 each
자바스크립트 인라인은 each를 지원하는데, 다음과 같이 사용한다.
/resources/templates/basic/javascript.html

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

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

</script>

자바스크립트 인라인 each 결과

<script>
var user1 = {"username":"userA","age":10};
var user2 = {"username":"userB","age":20};
var user3 = {"username":"userC","age":30};
</script>
profile
우엉이의 코딩 성장일기💻

0개의 댓글