스프링부트가 제공하는 어노테이션을 사용하면 쉽게 데이터에 대한 유효성 검사를 할 수 있다.
유효성 검사?
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
[Java] 정규표현식(Regular Expression) : 자주 쓰는 정규식 정리(휴대전화, 이메일, 비밀번호 등)
정규표현식은 쓸 때마다 헷갈려서.. 매번 검색하는 것도 성가시니 이번 기회에 정리를 하고 넘어가야겠다. 정규표현식 정리 표현식 설명 ^ 문자열의 시작 $ 문자열의 종료 . 임의의 한 문자 (문자
moonong.tistory.com
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
[Spring] @Valid @Validated
Spring에서는 객체의 유효성 검증을 위해 @Valid와 @Validated라는 두 가지 어노테이션을 제공합니다. 이들은 어떤 차이점이 있고 어떻게 사용하는지 알아보겠습니다. 1. @Valid @Valid는 JSR-303 표준 스펙
velog.io
[스프링부트] Spring Boot의 Validation : @Valid 어노테이션으로 유효성 검증하기
스프링부트가 제공하는 어노테이션을 사용하면 쉽게 데이터에 대한 유효성 검증을 할 수 있는데, 그 방법을 기록해두려고 한다.유효성 검증이란?데이터 필드가 정의한 스펙에 대해 올바른 값인
velog.io
https://victorydntmd.tistory.com/332
[SpringBoot] @Valid로 유효성 검사하기
유효성 검사 유효성 검사란, 요청한 데이터가 어떤 조건에 충족하는지 확인하는 작업입니다. 예를 들어, 회원가입을 할 때 이메일을 입력하는 란이 있다고 가정하겠습니다. 이메일 주소는 흔히
victorydntmd.tistory.com
https://medium.com/sjk5766/valid-vs-validated-%EC%A0%95%EB%A6%AC-5665043cd64b
@Valid vs @Validated 정리
아래 결론부터 정리하고 내용을 보도록 하겠다.
medium.com
'프레임워크 > 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 |