취미로 음악을 하는 개발자

[Spring Boot] 데이터 검증, Validator 본문

공대인/Spring[Boot]

[Spring Boot] 데이터 검증, Validator

영월특별시 2019. 8. 2. 19:47
728x90

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
Comments