주로 사용자 또는 타 서버의 요청(http request) 내용에서 잘못된 내용이 있는 지 확인하는 행위
스프링은 웹 레이어에 종속적이지 않은 방법으로 Validation을 하려고 의도하고 있으며 주로 아래 두 가지 방법을 활용하여 진행 (둘 다 데이터 검증에 가까움)
JavaBean 기반으로 간편하게 개별 데이터를 검증
요즘에 가장 많이 활용되는 방법 중 하나이며, 아래 코듳럼 JavaBean 내에 어노테이션으로 검증방법을 명시함
public class memberCreationRequest{
@NotBlank(message="이름을 입력해주세요.")
@Size(max=64, message="이름의 최대 길이는 64자 입니다.")
private String name;
@Min(0, "나이는 0보다 커야 합니다.")
private int age;
@Email("이메일 형식이 잘못되었습니다.")
private int email;
// the usual getters and setters...
}
요청 dto에 어노테이션으로 명시한 후 아래처럼 @Valid 어노테이션을 해당 @RequestBody에 달게 되면, Java Bean Validation을 수행한 후 문제가 없을 때만 메서드 내부로 진입
@PostMapping(value = "/member)
public MemberCreationResponse createMember(
@valid @RequestBody final MemberCrationRequest memberCreationReqeust) {
//member creation logics here...
}
public class Person{
private String name;
private int age;
}
Person이라는 javaBean 객체가 있을 때, 아래는 해당 인스턴스에서만 활용되는 validator이다.
인터페이스에 있는 두 개의 메서드는 아래와 같은 역할을 함
public class PersonValidator implements Validator{
public boolean supports(Calss clazz){
return Person.class.equals(clazz);
}
public void validate(Object obj, Errors e){
ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
Person p = (Person) obj;
if (p.getAge() < 0) {
e.rejectValue("age", "negativevalue");
}else if (p.getAge() > 110){
e.rejectValue("age", "too.darn.old");
}
}
}
사용자나 외부 서버의 요청 데이터를 특정 도메인 객체에 저장해서 우리 프로그램에 Request에 담아주는 것을 뜻함
S(Source) 라는 타입을 받아서 T(Target)이라는 타입으로 변환해주는 Interface
public interface Converter(S, T> {
T convert(S source);
}
특정 객체 <-> String 간의 변환을 담당
public final class DateFommatter implements Formatter<Date> {
public String print(Date date, Locale locale) {
return getDateFormat(locale).format(date);
}
public Date parse(String formatted, Locale locale) throws ParseException {
return getDateFormat(locale).parse(formatted);
}
//getDateFormat 등 일부 구현은 핵심에 집중하기 위해 생략
}
Formmater도 Convert와 마찬가지로 Spring Bean으로 등록하면 자동으로 ConversionService에 등록시켜 주기 때문에 필요에 따라 자동으로 동작