ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링(Spring) 유효성 검사(Validation Check)
    Spring/컨셉 2018. 9. 7. 10:00

    스프링의 큰 강점 중 하나가 name 속성명만 맞추면 그에 해당하는 VO객체 매개변수에 set된다는 것이다. 이와 같이 스프링에서는 모든 데이터를 VO 객체단위로 관리하는데 이를 커맨드(Command) 객체라고도 칭한다. 스프링에서는 커맨드 객체의 멤버들 검증을 보다 간편하게 제공한다.

    pom.xml에서 hibernate-validator 검색해 org.hibernate 


    hibernate-validator 검색해 org.hibernate    hibernate-validator의 최신 Final 버전 선택 후 OK

    DispatcherServlet 에 등록한 Bean Spring Configuration 파일에 다음과 같이 LocalValidatorFactoryBean 등록. Annotation을 통해 값을 검증 할 수 있게 된다.
    주요 Annotation은 다음과 같다

    검증을 원하는 커맨드 객체의 멤버 변수 위에 다음과 같이 Annotation을 추가한다. 




    @RequestMapping(value="/board/write", method=RequestMethod.POST) // POST 방식 지원
    	public String doWriteAction(@Valid @ModelAttribute("writeForm") BoardVO board, Errors errors,/* 검증에 대한 결과 들어있는 객체 */  HttpServletRequest request){ 
    		
    		String ip = request.getRemoteAddr();
    		
    		board.setIp(ip);
    		
    			if(errors.hasErrors()){ // 에러 있다면
    				return "/board/write";
    			} else {
    				if(boardService.addOneBoard(board)){
    					return "/board/list";
    				} else {
    					return "/board/write";
    			}
    		}
    	}
    

    요청 처리하는 서블릿에 매개변수로 @Valid @ModelAttribute(), Errors 두가지가 필요하고, 이들은 항상 짝을 이뤄 사용한다. 
    @Valid : Annotation의 유효성 검사를 한다는 의미
    @ModelAttribute : 유효성 검사를 할 form과 커맨드 객체 타입 지정
    Errors : 유효성 검사 결과를 담는 객체

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="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>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>/board/write.jsp</title>
    <script type="text/javascript" src="<c:url value="/static/js/jquery-3.1.1.min.js"/>"></script>
    <script type="text/javascript">
    	$().ready(function(){
    		
    		$("#writeBtn").click(function(){
    			$("#writeForm").attr({
    				"method" : "post",
    				"action" : "<c:url value="/board/write" />"
    			});
    			$("#writeForm").submit();
    		});
    		
    	});
    </script>
    </head>
    <body>
    	
    	<form:form commandName="writeForm"> <!-- 스프링 태그의 form으로 변경 id 대신 commandName 사용 -->
    		<input type="text" name="subject" placeholder="input subject"/>
    			<form:errors path="subject" /><br/>
    		<input type="text" name="writer" placeholder="input writer" />
    			<form:errors path="content" /><br/>
    		<input type="text" name="content" placeholder="input content" /><br/>
    		<input type="button" id="writeBtn" value="등록" /><br/>
    	</form:form>
    	
    </body>
    </html>
    

    jsp 페이지. 
    스프링 form 태그 사용 위해
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    추가한다. (uri는 ctrl + space 누르고 제일 아래 위치)
    <form:form> : 스프링 form 태그
    commandName : 기존 form 태그의 id 역할.
    <form:errors> : Error 객체에 전달된 커맨드 태그에 접근할 수 있는 태그. path 속성 통해 멤버 구분한다.

    @RequestMapping(value="/board/write", method=RequestMethod.POST) // POST 방식 지원
    	public String doWriteAction(@Valid @ModelAttribute("writeForm") BoardVO board, Errors errors,/* 검증에 대한 결과 들어있는 객체 */  HttpServletRequest request){ 
    		
    		String ip = request.getRemoteAddr();
    		
    		board.setIp(ip);
    		
    			if(errors.hasErrors()){ // 에러 있다면
    				return "/board/write"; // 처리 후 페이지로
    			} else {
    				if(boardService.addOneBoard(board)){
    					return "/board/list";
    				} else {
    					return "/board/write";
    			}
    		}
    	}
    

    유효성 검사 에러 여부를 hasErrors 함수로 확인할 수 있다. 
    에러가 있다면 에러메세지를 가지고 같은 페이지로 이동하고, 아니라면 이후 작업을 수행하면 된다.

    만족하지 못하는 조건들에 따라 메세지들이 출력된다.




Designed by Tistory.