Spring/SpringBoot
day81) 데이터 유효성 검증
code_learner
2022. 4. 26. 01:00
[데이터 유효성 검증]
Validator
1. 클라이언트,브라우저, html페이지,사용자
js를 통해서 검증
서버의 부하를 줄임
2. 서버, jsp, servlet
파라미터로 넘어온 값을 검증
URL을 이용한 악의적인 접근을 검증
[적용]
1. build.gradle에서 dependencies추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 이동할 jsp페이지 작성
-val1.jsp : 데이터 유휴성 검사 시 error 리턴시 보여줄 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>01</title>
</head>
<body>
<form action="/val">
<input type="text" name="name" value="${vo.name}">
<input type="text" name="phone" value="${vo.phone}">
<input type="submit" value="검증하기">
</form>
</body>
</html>
-val2.jsp : 데이터 유효성 검사를 무사히 통과시 보여줄 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>02</title>
</head>
<body>
완료!
</body>
</html>
[3] MemberValidator클래스
package com.example.demo;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class MemberValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
// TODO Auto-generated method stub
return MemberVO.class.isAssignableFrom(clazz);//검증할 객체의 클래스를 확인
}
@Override
public void validate(Object target, Errors errors) {
//리턴타입이void 이므로 Errors에 해당하는 객체를 보내줘야, 참조가능 ☆
//target: 검증 대상
//errors: 어떤 에러가 발생했는지를 알려줌
MemberVO vo = (MemberVO)target;
String name = vo.getName();
if(name==null||name.trim().isEmpty()) {
System.out.println("로그: name값이 비어있습니다.");
errors.rejectValue("name", "error");
//MyController에서 hasError의 여부를 알려줌
}
String phone = vo.getPhone();
if(phone==null||phone.trim().isEmpty()) {
System.out.println("로그: phone값이 비어있습니다.");
errors.rejectValue("phone", "error");
}
}
}
[4]MyController
package com.example.app;
@Controller
public class MyController {
@RequestMapping("/val")
public String val(@ModelAttribute("vo") @Valid MemberVO memberVO,BindingResult result) {
//@Valid 유효성 검사를 수행하라는 요청
System.out.println("MyController로그: "+memberVO);
//MemberValidator validator = new MemberValidator();
//validator.validate(memberVO, result);//☆result인자로 전달해줬기 때문에 참조가능
//낮은 결합도 -> 코드 내에 직접 new 작성 xxx
// => 싱글톤 xxx (-> 프로젝트 시작 시 한 번 실행될 수 있도록 코드 변경예정)
String viewName="val1";
if(!result.hasErrors()) {
viewName="val2";
}
return viewName;
}
@InitBinder//프로젝트가 시작할 때 해당 메서드를 먼저 수행
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new MemberValidator());
//한번 new한 객체를 주입받아서 사용할 수 있도록, 약한 결합으로 변경
}
}