취미로 음악을 하는 개발자

[Spring Boot] InitBinder, Valid 본문

공대인/Spring[Boot]

[Spring Boot] InitBinder, Valid

영월특별시 2019. 8. 5. 16:02
728x90

프로젝트 생성


 




# InitBinder 코드 구현


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
package com.study.springboot;
 
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
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;
        
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "writer""writer is empty.");
        String sWriter = dto.getWriter();
        if (sWriter.length() < 3)
            errors.rejectValue("writer""writer is too short.");
        
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "content""content is empty.");
    }
}
cs


"writer"나 "content" 값이 비어있거나 null이면 해당 에러를 출력.

특히 "writer" 부분은 길이가 3보다 작을 때도 에러 출력.



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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.study.springboot;
 
import javax.validation.Valid;
 
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
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 "Vali Annotation";
    }
    
    @RequestMapping("/insertForm")
    public String test1() {
        return "createPage";        
    }
    
    @RequestMapping("/create")
    public String insert2(@ModelAttribute("dto") @Valid ContentDto contentDto,
                            BindingResult result) {
        String page = "createDonePage";
        
//        ContentValidator validator = new ContentValidator();
//        validator.validate(contentDto, result);
        if (result.hasErrors()) {
            if (result.getFieldError("writer"!= null)
                System.out.println("1: "+ result.getFieldError("writer").getCode());
            
            if (result.getFieldError("content"!= null)
                System.out.println("2: "+ result.getFieldError("content").getCode());
            page = "createPage";
        }
        
        return page;
    }
    
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new ContentValidator());
    }
}
cs


/create 부분은 "writer"나 "content"의 에러 조건에 따라 해당 로그를 출력함.

 

@Valid

: 메소드가 실행할 때 해당 파라미터가 들어오면 항상 검증함.


@InitBinder

: 검증에 사용할 클래스를 이 부분에서 의존성 주입을 함.



* jsp 파일들은 이전 포스트에 했던 코드를 그대로 가져왔다.


// createPage.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ 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();
    out.println(conPath);
%>
 
<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



// createDonePage.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ 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
<%
    String conPath = request.getContextPath();
    out.println(conPath);
%>
<br>
이름 : ${dto.writer }입니다.<br>
내용 : ${dto.content } 입니다.
</body>
</html>
cs



Model을 설정할 때 쓰는 어노테이션


@JsonProperty

: json 형식의 데이터를 받음


@NotNull

: null이 될 수 없는 데이터


@NotEmpty

: 빈 값이 될 수 없는 데이터


@Min

: 상수값일 때 최소값 지정


@Size

: 문자열에 대한 길이 지정, (message : 조건에 맞지 않을 때의 메시지)



# Valid 코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.study.springboot;
 
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
 
import lombok.Data;
 
@Data
public class ContentDto {
    private int id;
    
    @NotNull(message="writer is null.")
    @NotEmpty(message="writer is empty.")
    @Size(min=3, max=10, message="writer min 3, max 10.")
    private String writer;
    
    @NotNull(message="content is null.")
    @NotEmpty(message="content is empty.")
    private String content;
}
cs

writer는 null이면 안되고, 공백이면 안되며, 최소 3자리, 최대 10자리여야 한다.
content는 null이면 안되고, 공백이면 안된다.
각각 해당 조건에 안맞는 경우는 조건에 따라 에러를 출력


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
35
36
37
38
39
40
41
42
43
44
45
46
package com.study.springboot;
 
import javax.validation.Valid;
 
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 "Valid Annotation";
    }
    
    @RequestMapping("/insertForm")
    public String test1() {
        return "createPage";        
    }
    
    @RequestMapping("/create")
    public String insert2(@ModelAttribute("dto") @Valid ContentDto contentDto,
                            BindingResult result) {
        String page = "createDonePage";
        
//        ContentValidator validator = new ContentValidator();
//        validator.validate(contentDto, result);
        if (result.hasErrors()) {
            if (result.getFieldError("writer"!= null)
                System.out.println("1: "+ result.getFieldError("writer").getDefaultMessage());
            
            if (result.getFieldError("content"!= null)
                System.out.println("2: "+ result.getFieldError("content").getDefaultMessage());
            page = "createPage";
        }
        
        return page;
    }
    
//    @InitBinder
//    protected void initBinder(WebDataBinder binder) {
//        binder.setValidator(new ContentValidator());
//    }
}
cs

Model에서 Valid 어노테이션을 이용한 설정만으로 따로 검증할 메소드가 필요 없어지고 더 간단하게 구현할 수 있게 된다.



'공대인 > Spring[Boot]' 카테고리의 다른 글

[Spring Boot] MyBatis  (0) 2019.08.13
[Spring Framework] MyBatis란  (0) 2019.08.09
[Spring Boot] 데이터 검증, Validator  (0) 2019.08.02
[String Boot] lombok  (0) 2019.08.02
[Spring Boot] Form  (0) 2019.07.31
Comments