오봉이와 함께하는 개발 블로그
스프링 MVC 2 - 타임리프 자바스크립트 인라인 본문
자바스크립트 인라인
타임리프는 자바스크립트에서 타임리프를 편리하게 사용할 수 있는 자바스크립트 인라인 기능을 제공한다.
자바스크립트 인라인 기능은 다음과 같이 적용하면 된다.<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편 - 백엔드 웹 개발 활용 기술
'BE > Thymeleaf' 카테고리의 다른 글
스프링 MVC 2 - 템플릿 레이아웃 (0) | 2022.08.17 |
---|---|
스프링 MVC 2 - 타임리프 템플릿 조각 (0) | 2022.08.17 |
스프링 MVC 2 - 타임리프 블록 (0) | 2022.08.17 |
스프링 MVC 2 - 타임리프 주석 (0) | 2022.08.17 |
스프링 MVC 2 - 타임리프 조건부 평가 (0) | 2022.08.17 |