유효성 검사
유효성 검사란,
한 문장으로 정의하자면 "데이터가 요구하는 형식(or 양식)에 맞는지 체크하는 검사를 뜻 한다."
가령, 회원가입 시 ID를 이메일로 가입할 경우 사용자가 작성한 값이 이메일 형식인지 아닌지 체크하는 것이다.
사용자가 vaild@naver.com으로 요청하면 상관없지만 "@" 없이 요상한 데이터로 요청한다면 걸러내서 가입을 못 하게 해야 한다. (당연히🥕 해당 이메일이 진짜 있는지 없는지 여부까지는 체크하지 않음!! JUST 형식 여부만 첵! 첵!)
그럼! 유효성 검사는 언제 할까?!
프론트와 백엔드 모두 검사를 해야 한다
WHY?라고 반문하면 아~주 디테일하게 대답할 수 없지만...
두 번 검사를 하니깐 안전하고... 확실하고.. 안전하니깐 보안에 좋을 것 같고... 등등 다양한 장점이 있겠지?
@Vaild Annotation을 공부하는 중 어떤 블로그에서는 "프론트에서 JS로 유효성 검사를 하는 이유는 사용자에게 알려주기 위한 UX 측면이 강합니다."라고 말씀하셨다.(어떤 블로그 주소는 아래 참조)
Spring Boot에서 유효성 검사 예제
프로젝트 구성
- Spring Boot(version '2.3.2.RELEASE')
- gradle
Dependencies 추가
spring-boot-starter-web을 포함하고 있다면 Validation Starter도 포함되어 있어 따로 Dependency를 추가할 필요 없다고 한다.
하지만, 난 분명 spring-boot-starter-web가 있는데 자동으로 포함되지 않아 아래 Dependency를 추가했다.
(다들 Dependency 추가 없이 잘만 사용하는데 왜 난 안되냐... 한참 찾았는데도 왜 그런지 모르겠다. 증말!😠😠)
implementation('org.springframework.boot:spring-boot-starter-validation')
TestDto
import javax.validation.constraints.Email;
@Setter
@Getter
public class TestDto {
@Email(message = "이메일 형식이 아닙니다.")
private String email;
}
TestDto는 클라이언트(프론트)에서 요청한 데이터(값)을 받아 Controller에서 Service로 계층끼리 데이터 전달 역할을 한다. 유효성검사는 클라이언트(프론트)에서 요청한 데이터가 TestDto에 담길 때 올바른 데이터인지 검사하면 된다.
👉 @Setter, @Getter
- 유효성 검사와 상관없는 lombok 어노테이션이다.
👉 @Email(message = "이메일 형식이 아닙니다.")
- 데이터가 담기는 변수에 원하는 유효성 검사 어노테이션을 붙이면 설정이 완료된다.
- "@Email"은 이메일 형식인지 검사하는 어노테이션이다.
- 그리고 message를 설정해서 유효성 검사 시 적합한 형식이 아닌 경우 출력하는 메시지를 설정할 수 있다.
Controller
import javax.validation.Valid;
@GetMapping(value="/connect")
@ApiOperation(value="requestConnect", tags="Matching")
public void requestConnect(@Valid TestDto testDto, Errors errors) {
if(errors.hasErrors()) {
System.out.println("===hasErrors===" + errors.hasErrors());
System.out.println("===getFieldErrors===" + errors.getFieldErrors());
for(FieldError value : errors.getFieldErrors()) {
System.out.println("===defaultMessage===" + value.getDefaultMessage());
}
}
}
👉 @GetMapping(value="/connect")
- 클라이언트(프론트)에서 "/connect" URL경에 Get방식으로 요청한 경우 해당 메소드로 연결하기 위한 맵핑 어노테이션
👉 @ApiOperation(value="requestConnect", tags="Matching")
- 유효성 검사와 상관없는 Swagger 적용하기 위한 어노테이션
👉 @Valid TestDto testDto
- "@Valid"어노테이션을 TestDto앞에 붙여 유효성검사 객체를 설정한다.
- 이제 클라이언트가(프론트)에서 해당 메서드로 데이터를 전달할 경우 TestDto객체를 검사해서 설정된 유효성을 검사한다.
👉 if(errors.hasErrors()) { .. }
- 유효성 검사에 실패할 경우 errors.hasErrors()는 true가 뜬다.
- 그럼 if문에 있는 코드가 실행될 것이다.
👉 System.out.println("===getFieldErrors===" + errors.getFieldErrors());
- 에러 정보를 자세히 출력한다. 주의할 점은 배열로 출력된다.
- 유효성 검사에서 실패한 필드의 message정보를 여기서 확인 가능하다.
👉 for(FieldError value : errors.getFieldErrors()) { .. }
- 유효성 검사에 실패한 필드의 message정보만 따로 출력하기 위해 getFieldErrors를 반복문으로 돌려 출력한다.
- System.out.println("===defaultMessage===" + value.getDefaultMessage())에서 실패한 필드의 message정보가 출력
- 이번 예제에는 "이메일 형식이 아닙니다."가 출력된다.
Annotation 종류
- @AssertFalse : false 값만 통과 가능
- @AssertTrue : true 값만 통과 가능
- @DecimalMax(value=) : 지정된 값 이하의 실수만 통과 가능
- @DecimalMin(value=) : 지정된 값 이상의 실수만 통과 가능
- @Digits(integer=,fraction=) : 대상 수가 지정된 정수와 소수 자릿수보다 적을 경우 통과 가능
- @Future : 대상 날짜가 현재보다 미래일 경우만 통과 가능
- @Past : 대상 날짜가 현재보다 과거일 경우만 통과 가능
- @Max(value) : 지정된 값보다 아래일 경우만 통과 가능
- @Min(value) : 지정된 값보다 이상일 경우만 통과 가능
- @NotNull : null 값이 아닐 경우만 통과 가능
- @Null : null일 겨우만 통과 가능
- @Pattern(regex=, flag=) : 해당 정규식을 만족할 경우만 통과 가능
- @Size(min=, max=) : 문자열 또는 배열이 지정된 값 사이일 경우 통과 가능
- @Valid : 대상 객체의 확인 조건을 만족할 경우 통과 가능
(출처: https://mycup.tistory.com/154 [IT.FARMER])
Referenct
https://bamdule.tistory.com/35
https://mycup.tistory.com/154
https://victorydntmd.tistory.com/332
'개발노트 > Spring' 카테고리의 다른 글
[디자인 패턴] Singleton Pattern (0) | 2022.03.27 |
---|---|
[Spring Boot] Jackson 기본 개념과 LocalDateTime변환 이슈 (0) | 2022.03.21 |
[디자인 패턴] Observer Pattern (0) | 2022.03.13 |
[Spring Boot] Rest API 에 Spring Security Form 로그인 적용하기 (4) | 2021.12.27 |
[Spring Boot] 파일 다운로드 - 서버에서 다운 (1) | 2021.08.16 |
개발 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!