Spring

SpringMVC 매개변수 순서의중요성(@Valid , BindingResult, Model)

동곤일상 2025. 6. 28. 15:07
반응형

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뿐만아닌 다른 매개변수가 BoardDtoBindingResult 사이에 위치하면, 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입력검증을 할 수 있음