프로젝트 서버 배포 이후 이상하게 '임시저장 포스트 이어쓰기 페이지'에 접속이 되지 않는 문제가 발생했다. 골때리는 건, 로컬에서 개발할 때는 문제가 없다가 배포만 하면 오류가 난다는 것이다.
원인을 찾기 위해 며칠 동안 별의별 삽질을 해봤지만 쉽지 않았다. 결국 프로젝트를 같이 했던 과거 팀원이자 현직 백엔드 개발자로 활동하고 있는 친구의 도움을 받아 힌트를 얻었고, 성공적으로 문제를 해결한 과정에 대해 기록해 보겠다.
로컬에서 개발할 때는 이상 없이 '임시저장 포스트 이어쓰기 페이지'에 접속이 됐는데, 배포만 하면 500 에러와 동시에 해당 페이지 접속이 되지 않았다. Controller 파일과 html 파일의 코드를 자세하게 살펴봤으나, 오류문을 볼 수가 없어 언제 어디서부터 오류가 발생한 건지 쉽게 감을 잡을 수 없었다.
결국 친구에게 SOS를 요청했고, 배포 서버에 있는 nohup.out 파일을 통해 로그를 볼 수 있다는 사실을 알게 됐다. 오류가 발생했던 부분의 로그만 살펴보기 위해, 일부러 이어쓰기 페이지에 접속해 오류를 발생시키고 tail -n 300 nohup.out
명령어를 입력했다. 그 결과 다음과 같은 오류문을 발견할 수 있었다.
2023-11-12 11:07:05.447 ERROR 3660620 --- [nio-8080-exec-3] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-3] Exception processing template "/mypage/continue_write": Error resolving template [/mypage/continue_write], template might not exist or might not be accessible by any of the configured Template Resolvers
2023-11-12 11:07:05.448 ERROR 3660620 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [/mypage/continue_write], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause
thymeleaf를 사용하면서 페이지 매핑 경로가 잘못됐다는 내용인 거 같은데, 코드를 아무리 살펴봐도 문제될 것은 없었다. 그렇게 한참을 고민하다가 오류 내용을 검색해봤다.
경로 맨 앞에 '/' 를 제거하란다. 그게 끝이었다. 실제 코드를 살펴보면
@GetMapping("continueWrite/{id}")
public ModelAndView continueWrite(@PathVariable Long id) {
ModelAndView modelAndview = new ModelAndView();
TemporaryPostDto.TemporaryPostModifyDto tempPost = temporaryPostService.modifyById(id);
modelAndview.addObject("tempPost", tempPost);
modelAndview.setViewName("/mypage/continue_write");
return modelAndview;
}
경로 앞에 '/'가 있었다. 또한, 정상 동작하는 다른 Controller 코드를 살펴보니
@GetMapping("write_post")
public ModelAndView writePost(ModelAndView modelAndView) {
SessionUser user = (SessionUser) httpSession.getAttribute("user");
if (user != null) {
modelAndView.addObject("user", user);
}
modelAndView.setViewName("post/write_post");
return modelAndView;
}
이런식으로 '/'가 없었던 것이었다. 정확한 원인을 찾은 것 같은 확신이 들었다. 그렇게 코드를 수정("/mypage/continue_write"
→ "mypage/continue_write"
)해서 재배포를 한 결과 거짓말처럼 더 이상 오류가 발생하지 않았다.
지금 생각해보니 '왜 배포 서버에서 오류문(로그)를 볼 수 있는 방법이 없는지 알아볼 생각을 하지 못했을까' 하는 아쉬운 생각이 들었다. 이번 경험을 통해 앞으로는 좀 더 빠르고 현명하게 문제를 해결할 수 있었으면 좋겠다.