스프링부트 유효성 관련..

(。◠ ◠。)·2022년 8월 31일

국비 개발 훈련 일기

목록 보기
29/35

1. 뷰의 폼

이것은 폼이다

	<form action="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>

2. implements Validator 구현체1

Validator를 상속받아왔다.
이 객체를 검증할거다
값을 검증해서 값이 비었거나 하는 경우 오류났다고 알려준다.

public class ContentValidator implements Validator{
	
	@Override
	public boolean supports(Class<?> clazz) {
		return ContentDto.class.isAssignableFrom(clazz);//검증할 객체의 클레스타입정보
	}
	
	@Override
	public void validate(Object target, Errors errors) {
		//형변환
		ContentDto dto = (ContentDto)target;	
		String writer = dto.getWriter();
		
        if(writer == null||writer.trim().isEmpty()) {
		System.out.println("writer is null");
		errors.rejectValue("writer","trouble");
		}
		
			String content = dto.getContent();
            if(content == null||content.trim().isEmpty()) {
			System.out.println("content is null");
			errors.rejectValue("content", "trouble");
		}

	}
}

3. 컨트롤러 1

폼을 처리하는 @RequestMapping("create")
insert2는 매개변수로 DTO객체와 폼의 결과BindingResult result를 받아온다
validator.validate(contentDto, result); 함수에 넣어준다
얘는 void타입인데 에러인 Errors errorsresult로 돌려준다
그래서 if문에서 에러가 발생하면 페이지를 넘기지 않고 그대로 시작페이지에서 머물게 한다.

	@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;
	}

그레이들 dependencies에 추가

implementation 'org.springframework.boot:spring-boot-starter-validation'

2. implements Validator 구현체2 (binder / Init)

그냥 제공해주는 거로 비었는지 확인 가능하다
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"객체이름","콘솔에 표시되는 문구")

public class ContentValidator implements Validator{
	@Override
	public boolean supports(Class<?> clazz) {
		return ContentDto.class.isAssignableFrom(clazz);//검증할 객체의 클레스타입정보
	}
	
	@Override
	public void validate(Object target, Errors errors) {
		//형변환
		ContentDto dto = (ContentDto)target;
		
		ValidationUtils.rejectIfEmptyOrWhitespace(errors,"writer","writer is empty");
        //이거는 길이알아보는거.
		String writer = dto.getWriter();
		if(writer.length()<3) {
			errors.rejectValue("writer", "writer is too short");
		}
		
		ValidationUtils.rejectIfEmptyOrWhitespace(errors,"content","content is empty");
		String content = dto.getContent();
		if(content.length()<3) {
			errors.rejectValue("content", "content is too short");
		}
	}
}

3. 컨트롤러2 (binder)

위에는 똑같고 받아오는 result
에러가 있으면..result.hasErrors()가 true로 되어
result.getFieldError("writer").getCode()
해당 이름의 에러를 들고와서 알려주는데
값이 없으면 1: writer is empty
값이 짧으면 1: writer is too short하고 알려준다.

	@RequestMapping("create1")
	public String insert3(@ModelAttribute("dto") ContentDto contentDto, BindingResult result) {
		String page = "createDonePage";
		System.out.println(contentDto);
		
		ContentValidator validator = new ContentValidator();
		validator.validate(contentDto, result);
		
		if(result.hasErrors()) {
			System.out.println("getAllErros : "+result.getAllErrors());
			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;
	}

3.컨트롤러 3 (Init)

@ModelAttribute("dto") @Valid ContentDto contentDto
@Valid라는 어노테이션을 사용해서
객체를 new로 만들지 않고 @InitBinder로 처리한다

	@RequestMapping("create")
	public String insert2(@ModelAttribute("dto") @Valid ContentDto contentDto, BindingResult result) {
		String page = "createDonePage";
		System.out.println(contentDto);
		
//		ContentValidator validator = new ContentValidator();
//		validator.validate(contentDto, result);
		
		if(result.hasErrors()) {
			System.out.println("getAllErros : "+result.getAllErrors());
			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());
	}

DTO (annotation)

이전까지는 그냥 dto였는데 여기서는 null empty size등을 어노테이션으로 먼저 처리해준다.
(나머지 양식은 init과 같다)

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;
}
profile
화이탱!

0개의 댓글