org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing 오류
84
작성한 질문수 1
스프링부트에서 Thymeleaf를 이용해 회원가입 폼을 만들고 있는데 폼에 입력을 제대로 하면 의도한대로 회원가입이 잘 됩니다.
하지만 폼에 아무것도 입력하지 않으면 유효성 검사에서 @NotBlank를 만나서 그에 맞는 에러 메시지를 출력해야 하는데 저렇게 오류가 뜨네요...
대체 이유가 뭘까요 ㅠㅠ

제 회원가입 코드는 다음과 같습니다.
User.java (Entity)
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name="users") //테이블 이름
public class User {
@Id //기본키 = userid
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long userid;
@Column(unique = true) //아이디 중복 방지
private String username;
private String password;
@Column(unique = true) //이메일 중복 방지
private String email;
}
RegisterDTO.java (DTO)
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RegisterDTO {
@NotBlank(message = "아이디를 입력하세요.")
private String username;
@NotBlank(message = "비밀번호를 입력하세요.")
private String password;
@NotBlank(message = "이메일을 입력하세요.")
private String email;
}
UserController.java (컨트롤러)
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService UserService;
@GetMapping("/register") // 유저 등록 창 불러오기
public String ShowRegister(Model model) {
model.addAttribute("userDTO", new RegisterDTO());
return "register";
}
@PostMapping("/register") // 유저 등록
public String Register(@Valid RegisterDTO userDTO, BindingResult result, Model model) {
if (result.hasErrors()) { // 유효성 오류 발견
System.out.println("유효성 오류");
return "register";
}
try {
UserService.saveDTOUser(userDTO); // 유저 등록
} catch (IllegalArgumentException e) { // 중복된 사용자 발견
System.out.println("예외 처리");
model.addAttribute("error", e.getMessage());
return "register";
}
return "redirect:/userlist";
}
}
UserService.java (서비스)
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public void saveDTOUser(RegisterDTO userDTO) {
if (userRepository.existsByUsername(userDTO.getUsername())) {
throw new IllegalArgumentException("이미 등록된 아이디입니다.");
}
if (userRepository.existsByEmail(userDTO.getEmail())) {
throw new IllegalArgumentException("이미 등록된 이메일입니다.");
}
User user = User.builder()
.username(userDTO.getUsername())
.email(userDTO.getEmail())
.password(userDTO.getPassword())
.build();
userRepository.save(user);
}
}
register.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Register User</title>
</head>
<body>
<h1>Register User</h1>
<form th:action="@{/register}" method="post" th:object="${userDTO}">
<label for="username">username:</label>
<input type="text" id="username" name="username" th:field="*{username}" />
<div th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></div>
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" th:field="*{password}" />
<div th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></div>
<br>
<label for="email">email:</label>
<input type="text" id="email" name="email" th:field="*{email}" />
<div th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></div>
<br>
<div th:if="${error}" class="error">
<p th:text="${error}"></p>
</div>
<button type="submit">Register</button>
</form>
<br>
<a th:href="@{/userlist}">Back to User List</a>
</body>
</html>
컨트롤러에서 작성한 "유효성 오류", "예외 처리" 구문은 잘 나오더라구요. 그러면 유효성 검사는 잘 수행하는거 아닌가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
과넌님, 현재 발생하는 TemplateInputException 오류는 주로 Thymeleaf 템플릿 파일인 register.html에서 파싱 오류가 발생했을 때 발생합니다. 문제는 오류 메시지에 나타나지 않은 필드가 포착되어 있습니다. 이 문제를 해결하기 위해 몇 가지 확인해야 할 사항이 있습니다.
Thymeleaf 템플릿 구문
- Thymeleaf에서
th:field속성은 모델 객체의 속성을 바인딩하는 역할을 합니다. 표현식*{username}등에서 모델 객체가 잘 전달되고 있는지 확인해 보세요.
- Thymeleaf에서
디버깅
@Controller에서 전달하는 모델 객체가 올바르게 채워져 있는지 확인해야 합니다. 예를 들어ShowRegister메서드에서RegisterDTO객체가 제대로 넘겨졌는지 확인하세요.
유효성 검사 메시지 출력
- 유효성 검사 결과에 따라 오류 메시지가 제대로 출력되지 않을 가능성이 있습니다. 아래와 같이
error속성을 사용하여 유효성 검사 메시지를 출력할 수 있는지를 확인해 보시기 바랍니다.
- 유효성 검사 결과에 따라 오류 메시지가 제대로 출력되지 않을 가능성이 있습니다. 아래와 같이
<div th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></div>
<div th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></div>
<div th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></div>
- Bean Validation 환경 확인
@Valid와BindingResult를 함께 사용하여 올바르게 유효성 검사가 이루어지고 있는지를 확인하세요. 유효성 검사 관련 Bean 및 설정이 올바르게 설정되었는지 검토해주세요.
추가로, 스프링 부트에서는 whitelabel error page가 기본으로 설정되어 있는데, 이를 원하는 방식으로 커스터마이즈하거나 비활성화하려면 다음 링크를 참고하세요:
Whitelabel Error Page Customization
이렇게 해결 방법을 제시드렸으니 도움이 되셨으면 좋겠습니다. 프로젝트 진행에 더욱 성공을 기원합니다! 😊
아무도 모르게 책 내시면 모르실 줄 알고!!
1
18
2
[영한님]Spring Boot 및 프로젝트 생성
0
7
1
Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면
1
26
1
리뉴얼 시기
0
4
0
스크립트에 대해 질문 있습니다.
1
14
1
같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!
1
13
1
조건 검색 질문
0
12
1
JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문
0
19
2
강의 요청 문의
0
26
2
클로드코드 명령어-대화&세션관리 수업 자료
0
30
1
콘솔 로그가 깨져나오는데 혹시 방법이 있을까요?
0
39
2
정처기 필기 준비할때 이 이론을 다시 외워도 될까요?
0
43
2
PlatformTransactionManager, ResourcelessTransactionManager 질문
1
50
2
WebFlux & Web MVC 혼용해서 사용했을 때 스레드에 대한 질문
0
28
1
자료 한번에 다운받기
0
27
1
서울 이미지 10개에 대한 url 접근 불가
0
59
2
스프링 빈 등록 방법 2가지 다 알아야하는 이유
0
48
1
mybatis 를 이용한 crud에서 insert에서 resultType='long" 이라고 하셨는데요,
0
24
1
댓글 삭제 로직에서 동시성 문제 발생 가능성
0
34
1
설계 트레이드 오프 링크 접속 안됨
0
71
2
테스트 질문, 어떤것을 사용할것인것에 대해서
0
38
1
Shape 클래스 실습 코드 피드백 요청드립니다
0
37
2
재고 감소와 쿠폰 발급은 왜 서로 다른 방식으로 동시성을 제어하나요?
0
44
2
깃허브주소 궁금합니다.
0
32
2





