[사용자의 입력값 검증]
: 사용자가 입력값을 요청에 넣어서 보냈을때
최소한의 조건을 만족한 값인지 확인하는 Spring의 기본제공기능이 있다
->유효성 검증 객체 Validator
Dependencies 추가 Validaton
1차
MemberDTOValidation implements Validator
->메서드 강제
sopports 에 검증하고 싶은 객체를 확인한다
validate에 확인하고 싶은 유효성을 넣으면된다
target는 Object이기 때문에 다운 케스팅으로 형변환해서 객체에 담아 사용한다
컨트롤러에서 만든 vlidator를 사용해보면
확인 하고 싶은 객체를 인자로 넣고 추가로 에러 내용을 받기위한 BindingResult를 커맨드 객체로 받아 넣어준다
그러면 유효성이 작동되는 것을 확인 할 수 있다
하지만 코드 안에 new가 있다면 강한결합코드->결합도가 높다
그래서 해당부분을 지우고
new를 대신 해주기위해
@InitBinder
void initDinder(WebDataBinder binder) {
binder.setValidator(new MemberDTOValidation());
}
작성한다
추가로 new가 되었으니 확인하기 위해
어노테이션을 사용해여 유효성 검사를 하도록한다 (@Valid 으로 validator.validate(mDTO, result); 대신함)
이로써 약한 결합의 코드 -> 결합도가 낮은 코드가 되었다
2차
@InitBinder
void initDinder(WebDataBinder binder) {
binder.setValidator(new MemberDTOValidation());
}
사용하지 않고
DTO직접 유효성을 거는 방법
DTO에 어노테이션으로 유효성을 걸수있다
package com.koreait.day072;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Data
public class MemberDTO {
@NotNull(message="name NULL")
@NotEmpty(message="name EMPTY")
@Size(min=2, max=6,message="name ERROR")
private String name;
private int age;
}
package com.koreait.day072;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class MemberDTOValidation implements Validator{
@Override
public boolean supports(Class<?> clazz) {
System.out.println("확인용 로그01");
//검증하고 싶은 객체의 자료형(클래스 타입)에 대한 정보를 제공하는 메서드
return MemberDTO.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
System.out.println("확인용 로그 02");
//타겟이 오면 MemberDTO의 나이가 맞는지 확인
MemberDTO mDTO=(MemberDTO)target;//다운 개스팅(형변환)
String name=mDTO.getName();
if(name==null||name.isEmpty()||name.isBlank()||name.trim().isEmpty()) {
System.out.println("name에 값이 입력되지 않음");
errors.rejectValue("name", "NULL");
}
else if(name.length()<2||6<name.length()) {
System.out.println("name의 값이 2~6이 아님");
errors.rejectValue("name", "NOT 2~6");
}
int age=mDTO.getAge();
if(age<0||200<age) {
System.out.println("age가 0~200이 아님");
errors.rejectValue("age", "ERROR");
}
}
}
package com.koreait.day072;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import jakarta.validation.Valid;
@Controller
public class TestController {
@RequestMapping("/")
public String root() {
return "index";
}
@RequestMapping("/test")
public String test(@Valid MemberDTO mDTO,BindingResult result) {
System.out.println(mDTO);
//유효성 검사
// MemberDTOValidation validator=new MemberDTOValidation();
// validator.validate(mDTO, result);
//에러내용을 띄우고 싶다면?
if(result.hasErrors()) {
//둘다 에러가 날수 있기때문에 if-else가 아님
if(result.getFieldError("name")!=null) {
System.out.println(result.getFieldError("name").getDefaultMessage());
//3번째인자가 출력됧 예정
}
if(result.getFieldError("age")!=null) {
System.out.println(result.getFieldError("age").getDefaultMessage());
}
return "index";
}
// model.addAttribute("name",mDTO.getName());
// model.addAttribute("age",mDTO.getAge());
//
return "main";
}
//약한 결합의 코드
// @InitBinder
// void initDinder(WebDataBinder binder) {
// binder.setValidator(new MemberDTOValidation());
// }
}