inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

96

과넌

작성한 질문수 1

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>

 

컨트롤러에서 작성한 "유효성 오류", "예외 처리" 구문은 잘 나오더라구요. 그러면 유효성 검사는 잘 수행하는거 아닌가요?

java spring spring-boot jpa thymeleaf

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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 환경 확인
    • @Valid와 BindingResult를 함께 사용하여 올바르게 유효성 검사가 이루어지고 있는지를 확인하세요. 유효성 검사 관련 Bean 및 설정이 올바르게 설정되었는지 검토해주세요.

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

Whitelabel Error Page Customization

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

정처기 2026-3 실기 문의

0

38

2

정처기 실기 3회 컴싸 사용 여부

0

31

1

자바 킴쌤 클래스 기초part2.pdf파일은 어디서 받을 수 있나요?

0

12

0

오타 제보 드립니다.

0

20

1

모의고사 1 회 2번문제 중

0

34

2

26-2 이론문제 재탕

1

30

1

26-2년도 코드문제

0

21

0

26-2 코드문제

0

22

1

15분 48초 질문

0

27

2

26-1년도 이론문제 재탕

0

42

1

26-1년도 코드문제 재탕

0

28

0

이론재탕만 눈치챘어도

0

52

1

25-3년도 이론문제 재탕

0

36

1

25-3년도 코드문제 재탕

0

28

0

출력값 문의

0

30

2

강의 관련 질문드립니다.

1

33

2

25-2 분기커버리지

0

32

0

25-2 이론 재탕

0

42

1

25-1 이론 재탕

0

33

1

Jib 빌드가 83%에서 멈추는 문제 해결(windows 사용자)

1

33

1

런타임 에러

0

29

0

서브넷 마스크

0

48

2

상세 설정까지 이해하시는 비결이 궁금합니다

1

61

2

claude api 크레딧

0

49

1