스프링 부트에서 주로 사용하는 Bean Validation API로 스프링 부트 프로젝트를 생성할때 의존성을 하거나 bulid.gradle에서 추가 할 수 있다
사용하는 이유는 주로 외부 데이터의 유효성 검사이다
여러 어노테이션을 지원해주는데
자주 사용되는 것들은 다음과 같다
NotEmpty란 null을 허용하지 않으며 Empty("")와 공백(" ")를 허용하지 않는다
@NotEmpty
private String name;
Size는 말 그대로 길이를 뜻하는데 최소 길이부터 최대 길이까지를 뜻한다
예를 들어
@Size(min = 4,max=16)
private String passwrod
위와 같은 코드가 있을경우 이 변수의 길이는 최소 4부터 최대 16까지 가능하다
Size에 있는 min과max와의 차이점은 이 어노테이션은 길이를 뜻하는게 아니라 숫자의 값을 뜻한다
@Min(1)
@Max(100)
private Integer age;
@Email은 말 그대로 Email형식의 데이터만 포함시킬 수 있다
@Email
private String email;
이 변수에는 이메일 형식의 데이터만 들어올 수 있다
@Pattern은 입력된 값에 패턴을 검사하는 어노테이션이다 자바에서 사용되는 Pattern클래스와 비슷한 기능을한다
이메일의 유효성검사는 @Email이 어느정도 처리해주니 제일 많이 사용되는 휴대폰 번호의 유효성 검사에 대한 예시코드
@Pattern(regexp = "^\\d{2,3}-\\d{3,4}-\\d{4}$" ,message = "휴대폰 양식에 맞지 않습니다")
private String phoneNumber;
다른 어노테이션들도 regexp나 message가 사용 가능하지만 @Pattern같은 경우 매개변수에 regexp의 값이 필수다
regxp로 정규표현식을 할당하여 검사한다
@FutureOrPresent은 시간 유효성검사에 많이 쓰인다 이름에서 볼 수 있듯이 미래 또는 현재의 시간만 허용한다
이것을 사용하는 이유를 생각해보자면
예약을 할 때 과거에 예약하는 것을 허용 하지 않게 할 수 있다
@FutureOrPresent
private LocalDateTime registerAt;
HTML,JS를 공부 해보았더라면 알다싶이 View에서도 유효성 처리가 가능한데
굳이 서버까지 와서 유효성 검사를 할 필요가 있을까? 라는 생각이 든다
<input type="text" name="name" required>
<input type="text" name="phoneNumber" pattern="^\d{2,3}-\d{3,4}-\d{4}$">
<input type="number" name="age" min="1" max="100">
HTML로 한다거나 아니면 JS로 한다거나 유효성 검사는 똑같이 가능한데 굳이 서버까지 데이터를 가져와서
처리하는 이유가 뭘까?
HTML로 하는 유효성 검사는 간단한 필수 형식이나 필수 입력값들만을 처리할 수 있다
하지만 복잡한 비즈니스 로직에 따른 유효성 검사나 데이터베이스와의 상호작용을 필요로 할 때
HTML만으로 처리하기가 어렵다 이 외에도 사용자가 JavaScript를 비활성화 시켜버리면
그에 따른 대비가 불가능하다 보안과 데이터의 정확성을 위해 서버에서도 유효성 검사를 하여야한다
이 외에도 REST API Server To Server로 값을 받을때도 유용하게 사용가능하며
@JsonNaming과 함께 사용하기 좋다