inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

84

과넌

작성한 질문수 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 환경 확인
    • @ValidBindingResult를 함께 사용하여 올바르게 유효성 검사가 이루어지고 있는지를 확인하세요. 유효성 검사 관련 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