일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 슬픔의 후에
- DBMS 구성요소
- 신입
- 오라클
- 장범준
- 기타
- IT
- index
- 천공의 시간
- 니가 참 좋아
- 데이터베이스
- 개발자
- 러블리즈
- Inside Of Me
- db
- 핑거스타일
- I'm fine thank you
- 악보
- 스위트라떼
- 오라클 아키텍처
- nginx
- SQL 처리
- 인덱스
- 레이디스코드
- 봄 사랑 벚꽃 말고
- 말 더듬
- 6학년 8반 1분단
- DBMS
- oracle
- 아이유
취미로 음악을 하는 개발자
[Spring Boot] 데이터 검증, Validator 본문
Validate, 데이터 검증
: 포맷 데이터를 파라미터로 받아 데이터를 만들고 모델에 담아 뷰에 보여주는 과정, 파라미터가 데이터로서 사용 가능한지 파악하는 단계
프로젝트 생성
코드 구현
1 2 3 4 5 6 7 8 9 10 | package com.study.springboot; import lombok.Data; @Data public class ContentDto { private int id; private String writer; private String content; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package com.study.springboot; import org.springframework.validation.Errors; import org.springframework.validation.Validator; public class ContentValidator implements Validator{ @Override public boolean supports(Class<?> arg0) { return ContentDto.class.isAssignableFrom(arg0); // 검증할 객체의 클래스 타입 정보 } @Override public void validate(Object obj, Errors errors) { ContentDto dto = (ContentDto)obj; String sWriter = dto.getWriter(); if(sWriter == null || sWriter.trim().isEmpty()) { System.out.println("Writer is null or empty"); errors.rejectValue("writer", "trouble"); } String sContent = dto.getContent(); if(sContent == null || sContent.trim().isEmpty()) { System.out.println("Content is null or empty"); errors.rejectValue("content", "trouble"); } } } | cs |
필요한 필드만 검증하는 로직(supports, validate)만 구현한 것.
커맨드 객체를 검증하기 위해 ContentDto를 사용했으며, 내용이 null이거나 비어있으면 에러가 발생했다는 로그 출력 및 key-value 형태로 값을 넣어준 것.
* 참고로 위의 16번줄~25번줄 코드는 ValidationUtils 클래스를 이용하면 아래와 같이 쓸 수 있다.
1 2 3 | ValidationUtils.rejectIfEmptyOrWhitespace(errors, "writer", "writer is empty."); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "content", "content is empty."); | cs |
메소드 이름을 보면 알 수 있듯이 공백이거나 null일 때의 error를 정해주는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package com.study.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 MyController { @RequestMapping("/") public @ResponseBody String root() throws Exception{ return "Validator (1)"; } @RequestMapping("/insertForm") public String insert1() { return "createPage"; } @RequestMapping("/create") public String insert2(@ModelAttribute("dto") ContentDto contentDto, BindingResult result) { String page = "createDonePage"; System.out.println(contentDto); ContentValidator validator = new ContentValidator(); validator.validate(contentDto, result); if (result.hasErrors()) page = "createPage"; return page; } } | cs |
/ 일 때, @ResponseBody에 의해 String "Validator (1)"이 그대로 호출됨
/insertForm 일 때, createPage.jsp가 호출됨
/create 일 때, 결과적으로 createDonePage.jsp가 호출해야하지만 ContentValidator 클래스의 validate의 데이터 검증 과정을 통해 유효한 값이 입력되면 그대로 호출하고 에러가 발생하면 다시 createPage로 돌아간다.
@ModelAttribute("dto")를 하면 jsp 페이지에서 dto를 이용한 접근이 가능하다.
// createPage.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> createPage.jsp <% String conPath = request.getContextPath(); %> <form action="<%=conPath %>/create"> 작성자 : <input type="text" name="writer" value="${dto.writer }"> <br /> 내용 : <input type="text" name="content" value="${dto.content }"> <br /> <input type="submit" value="전송"> <br /> </form> </body> </html> | cs |
request.getContextPath()는 프로젝트의 경로를 가져온다. 이 프로젝트에서는 / 를 의미한다.
form 형식에 맞게 작성자 부분과 내용 부분을 입력하면 그 값들은 각각 dto.writer, dto.content의 값들이 되고
validate 함수에 의해 데이터 검증 과정을 거친다.
// createDonePage.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> createDonePage.jsp <br> 이름 : ${dto.writer }입니다.<br> 내용 : ${dto.content } 입니다. </body> </html> | cs |
createPage.jsp에 의해 유효한 값이 입력되면 이 페이지로 넘어오고 형식에 맞게 데이터 값들이 출력된다.
// 실행화면
루트 경로로 들어가면 첫 페이지가 나오게된다.
insertForm 경로로 가면 데이터를 입력하는 페이지가 나오고 유효한 값을 입력하면 createDonePage.jsp를 호출하게 되고 하나라도 비어있거나 유효하지 않은 값을 입력하면 다시 입력하게 한다.
이 때, 입력한 값에 따라 아래와 같은 결과가 나온다.
// 유효한 값을 입력했을 때의 결과 화면과 로그
// 유효하지 않은 값을 입력했을 때(둘 다 공백일 때)의 결과 화면과 로그
주소창을 보면 writer와 content값이 공백이기 때문에 처리가 되지 않았다.
'공대인 > Spring[Boot]' 카테고리의 다른 글
[Spring Framework] MyBatis란 (0) | 2019.08.09 |
---|---|
[Spring Boot] InitBinder, Valid (0) | 2019.08.05 |
[String Boot] lombok (0) | 2019.08.02 |
[Spring Boot] Form (0) | 2019.07.31 |
[Spring Boot] Model 객체 (1) | 2019.07.31 |