반응형
스프링부트가 제공하는 어노테이션을 사용하면 쉽게 데이터에 대한 유효성 검사를 할 수 있다.
유효성 검사?
FE에서 입력받은 값이 있는지(null)
형식(이메일, … 등 )에 맞는지
숫자를 받아야 하는데 문자를 주진 않았는지
라이브러리 추가
build.gradle의 dependencies에 아래와 같이 추가해준다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
제약조건 종류
null 체크
@NotNull
: 해당 필드에 null값을 불허한다.@NotEmpty
: 해당 필드에 null, ""을 불허한다.@NotBlank
: 해당 필드에 null, "", " " 을 불허한다. 즉 최소 1글자
@NotBlank(message = "아이디를 입력해주세요.")
String userId;
범위 체크
@Min
: 해당 필드의 최소값을 벗어나는지 검사한다. (숫자 값에만 적용)@Max
: 해당 필드의 최대값을 벗어나는지 검사한다. (숫자 값에만 적용)
@Max(value = 100, message = "나이는 100 이하여야 합니다.")
int age;
형식 체크
@Email
: 해당 필드가 이메일 형식을 가지도록 검사한 .
@Email(message = "이메일 형식에 맞지 않습니다.")
String email;
@Pattern
: 정규표현식을 사용해 해당 필드가 특정 형태를 가지도록 검사한다.
정규표현식 참고 >> http://moonong.tistory.com/31
ex. 비밀번호
@Pattern(regexp = "\t^.*(?=^.{8,15}$)(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&+=]).*$", message = "숫자, 문자, 특수문자 포함 8~15자리 이내여야 합니다.")
String pw;
ex. 전화번호
@Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message = "전화번호 형식에 맞지 않습니다.")
String contact;
길이 체크
@Size
: 문자열의 최소, 최대 크기를 검사한다.
ex.@Size(min=10, max=100)
과 같이 사용할 수 있으며, 기본값은 min=0, max=정수형의 최대값이다.
@Size(min = 1, max = 20, message = "상품명은 1~20 글자여야 합니다.")
String productName;
유효성 검사 & 예외 처리 적용
파라미터 부분에 Valid 어노테이션을 적는다.
@PostMapping("/join")
public ApiUtils.ApiResult<String> join(@Valid @RequestBody MemberDTO memberDto, Errors errors) {
if (errors.hasErrors()) {
String result = "[유효성 검사 실패]";
Map<String, String> validatorResult = new HashMap<>();
for (FieldError error : errors.getFieldErrors()) {
String validKeyName = error.getField();
validatorResult.put(validKeyName, error.getDefaultMessage());
}
return error(result + validatorResult, HttpStatus.BAD_REQUEST);
}
if (isDuplicateId(memberDto)) {
return error("아이디 중복", HttpStatus.CONFLICT);
}
Member requestMember = memberDto.convertToEntity();
String userId = memberService.join(requestMember);
return success(userId);
}
@Valid 와 @Validated 차이
@Valid
- @Valid는 JSR-303 표준 스펙으로, 빈 검증기를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션
- @Valid는 컨트롤러의 메소드 파라미터에 적용할 수 있다.
- 유효성 검사에 실패하면 MethodArgumentNotValidException 예외가 발생한다.
- @Valid는 Controller에서 직접적으로 유효성 검증을 처리합니다.
- 메소드 파라미터에 @Valid 어노테이션을 붙여 검증을 수행합니다.
@Validated
- @Validated는 Spring에서 제공하는 어노테이션
- @Valid의 기능을 포함하고 추가적으로 그룹화된 유효성 검증을 지원
그룹화된 유효성 검증?
객체의 필드에 그룹을 지정하고, 컨트롤러의 메소드에서 해당 그룹만 유효성 검사를 수행하도록 하는 기능
ex. 회원가입과 로그인에서 사용하는 UserDto 클래스가 있다면, 회원가입 시에는 모든 필드를 검증해야 하지만,
로그인 시에는 아이디와 비밀번호만 검증하면 된다.
이런 경우에 그룹화된 유효성 검증을 사용할 수 있다.
- 빈으로 등록되어 있는 클래스에 붙어 검증을 수행한다.
참고
https://velog.io/@yoonuk/Spring-Valid-Validated
https://victorydntmd.tistory.com/332
https://medium.com/sjk5766/valid-vs-validated-%EC%A0%95%EB%A6%AC-5665043cd64b
반응형
'프레임워크 > Spring Boot' 카테고리의 다른 글
[Spring Boot] 멀티 모듈 프로젝트에 BeanDefinitionOverrideException 에러 해결 (0) | 2024.06.19 |
---|---|
[Spring Boot] ExceptionResolver으로 예외 처리하기 (0) | 2024.05.21 |
[Spring] DO(Entity), DTO (0) | 2024.05.16 |
[Spring Boot] HttpMediaTypeNotAcceptableException 에러 해결 (0) | 2024.05.14 |
[Spring Boot] @JsonNaming, @JsonProperty (0) | 2024.05.13 |