인프런 커뮤니티 질문&답변
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing 오류
작성
·
48
0
스프링부트에서 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
이렇게 해결 방법을 제시드렸으니 도움이 되셨으면 좋겠습니다. 프로젝트 진행에 더욱 성공을 기원합니다! 😊




