교재를 보면서 실습을 따라하는데, 실습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">도서주문 »</a>
<a href="@{/BookMarket/books}" class="btn btn-secondary">« 도서 목록</a>
'DEVELOPMENT > Spring' 카테고리의 다른 글
| #2 트러블 슈팅 [스프링부트 완전정복] 6장 실습2 (0) | 2025.11.03 |
|---|---|
| [스프링부트 완전정복] 5. 요청 처리 메서드의 파아미터 유형 (0) | 2025.11.03 |
| [스프링부트 완전정복] 4. 컨트롤러 구현 (1) | 2025.10.08 |
| [스프링부트 완전정복] 3. 스프링 부트의 구조 (2) | 2025.10.01 |
| [스프링부트 완전정복] 2. 스프링 부트 개발 환경 설정 및 예제 맛보기 (0) | 2025.10.01 |