Spring/트러블 슈팅

[Spring] - 타임리프 경로 에러

Jwhy 2024. 8. 21. 23:06

🛠️ 개발 환경 및 테스트 환경

  • OS : Window / Mac
  • kotlin : 1.7.10
  • Spring Boot : 2.7.0

💬 상황 설명

회사의 개발 환경은 윈도우이고, 재택 근무를 할 때의 개발환경은 맥 환경이다. 회사의 프로젝트를 맥에서 실행했을 때, 다음과 같은 에러를 마주쳤다.

[THYMELEAF][http-nio-8080-exec-1] Exception processing template "error": Error resolving template [error], template might not exist or might not be accessible by any of the configured Template Resolvers
Servlet.service() for servlet [dispatcherServlet] threw exception

회사의 다른 프로젝트들을 모두 정상적으로 실행이 되지만, 유난히 이 프로젝트를 회사가 아닌 집에서만 실행하면 템플릿 경로가 존재하지 않거나 접근할 수 없다는 에러가 발생한다.

✅ 해결 과정

1. 요구 분석

우선 에러 로그에서 확인할 수 있듯이, 타임리프로 인해 발생한 문제이다. 회사의 프론트 빌드는 타임리프를 사용하긴 하지만 index.html을 제외하고는 코틀린 멀티플랫폼인 KotlinJS라는 기술을 사용한다. 때문에 index.html만 불러오면, 나머지 뷰는 코틀린으로 작성한 뷰 코드가 Javascript로 변환되어 빌드가 되어, 해당 js를 통해 그려지게 된다.

 

여러 블로그를 찾아보니 대부분의 게시글은 컨트롤러에서 /index를 반환하는 것이 아닌 index와 같이 상대 경로로 반환하면 해결이 된다고 한다. 즉, 나는 index.html을 반환하는 Controller만 찾아서 상대 경로로 바꾸면 되는 것이다. 하지만, 이를 수정해도 결과는 변함이 없었다.

 

혹시나, 다른 곳에서도 index.html를 호출하는 코드가 있는지 프로젝트 전체 검색으로 찾아보았고, Configuration 코드에서 index.html 파일을 핸들링하는 코드를 발견할 수 있었다. 해당 부분도 동일하게 상대 경로로 작성해보았지만, 결과는 동일했다.

2. 문제 해결

핸들링하는 코드를 자세히 보니 location + "index.html"라고 되어있었고, location을 보니 다음과 같은 코드로 되어있었다.

val location = "file:///$path\\build\\front\\"

맥 환경이 더 익숙한 나는 '왜 백슬래시로 되어있지?'라는 의문이 들었고, 해당 코드를 다음과 같이 수정했다.

val location = Paths.get(path, "build", "front").toUri().toString()

수정한 이후, 다시 실행해보니 정상적으로 페이지에 진입하는 것을 볼 수 있었다.

3. 문제가 발생한 이유

MS-DOS 시절 명령어에서 옵션을 구분할 때 사용하지 않는 기호가 백슬래시(\)였다. 때문에 당시에 해당 기호를 구분자로 채택하였고, 현재까지 유지가 되어온 것이다. 하지만 Unix 계열의 운영체제인 Mac은 명령줄에서 슬래시(/)를 구분자로 채택하였고, 경로 시스템에서도 이를 사용하게 된다.

 

윈도우에서는 슬래시 구분자로 경로를 구분 지어도 인식을 하지만, 맥에서는 역슬래시를 경로 구분자로 인식하지 못해, index.html의 경로를 찾지 못한 것이었다.

🤔 회고

회사 내부 서비스를 개발하면서, 문제가 되는 파일의 코드를 수정한 경험이 있었기 때문에 에러 해결까지 오래 걸리지는 않았던 것 같다. 경험이 중요하다고는 많이 들었지만, 이런 사소한 에러 해결에서도 그 경험이 빛을 발할 수 있다는게 신기했다.