[SpringBoot] - Thymeleaf(TemplateInputException)

ACAI BERRY DEVELOVER·2023년 6월 19일
0
post-thumbnail

  • 타임리프의 기본사용법을 공부하던 중이었다.

  • dto클래스와 데이터를 전송할 컨트롤러를 만들고 dto객체를 Model에 추가해서 전달한다.

  • 반복문과 제어문 처리를 공부하던 중 주석처리를 하다가 "Whitelabel Error Page
    This application has no explicit mapping for /error, so you are seeing this as a fallback." 에러가 떠서 무엇이 문제인지 확인해보았다.

  • 와중에 Exception evaluating SpringEL expression: "state.index" (template: "sample/ex2" - line 15, col 7)와 EL1007E: Property or field 'index' cannot be found on null를 확인해서 표현법이 잘못되었는지 확인해보았는데 표현법은 이상이 없는 거 같았다.

콘솔창에 뜬 문제

2023-06-19T17:07:30.480+09:00 ERROR 7487 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "sample/ex2": An error happened during template parsing (template: "class path resource [templates/sample/ex2.html]")

  • 타임리프는 경로처리에 예민하다해서 확인해봤는데 더블 슬러시가 뜨는 것도 아니고 경로문제는 아닌 거 같았다.
<ul>
   <!--    <li th:each="dto : ${list}">
            [[${dto}]]
        </li></ul>-->

<!--<li th:each="dto, state: ${list}">
    [[${state.index}]] -- [[${dto}]]
</li>-->



        <!-- 제어문 처리 -->
       <ul> <li th:each="dto, state : ${list}" th:if="${dto.sno % 5 == 0}">
            [[${dto}]]
        </li>
       </ul>

        <!-- th:if, th:unlesss, sno가 5로 나눈 나머지가 0인 경우에는 sno만을 출력하고,
        그렇지 않으면 SampleDTO의 first를 출력하라 -->
        <li th:each="dto, state: ${list}">
            <span th:if="${dto.sno % 5 ==0}" th:text="${'-----------' +dto.sno}"></span>
            <span th:unless="${dto.sno % 5 ==0}" th:text="${dto.first}"></span>
                    </li>
      <ul>
        <li th:each="dto : ${list}" th:text="${dto.sno % 5 ==0}?${dto.sno}"></li>
        </ul>

이상하게 주석처리가 2개가 넘어가면 브라우저에 인터벌 서버 에러가 뜬다.

►►► 그래서 주석을 한개만 남겨두었더니 정상 작동한다.

내가 구글링을 어떻게 했는 진 모르겠는데 주석에 관한 문제라는 걸 결국 발견했다. (초보) --> 타임리프파싱관련 서치하다가 찾은 거 같다.
다음은 타임리프의 주석처리에 관한 내용이다.

표준 HTML 주석

<!--    <li th:each="dto : ${list}">
            [[${dto}]]
        </li></ul>-->

자바스크립트의 표준 HTML은 타임리프가 렌더링하지 않고 그대로 남겨둔다.(웹 소스코드에서도 확인이 가능하다.화면에서도 볼 수 없다(주석처리))
HTML에서만 사용하는 주석이다.

타임리프 파서 주석 (주로 사용)

<!--/* [[${data}]] */--> //한줄

<!--/*-->
<span th:text="${data}">html data</span>   //여러줄
<!--*/-->

타임리프 파서 주석은 타임리프 진짜 주석이다. 렌더링에서 주석 부분을 제거한다.(즉 출력이 안된다.) 타임리프 파서 자체가 인정하는 주석. 소스코드에서 확인불가능

타임리프 프로토타입 주석 (특이하고 거의안씀)

<!--/*/
<span th:text="${data}">html data</span>
/*/-->

HTML 파일을 열면 주석처리가 되나, 타임리프를 렌더링 한 경우에만 보인다. html주석이기때문에 웹브라우저가 렌더링하지 않는다. 파일을 직접 열면 안보인다.(데이터가 없다, 주석처리가 그대로 보인다.) , 타임리프가 서버사이드에서 렌더링하는 경우에는 데이터가 보인다, 출력이 된다.

  • 나의 경우에는 표준HTML주석을 하나만 달거나, 아니면 타임리프 파서 주석으로 변경할 시 다시 웹이 정상적으로 돌아갔다.
  • 근데 왜 HTML 주석을 2개 이상 이용할 시 에러가 나는 거지?? 이걸 아직도 이해 못하겠다.

Reference : https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2&unitId=83264

결론 :

  • 타임리프 렌더링시 주석처리에 예민한 거 같다 (나만 그럼?..아마 내가 처음이라..그런걸수도)
  • 타임리프 주석 종류에 대해 알아보았다. 간단하지만 필요한 지식이었던 거 같다.
  • 주석처리는 타임리프 파서 주석을 사용하자

  • 다른 내용들을 다 타임리프파서 주석처리하고 타임리프를 렌더링했더니 확실히 주석부분은 렌더링 처리 되어 보이지 않는다.

페이지 소스 코드

profile
쓸때 대충 쓰지 말고! 공부하면서 써!

0개의 댓글