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 |