[Spring] - 타임리프 경로 에러
🛠️ 개발 환경 및 테스트 환경
- 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
의 경로를 찾지 못한 것이었다.
🤔 회고
회사 내부 서비스를 개발하면서, 문제가 되는 파일의 코드를 수정한 경험이 있었기 때문에 에러 해결까지 오래 걸리지는 않았던 것 같다. 경험이 중요하다고는 많이 들었지만, 이런 사소한 에러 해결에서도 그 경험이 빛을 발할 수 있다는게 신기했다.