Spring

스프링 부트 - Validator 검증

Clearing 2022. 10. 26. 11:37
728x90

Validator는 사용자가 보낸 데이터에 대한 유효성 검사를 진행하는 것을 말한다.

이 유효성 검사는 두 단계로 진행하는 것이 보편적이다.

1. 클라이언트(브라우저, 사용자) : JS

2. 서버 : 파라미터 값을 검증

 

과거에는 이러한 검증방법이 회사마다 사용하는 곳마다 많이 달랐기 때문에 유지보수에 불리했지만

스프링에서는 Validator 인터페이스를 구현해놓았기 때문에 개발자들이 보다 일관된 코드를 작성할 수

있게 되었다.

 

사용자가 입력한 데이터를 확인하기 위한 Validator 예시

package com.kim.springboot;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

// 유효성 검사 객체
public class DataValidator implements Validator{

	@Override
	public boolean supports(Class<?> clazz) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void validate(Object target, Errors errors) {
		// Object target : 사용자의 입력 값(커맨드 객체)을 검증하기 위해, 
		// 파라미터로 받을 수 있게 구현한 부분
		// -> 디자인 패턴을 활용한 예: 부모에게 자식을 대입 가능
		DataDTO dto = (DataDTO)target;
		
		// 커맨드 객체에 저장된 값을 추출
		String writer = dto.getWriter();
		if(writer==null || writer.trim().isEmpty()) { 
		// ★ null 체크 순서 유의 !! null 이면 isEmpty가 실행이 안됨
			System.out.println("로그: DataValidator: validate 메서드: 작성자 null or empty");
			errors.rejectValue("writer", "error");
		}
		
		String content = dto.getContent();
		if(content==null || content.trim().isEmpty()) { 
			System.out.println("로그: DataValidator: validate 메서드: 내용 null or empty");
			errors.rejectValue("content", "error");
		}
		
		
	}

}

Q. errors 객체에 에러 내용을 저장했는데, 별도의 return을 하지 않는다.

A. .validate()을 수행할 때에, errors 객체를 "참조 변수"로 활용하기 때문이다
                                                                   -> 모델 객체

 

 

Validator를 사용하는 컨트롤러

package com.kim.springboot;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
	
	@RequestMapping("/")
	public @ResponseBody String root() {
		return "Validator 실습";
	}
	
	@RequestMapping("/insertPage")
	public String insertPage() {
		return "insertPage";
	}
	
	@RequestMapping("/insert")
	public String insert(@ModelAttribute("dto")DataDTO dto, BindingResult result) {
		// 데이터 유지를 위해 @ModelAttribute 사용
		String viewName = "boardPage";
		
		System.out.println("로그: TestController: insert 메서드: dto: "+dto);
		DataValidator validator= new DataValidator();
		validator.validate(dto, result); // result는 참조변수 ★
		if(result.hasErrors()) { // 에러가 발견되었다면,
			viewName="insertPage";
		}
		
		return viewName;
	}
	
}

 

사용자의 입력을 받는 insertPage

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="/insert" method="post">
	작성자: <input type="text" name="writer" value="${dto.writer}"> <br>
	내용: <input type="text" name="content" value="${dto.content}"> <br>
	<input type="submit" value="글 작성하기">
</form>

</body>
</html>

=====================================

결과 화면

insertPage

=====================================

/insert에 의해 이동된 boardPage

=====================================

Validator 조건에 의해 작성자나 내용이 null 또는 비어있다면 해당 페이지에 데이터를 유지한 채 이동

728x90

'Spring' 카테고리의 다른 글

스프링 부트 - JPA 연동  (0) 2022.12.05
스프링 부트 - MyBatis 연동  (0) 2022.12.04
스프링 부트 - 의존 주입  (0) 2022.10.25
스프링 부트 설치 및 시작  (0) 2022.10.24
Spring Ajax를 사용한 정렬  (1) 2022.10.07