바인딩 에러시 모델에 담기는 정보

  • Event
  • BindingResult.event

타임리프 폼파일 :

<!DOCTYPE html>
<html lang="en" xmlns:th = "http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Create New Event</title>
</head>
<body>
<form action="#" th:action="@{/events}" method="post" th:object="${event}">
    <p th:if="${#fields.hasErrors('limit')}" th:errors="*{limit}">Incorrect limit</p>
    <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Incorrect name</p>
    <input type="text" title="name" th:field="*{name}" />
    <input type="text" title="limit" th:field="*{limit}" />
    <input type="submit" value="Create"/>

</form>

</body>
</html>

위와 같이 타임리프를 통해 타입의 유효성 체크를 해줄 수 있다.

POST / REDIRECT / GET

  • POST요청 이후 브라우저를 리프래시 하더라도 중복 폼 서브밋이 발생하지 않도록 REDIRECT를 사용하자.
@PostMapping(value = "/events")
    public String getEvent(@Validated @ModelAttribute Event event, BindingResult bindingResult, Model model){

        if(bindingResult.hasErrors()){
            return "/events/form";
        }
        List<Event> eventList = new ArrayList<>();
        eventList.add(event);
        model.addAttribute(eventList);
        return "redirect:/events/list";
    }

    @GetMapping("/events/list")
    public String getEvents(Model model){
        Event event = new Event();
        event.setName("spring");
        event.setLimit(10);
        List<Event> eventList = new ArrayList<>();
        eventList.add(event);
        model.addAttribute(eventList);
        return "/events/list";
    }

위 코드와 같이 /events에서 포스트 처리를 하고 /events/list로 넘어간 뒤에 리프레쉬를 하게 되면, post요청이 중복 처리 되지 않고 get요청으로 /events/list요청을 처리할 수 있다. 여기서는 redirect를 이용하였다.


참고자료

  1. 스프링 웹 MVC

oksusutea's blog

꾸준히 기록하려고 만든 블로그