JAVA Spring #5

keymu·2024년 11월 14일
0

Debugging의 중요성
1. 개발자 도구, 소스 코드 확인하기
2. breakpoint 잡기
3. server 돌리면서 debugging(벌레 버튼) 클릭


Validation

서버 측에서 validation 처리하는 법
클라이언트에서 submit 전에 JavaScript로 validation을 검증하지만, command 객체를 사용하면 handler 작동 전 binding 작동하는데, 이때 검증을 어떻게 할 것인가?

Data Binding

  • 입력값을 타겟 객체에 설정해주는 것
  • 사용자의 문자열 입력값을 어플리케이션 도메인 객체의 property 값으로 동적으로 할당해주는 것
package com.lec.spring.domain;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class PostValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        System.out.println("supports(" + clazz.getName() + ") 호출");

        // ↓ 검증할 객체의 클래스 타입인지 확인 : Post = clazz; 가능 여부
        boolean result = Post.class.isAssignableFrom(clazz);
        System.out.println(result);
        return result;
    }

    @Override
    public void validate(Object target, Errors errors) {
        Post post = (Post) target;
        System.out.println("validate() 호출 : " + post);

        String user = post.getUser();
        if(user == null || user.trim().isEmpty()){
            errors.rejectValue("user", "작성자는 필수입니다");
        }

        // ValidationUtils 사용
        // 단순히 빈(empty) 폼 데이터를 처리할때는 아래 와 같이 사용 가능
        // 두번째 매개변수 "subject" 은 반드시 target 클래스의 필드명 이어야 함
        // 게다가 Errors 에 등록될때도 동일한 field 명으로 등록된다.
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "subject", "글 제목은 필수입니다");

    }
}
  • 주어진 객체(target)에 유효성검사를 하고 유효성검사에 오류가 있는 경우 주어진 객체에 이 오류들을 errors 에 등록 한다.
  • 아래 validate() 는 Spring 이 기본적인 binding이 수행한 이후에 호출된다. errors 에는 Spring이 수행한 기본적인 binding 에러 들이 이미 담겨 있고 target 에는 binding 이 완료한 커맨드 객체가 전달된다.
  • 컨트롤러 핸들러 매개변수에 @Valid 가 붙어 있어야 validate() 가 동작한다
profile
Junior Backend Developer

0개의 댓글