Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- API
- spring
- 빌드자동화도구
- 무중단배포
- controller
- 시계열디비
- 롬북
- aws
- 정보처리기사
- Java8
- 알고리즘
- Groovy문법
- 프로그래머스
- 생성자
- CICD
- 빌드스크립트
- 정보처리기사필기
- PULL방식아키텍쳐
- Docker
- 완전탐색알고리즘
- 정처기
- 서버
- java
- 정처기공부
- 롬복
- 자바
- 정처기필기
- 롬복사용시주의할점
- git
- 어노테이션
Archives
- Today
- Total
우당탕탕 개발일지
[Spring Boot] @Valid 애노테이션 사용하여 검증하기 본문
@Valid
JSR-303 표준 스펙(자바 진영 스펙)으로서 빈 검증기(Bean Validator)를 이용해 객체의 제약 조건을 검증하도록 지시하는 애노테이션이다. 객체의 필드에 달린 애노테이션으로 편리하게 유효성검사를 제공한다.
Spring Boot에서는 아래의 의존성만 추가해주면 @Valid 기능을 사용할 수 있다.
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation'
Service에서 검증로직을 작성하여 확인할 수 있지만, DTO 또는 객체를 검증해야할 때 별도로 검증 클래스를 만들어 사용하는 것이 아니라 @Valid 애노테이션을 사용하여 간단하게 검증할 수 있다.
🔍 java.validation 애노테이션 종류
Anotation | 제약조건 |
@NotNull | Null 불가 |
@Null | Null만 입력 가능 |
@NotEmpty | Null, 빈 문자열 불가 |
@NotBlank | Null, 빈 문자열, 스페이스만 있는 문자열 불가 |
@Size(min=,max=) | 문자열, 배열등의 크기가 만족하는가? |
@Pattern(regex=) | 정규식을 만족하는가? |
@Max(숫자) | 지정 값 이하인가? |
@Min(숫자) | 지정 값 이상인가 |
@Future | 현재 보다 미래인가? |
@Past | 현재 보다 과거인가? |
@Positive | 양수만 가능 |
@PositiveOrZero | 양수와 0만 가능 |
@Negative | 음수만 가능 |
@NegativeOrZero | 음수와 0만 가능 |
이메일 형식만 가능 | |
@Digits(integer=, fraction = ) | 대상 수가 지정된 정수와 소수 자리 수 보다 작은가? |
@DecimalMax(value=) | 지정된 값(실수) 이하인가? |
@DecimalMin(value=) | 지정된 값(실수) 이상인가? |
@AssertFalse | false 인가? |
@AssertTrue | true 인가? |
@Valid / @ControllerAdvice를 이용한 Exception 처리
❓ @ControllerAdvice 란
@Controller 전역에서 발생할 수 있는 예외를 잡아 처리해주는 애노테이션
1. UserJoinController 👉 회원가입 API
Valid 를 사용할 DTO 앞에 @Valid 애노테이션을 달아준다.
@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
@Slf4j
public class UserRestController {
private final UserService userService;
@ApiOperation(
value = "회원가입"
, notes = "userName, password -> 회원가입")
@PostMapping("/join")
public Response<UserJoinResponse> join(@RequestBody @Valid UserJoinRequest userJoinRequest){
log.debug("userName : {} password : {} ", userJoinRequest.getUserName(), userJoinRequest.getPassword());
UserJoinResponse userJoinResponse = userService.join(userJoinRequest.getUserName(), userJoinRequest.getPassword());
log.debug("userJoinResponse : {} ", userJoinResponse);
return Response.success(userJoinResponse);
}
}
2. ErrorResponse 클래스로 API에 응답해줄 에러 형태를 정한다.
@Getter
@AllArgsConstructor
public class ErrorResponse {
public ErrorCode errorCode;
public String message;
}
3. enum 클래스에 에러코드 정의
@AllArgsConstructor
@Getter
public enum ErrorCode {
//...
;
private final HttpStatus status;
private final String message;
}
4. UserJoinRequest 클래스
사용할 @Valid 애노테이션을 컬럼에 달아준다.
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Data
public class UserJoinRequest {
@NotNull(message = "userName은 필수 입력값입니다.")
private String userName;
@NotNull(message = "password는 필수 입력값입니다.")
private String password;
}
5. RestControllerAdvice(ControllerAdvice)
@Valid 유효성 체크에 통과하지 못하면 MethodArgumentNotVaildException 이 발생한다.
애노테이션에 적어두었던 메시지가 에러 메시지로 반환된다.
@RestControllerAdvice
public class ExceptionController {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> MethodArgumentNotValidExceptionHandler(
MethodArgumentNotValidException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(Response.error(new ErrorResponse(ErrorCode.INVALID_REQUEST,
e.getBindingResult().getAllErrors().get(0).getDefaultMessage())));
}
}
'Spring' 카테고리의 다른 글
[Spring] @Transactional(트랜잭션) 애노테이션 정리 (0) | 2023.01.12 |
---|---|
[Spring] 🔒 Spring Security - CoustomAuthenticationEntryPoint 코드 작성 (0) | 2023.01.09 |
[Spring] 🔒 스프링 시큐리티(Spring Security) 란? (0) | 2023.01.03 |
[Spring] @ControllerAdvice / @RestControllerAdvice 란? (0) | 2023.01.01 |
[JPA] Pageable이란? (0) | 2022.12.25 |