강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

과넌님의 프로필 이미지
과넌

작성한 질문수

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing 오류

작성

·

48

0

스프링부트에서 Thymeleaf를 이용해 회원가입 폼을 만들고 있는데 폼에 입력을 제대로 하면 의도한대로 회원가입이 잘 됩니다.

하지만 폼에 아무것도 입력하지 않으면 유효성 검사에서 @NotBlank를 만나서 그에 맞는 에러 메시지를 출력해야 하는데 저렇게 오류가 뜨네요...

대체 이유가 뭘까요 ㅠㅠ

image.png

 

제 회원가입 코드는 다음과 같습니다.

 

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에서 파싱 오류가 발생했을 때 발생합니다. 문제는 오류 메시지에 나타나지 않은 필드가 포착되어 있습니다. 이 문제를 해결하기 위해 몇 가지 확인해야 할 사항이 있습니다.

  1. Thymeleaf 템플릿 구문

    • Thymeleaf에서 th:field 속성은 모델 객체의 속성을 바인딩하는 역할을 합니다. 표현식 *{username} 등에서 모델 객체가 잘 전달되고 있는지 확인해 보세요.
  2. 디버깅

    • @Controller에서 전달하는 모델 객체가 올바르게 채워져 있는지 확인해야 합니다. 예를 들어 ShowRegister 메서드에서 RegisterDTO 객체가 제대로 넘겨졌는지 확인하세요.
  3. 유효성 검사 메시지 출력

    • 유효성 검사 결과에 따라 오류 메시지가 제대로 출력되지 않을 가능성이 있습니다. 아래와 같이 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>
  1. Bean Validation 환경 확인
    • @ValidBindingResult를 함께 사용하여 올바르게 유효성 검사가 이루어지고 있는지를 확인하세요. 유효성 검사 관련 Bean 및 설정이 올바르게 설정되었는지 검토해주세요.

추가로, 스프링 부트에서는 whitelabel error page가 기본으로 설정되어 있는데, 이를 원하는 방식으로 커스터마이즈하거나 비활성화하려면 다음 링크를 참고하세요:

Whitelabel Error Page Customization

이렇게 해결 방법을 제시드렸으니 도움이 되셨으면 좋겠습니다. 프로젝트 진행에 더욱 성공을 기원합니다! 😊

과넌님의 프로필 이미지
과넌

작성한 질문수

질문하기