[Spring] Validate

Whatever·2022년 2월 9일
0

Spring(스프링)

목록 보기
14/29

입력값 검증(Validate)

: 스프링 MVC 프레임워크에서 Bean(자바빈 클래스..VO) Validation 기능을 이용하여 요청 파라미터 값이 바인딩된 도메인 클래스(메모리에 올라간 buyerVO객체)의 입력값 검증을 함

입력값 검증 절차

  • 메서드 매개변수에 도메인 클래스를 정의하고 @Validated를 지정
  • 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의
@RequestMapping(value="/detail", method=RequestMethod.POST)
	public String detailPost(@Validated BuyerVO buyerVO,
			BindingResult result)
  • BindngResult에는 요청데이터의 바인딩 오류와 입력값 검증 오류 정보가 저장됨
  • forwarding을 통해 뷰(jsp)와 오류데이터를 공유(redirect는 데이터가 전송되지 않아서)

입력값 검증 결과(BindingResult)

  • hasErrors() : 오류가 발생한 경우 true를 반환
  • getGlobalErrors() : 객체 레벨의 오류
  • getFieldErrors() : 필드(멤버변수) 레벨의 오류

입력값 검증 규칙

  • @NotBlank : 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사
  • @NotNull : 빈 값이 아닌지 검사
  • @Email : 이메일 주소 형식인지 검사
  • @Size : 글자수 검사
  • @Past : 과거 날짜인지 검사(오늘 기준으로 과거 날짜만 가능) - date타입만 가능
  • @Future : 미래 날짜인지 검사(오늘 기준으로 미래 날짜만 가능) - date타입만 가능

1. 설정

2. Annotation을 검증할 멤버변수에 적어준다.

3.BindingResult 객체를 생성해서 설정해준다.

@RequestMapping(value="/insert", method=RequestMethod.POST)
	public String insertPost(@Validated MemberVO memberVO,
			BindingResult result, Model model) {
		
		logger.info(memberVO.toString());
		List<String> hobbyList = memberVO.getHobbyList();
		for(String hobby : hobbyList) {
			logger.info(hobby);
		}
		String[] hobbyArray = memberVO.getHobbyArray();
		for(String hobby:hobbyArray) {
			logger.info(hobby);
		}
		//성별
		logger.info(memberVO.getGender());
		
		//입력값 검증 후 BindingResult가 제공하는 메서드를 이용하여 검사 결과를 확인
		//result.hasErrors : 검증 오류 발생 시 
		if(result.hasErrors()) {
			//취미 세팅
			Map<String, String> hobbyMap = new HashMap<String, String>();
			hobbyMap.put("01", "야구");
			hobbyMap.put("02", "BTS Music");
			hobbyMap.put("03", "스파이더맨 시리즈");
			
			model.addAttribute("hobbyMap", hobbyMap); //Model객체에 Attribute로 hobbyMap설정
			
			//성별 세팅
			Map<String, String> genderMap =
					new HashMap<String, String>();
			genderMap.put("Male", "남성");
			genderMap.put("Female", "여성");
			genderMap.put("Other", "기타");
			
//			session.setAttribute("gender", "genderMap");
			model.addAttribute("genderMap", genderMap);
			
			//forwarding
			return "member/joinForm";
		}else {
			//뷰의 경로 (mav.setViewName("member/result");)
			//forwarding
			return "member/result";
		}
	}

BindingResult객체인 result에서 에러가 발생했을 때 - hasErrors()로 검증

error가 있을 때는 다시 "member/joinForm"으로 돌아가고 없으면 "member/result"(결과화면)으로 전송

JSP(View)

joinForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<script src="https://ssl.daumcdn.net/dmaps/map_js_init/postcode.v2.js"></script>
<script type="text/javascript" src="/resources/ckeditor/ckeditor.js"></script>
<link rel="stylesheet" href="/resources/css/style.css" />
<link rel="stylesheet" href="//code.jquery.com/ui/1.13.0/themes/base/jquery-ui.css" />
<script type="text/javascript" src="/resources/js/jquery-ui.js"></script>
<title>회원가입</title>
<style type="text/css">
	.img_wrap{
		width:300px;
		margin-up:50px;
	}
	.img_wrap img{
		max-width:100%;
	}
</style>
<script type="text/javascript">
	//다음 우편번호 검색
	function openHomeSearch(){
		new daum.Postcode({
			oncomplete:function(data){
// 				alert("data" + JSON.stringify(data));
				$('[name=postno]').val(data.zonecode);
				$('[name=addr]').val(data.address);
				$('[name=detAddr]').val(data.buildingName);
			}
		}).open();
	}
	
	$(function(){
		$("#birth").datepicker();
	});
</script>
</head>
<body>
<!-- 
	스프링 폼 태그 라이브러리
 - 스프링 폼은 HTML 폼을 표시하기 위한 태그 라이브러리 
 - 스프링 폼을 이용하면 HTML 폼과 자바 객체를 쉽게 바인딩할 수 있음
 
 path : 폼 항목에 바인딩되는 폼 객체(Controller에 있음)의 프로퍼티를 지정
 
 -->
 <script type="text/javascript">
	$(function(){
		$("#input_img").on("change",handleImgFileSelect);		
	});
	//e : change 된 이벤트 정보
	function handleImgFileSelect(e){
		//e.target : <input type="file".. 요소
		var files = e.target.files;
		var filesArr = Array.prototype.slice.call(files);
		filesArr.forEach(function(f){
			if(!f.type.match("image.*")){
				alert("확장자는 이미지 확장자만 가능합니다");
				return;
			}
			
			var reader = new FileReader();
			reader.onload = function(e){
				$("#img").attr("src",e.target.result);
			}
			reader.readAsDataURL(f);
		});
	}
 </script>
<form:form modelAttribute="memberVO" method="post" action="/member/insert"
	enctype="multipart/form-data">  
	<p>
		<div>
			<div class="img_wrap">
				<img id="img" />
			</div>
		</div>
		<div>
			<h5>회원이미지</h5>
			<input type="file" id="input_img" name="uploadFile">
		</div>
	</p>
	<p>
		아이디 : <form:input path="memberid" />
		<c:if test="${dupChkResult!=null}">
			<font color="red">
			${dupChkResult}
			</font>
		</c:if>
		<font color="red">
			<form:errors path="memberid"/>
		</font>	
	</p>
	<p>
		이름 : <form:input path="name" />
		<font color="red">
			<form:errors path="name"/>
		</font>	
	</p>
	<p>
		비밀번호 : <form:password path="password" />
		<font color="red">
			<form:errors path="password"/>
		</font>	
	</p>
	<p>
		우편번호 : <form:input path="postno" />
		<button type="button" class="btn btn-primary btn-icon-split btn-sm"
			onclick="openHomeSearch()">
            <span class="icon text-white-50">
                <i class="fas fa-flag"></i>
            </span>
            <span class="text">우편번호검색</span>
        </button>
		<font color="red">
			<form:errors path="postno"/>
		</font>	
	</p>
	<p>
		주소 : <form:input path="addr" style="width:50%;"/>
		<font color="red">
			<form:errors path="addr"/>
		</font>	
	</p>
	<p>
		상세주소 : <form:input path="detAddr" style="width:50%;"/>
		<font color="red">
			<form:errors path="detAddr"/>
		</font>	
	</p>
	<p>
		이메일 : <form:input path="email" />
		<font color="red">
			<form:errors path="email"/>
		</font>	
	</p>
	<p>
		생일 : <form:input path="birth" />
		<font color="red">
			<form:errors path="birth"/>
		</font>	
	</p>
	
	<p>
		자기소개 : 
		<form:textarea path="introduction" rows="6" cols="30" />
	</p>
	<p>
		취미 : 
		<form:checkboxes path="hobbyList" items="${hobbyMap}" />
	</p>
	<p>
		취미(hobbyArray) : 
		<form:checkbox path="hobbyArray" value="안찰수" label="안찰수" /><br>
		<form:checkbox path="hobbyArray" value="이죄명" label="이죄명" /><br>
		<form:checkbox path="hobbyArray" value="응등이탐정" label="응등이탐정" /><br>
		<form:checkbox path="hobbyArray" value="쉼상정" label="쉼상정" /><br>
	</p>
	<p>
		성별 : 
<%-- 		<form:radiobuttons path="gender" items="${genderMap}"/> --%>
		<form:radiobutton path="gender" value="Male" label="Male" />&nbsp;
		<form:radiobutton path="gender" value="Female" label="Female" />&nbsp;
		<form:radiobutton path="gender" value="Other" label="Other" />
	</p>
	<!-- <button id="register" name="register" type="submit" 
	value="Submit">등록</button> -->
	<form:button name="register">등록</form:button>
</form:form>
<script type="text/javascript">
CKEDITOR.replace("introduction");
</script>
</body>
</html>

error가 있을 때
<form:errors> 속성으로 Validation에 위배된 오류 메시지를 나타내준다.

오류입력 결과화면 :

0개의 댓글