반응형
Spring MVC의 컨트롤러 메서드에서
@Valid와 BindingResult는 데이터 검증(@Valid) 결과를 처리하기 위해 쌍으로 동작합니다.
그러나 Spring MVC는 매개변수 순서에 민감하며, 특정 규칙을 따라야 올바르게 동작합니다.
(기존에 사용하던코드)
@PostMapping("update")
public String update(@Valid @ModelAttribute("boardDto") BoardDto board ,Model model,BindingResult bresult,HttpServletRequest request) throws Exception {
System.out.println("PostUpdate");
if(bresult.hasErrors()) {
return "board/update";
}
.....
}
@Valid로 검증되는 객체(예: BoardDto)와 그 검증 결과를 저장하는 BindingResult는 바로 연속적으로 선언되어야 합니다.
@Valid BoardDto board 바로 뒤에 BindingResult bresult가 와야 합니다.
만약 Model뿐만아닌 다른 매개변수가 BoardDto와 BindingResult 사이에 위치하면, Spring은 BindingResult를 @Valid와 연결하지 못하고 검증 결과가 무시되거나 예외가 발생할 수 있습니다.
예외가발생한다면 spring자체에서 발생하는것이므로 PostMapping 접근조차 되지않고 오류가발생하여
오류의원인을 찾기가힘들것임
(변경한 매개변수의 순서)
@PostMapping("update")
public String update(@Valid @ModelAttribute("boardDto") BoardDto board ,BindingResult bresult,Model model,HttpServletRequest request) throws Exception {
....}
view의 일부분
<form th:object="${boardDto}" th:action="@{/board/update}" method="post" enctype="multipart/form-data" >
....
<table class="w-full table-auto border-collapse">
<tr class="border-b">
<th class="p-4 w-1/5 font-medium text-gray-700 text-left">글쓴이</th>
<td class="p-4">
<input th:field="*{writer}" id="writer" class="w-full p-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
<div class="text-red-500 text-sm mt-1" th:if="${#fields.hasErrors('writer')}" th:errors="*{writer}"></div>
</td>
......
</table>
</form>
BoardDto객체의 writer필드 검증부분
@NotEmpty(message="작성자 입력하세요")
private String writer;
@Valid 다음에 BindingResult가
연속적으로 와야만 다음과같이 정상적으로 valid입력검증을 할 수 있음
'Spring' 카테고리의 다른 글
부트캠프95일차 (springSecurity) (0) | 2025.06.30 |
---|---|
spring에서의 mapstruct 라이브러리에 관한 설명 (0) | 2025.06.29 |
부트캠프91일차 (new Project JPA,Thymeleaf사용,transaction,Log4j2) (0) | 2025.06.23 |
부트캠프91일차 (네이버검색api , Scheduling스케줄링) (2) | 2025.06.23 |
parameter값 or logic대신 Dto객체 사용 (0) | 2025.06.22 |