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한 객체를 주입받아서 사용할 수 있도록, 약한 결합으로 변경
	}
 }