DEVELOPMENT/Spring

#1 트러블 슈팅 [스프링부트 완전정복] 5장 실습1

Tiny Commit 2025. 11. 2. 23:33

교재를 보면서 실습을 따라하는데, 실습1에서 오류가 발생했다 ㅜㅜㅜ

 

 

500 Internal Server Error의 원인 및 해결

1. Thymeleaf 표현식 오류

문제는 book.html 파일의 40번째 줄에 있던 th:href="#" 부분 때문이었습니다.

1. th:href의 엄격한 문법

  • th:href 역할: th:href는 Thymeleaf에게 이 속성의 값을 URL 표현식으로 해석하라고 명령하는 속성입니다. Thymeleaf의 URL 표현식은 @{}, ${}, ~{} 등의 구조를 사용합니다.
  • 오류 발생: Thymeleaf는 40번째 줄의 th:href="#"를 보고 #을 "URL의 앵커(Anchor)" 가 아닌 "Thymeleaf의 표현식" 으로 인식합니다.
  • Thymeleaf에서의 #: Thymeleaf에서 #은 주로 메시지 표현식 #{...} 또는 유틸리티 객체 #dates.format(...) 등에 사용됩니다.
  • 파싱 실패: #만 단독으로 있을 경우, Thymeleaf는 유효한 표현식 문법이 아니라고 판단하고 Could not parse as expression: "#" 라는 예외를 발생시킵니다.

2. 서버 내부 오류 (Status 500) 유발

일반적인 HTML 오류는 브라우저가 무시하지만, Thymeleaf는 서버 측(Server-Side)에서 실행되는 템플릿 엔진입니다.

  • Thymeleaf 예외: Thymeleaf가 템플릿을 읽어 HTML로 변환(렌더링)하는 도중, Could not parse as expression이라는 치명적인 예외를 던졌습니다.
  • Spring MVC 처리: Spring MVC는 템플릿 렌더링 중에 발생한 이 예외를 처리하지 못하고, 사용자에게 500 Internal Server Error (서버 내부 오류)로 반환한 것입니다.

3. 해결된 이유

th:href="#"를 href="#" (Thymeleaf 속성 제거) 또는 th:href="@{#}" (올바른 Thymeleaf URL 앵커 표현)로 수정하면서, Thymeleaf는 더 이상 그 부분을 표현식으로 해석하려 시도하지 않았습니다. 템플릿 렌더링이 성공적으로 완료되면서 오류가 해결된 것입니다.

결론적으로, 이 500 에러는 자바 코드가 아닌, 서버에서 실행되는 템플릿 엔진의 문법 오류 때문에 발생한 것이었습니다.

<p><a href="#" class = "btn btn-primary">도서주문 &raquo;</a>
<a href="@{/BookMarket/books}" class="btn btn-secondary">&laquo; 도서 목록</a>