오봉이와 함께하는 개발 블로그

스프링 MVC 2 - 타임리프 자바스크립트 인라인 본문

BE/Thymeleaf

스프링 MVC 2 - 타임리프 자바스크립트 인라인

오봉봉이 2022. 8. 17. 01:15
728x90

자바스크립트 인라인

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

코드

@GetMapping("/javascript")
public String javascript(Model model) {
    model.addAttribute("user", new User("userA", 10));
    addUsers(model);
    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>

</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";

인라인 사용 전 렌더링 결과를 보면 userA라는 변수가 그대로 있다.
타임리프 입장에서는 정확하게 렌더링 했지만 개발자는 "userA"라는 값을 변수 var username에 저장하고 싶었을 것.
결과적으로 보면 인라인을 사용하기 전에 userA라는 변수var username이라는 변수에 그대로 담긴 것이다.

숫자 age의 경우는 "가 필요 없기 때문에 정상 렌더링 된다.

인라인 사용 후 결과에서는 문자 타입인 경우 "를 포함해주고, 추가로 자바스크립트에서 문제가 될 수 있는 문자가 포함되어 있다면 이스케이프 처리도 해준다. (" -> \")

자바스크립트 내추럴 템플릿

타임리프는 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(반복문)을 지원한다.

코드

<!-- 자바스크립트 인라인 each -->
<script th:inline="javascript">
    [# th:each="user, stat : ${users}"]
    var user[[${stat.count}]] = [[${user}]];
    [/]
</script>

결과

<script>
    var user1 = {"username":"userA","age":10};
    var user2 = {"username":"userB","age":20};
    var user3 = {"username":"userC","age":30};
</script>

[[${stat.count}]]는 1부터 시작하기 때문에 user1로 치환된다.

[[${user}]];는 객체이기 때문에 JSON으로 변환된다.

출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
728x90
Comments