Backend/Spring+Boot

Thymeleaf 에서 html 자원을 찾지 못할 때

findmypiece 2021. 8. 11. 01:02
728x90
06-16 15:44:07.790 [XNIO-11 task-127] ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][XNIO-11 task-127] Exception processing template "comment/remove": An error happened during template parsing (template: "class path resource [templatescomment/remove.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templatescomment/remove.html]")

Caused by: org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templatescomment/remove.html]")

SpringBoot+Thymeleaf 환경에서 위와 같은 에러로 화면이 랜딩되지 않는 경우가 있다. 에러를 번역기 돌려보면 알겠지만 랜딩하려는 html 자원을 찾지 못해서 그런건데 이런문제가 발생하는데에는 정말 많은 이유가 있다.

 

서칭하면 가장 많이 나오는 것이 html 페이지 내에 Thymeleaf 문법을 잘못 사용하거나 Controller 에서 리턴하는 model 을 오타로 잘못 참조하고 있는 경우이다. 그런데 이런 경우라면 극단적으로 html 페이지의 내용을 다 지우고 AAA 라는 문자열만 입력해 놓으면 정상적으로 랜딩이 되어야 한다.

 

하지만 나의 경우는 그래도 해결이 안됐다. 정확히 말하면 부트스트랩 클래스를 직접 실행하는 로컬환경에서는 전혀 문제가 되지 않았지만 jar 패키징 해서 띄울 때만 에러가 발생했다. 반나절을 만에 원인을 찾을 수 있었는데 Controller 에서 ModelAndView로 리턴하는 html 자원의 경로의 대소문자가 문제였다. 

 

예를 들어 아래와 같이 Controller 를 정의했다고 해보자.

@GetMapping("testList")
public ModelAndView testList(){
	return new ModelAndView("myTest/testList");
}

 

그리고 Resolver 는 아래와 같이 정의했다고 해보자.

@Bean
public SpringResourceTemplateResolver templateResolver() {
	SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
	templateResolver.setPrefix("classpath:/WEB-INF/views/");
	templateResolver.setSuffix(".html");
	templateResolver.setTemplateMode(TemplateMode.HTML);
	templateResolver.setCharacterEncoding("UTF-8");
	return templateResolver;
}

그렇다면 /WEB-INF/views/myTest/testList.html 자원이 랜딩될 것이다. 그런데 myTest 디렉토리명을 mytest로 바꾸면 어떻게 될까? 즉, 자원의 경로가 /WEB-INF/views/mytest/testList.html 로 바뀌는 것이다.

 

부트스트랩 클래스를 직접 실행하는 이 경우에도 위에서 정의한 Controller 를 그대로 사용할 수 있다. Controller 에서 html 자원을 찾아갈 경로의 대소문자 구분이 없다는 말이다. 그런데 jar 패키징을 해서 실행하면 html 자원을 찾지 못한다. 이 문제로 로컬에서 테스트할 땐 정상이었지만 실제 서버에 배포하면 문제가 발생할 수 있는 것이다.

 

실제로 나도 로컬에서 개발을 모두 마치고 개발서버에 배포를 한 뒤에야 이 에러를 확인할 수 있었다. 굉장히 난감한 상황이 되어버린다. 서버까지 배포가 나가버렸으니 봐야할 범위도 굉장히 넓어진다. CI/CD 환경을 점검하고 다른 팀원들의 comiit 내역도 일일히 분석했다.

 

당연히 아무런 문제를 찾지 못했고 로컬환경에서 서버 CI/CD와 동일한 환경으로 패키징해서 테스트도 해보고 마지막으로 디렉토리를 하나씩 제거하면서 테스트해보다 원인을 찾게되었다.

 

사실 path 에 카멜표기법을 쓰는 것은 rest 통신에서는 권장되는 방법이 아니지만 Thymeleaf 같은 서버사이드 언어로 클라이언트도 구현할 때는 정확히 path만으로 자원을 구분하기가 참 애매하다. form에서 GET, POST 만 지원하기 때문에 행위 역시 path로 구분해야 할 경우가 많기 때문이다. rest 원칙은 api에서만 사용하는 걸로...

 

 

728x90