Java/Thymeleaf

자바스크립트 인라인

코딩공부 2021. 12. 10. 02:27

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

 

<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>

 

자바스크립트 인라인을 사용하지 않았을 경우의 문제점 

 

1) 텍스트 렌더링

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

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

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

 

[인라인 사용 전]

 타임리프 입장에서는 정확하게 렌더링 한 것이지만 아마 개발자가 기대한 것은 다음과 같은 "userA"라는 문자 ! 

 userA가 그대로 변수명으로 사용되어서 자바스크립트 오류가 발생 !

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

 

[인라인 사용 후]

문자 타입인 경우 " 를 포함해준다.

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

 ex) " -> \"

 

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

  - HTML 파일을 직접 열어도 동작하는 내추럴 템플릿 기능을 제공

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

 

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

 

    [인라인 사용 전]

    var username2 = /*userA*/ "test username";

 

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

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

 

    [인라인 사용 후]

    var username2 = "userA"

 

    인라인 사용 후 결과를 보면 주석 부분이 제거되고, 기대한 "userA"가 정확하게 적용

 

3) 객체

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

 

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

 

    [인라인 사용 전]

    var user = BasicController.User(username=userA, age=10);

    객체의 toString()이 호출된 값이다. 

 

    [인라인 사용 후]

    var user = {"username":"userA","age":10};

    객체를 JSON으로 변환해준다.

 

 

자바스크립트 인라인 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>

 

수강 강의 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

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

템플릿 레이아웃[1]  (0) 2021.12.10
템플릿 조각[0]  (0) 2021.12.10
블록  (0) 2021.12.10
주석  (0) 2021.12.03
조건부 평가  (0) 2021.12.03