내배캠 주요 학습/Spring 숙련
중요한 Validation, 예외처리
chaeyoung-
2023. 6. 20. 13:15
회원가입에 Validation 적용하기
2023.06.20 - [내배캠 주요 학습/Spring 심화] - Validation, 회원가입 데이터에 적용하기
1. build.gradle에 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
@NotBlank
@Positive(message = "양수만 가능합니다.")
@Negative(message = "음수만 가능합니다.")
@Size(min=2, max=10)
@Max(10)
@Min(2)
@NotNull | null 불가 |
@NotEmpty | null, ""불가 |
@NotBlank | null, "", " " 불가 |
@Size | 문자 길이 측정 |
@Max | 최대값 |
@Min | 최소값 |
@Positive | 양수 |
@Negative | 음수 |
E-mail 형식 | |
@Pattern | 정규 표현식 |
2.
Code:
[dto] - ProductRequestDto.java
package com.sparta.springauth.dto;
import jakarta.validation.constraints.*;
import lombok.Getter;
@Getter
public class ProductRequestDto {
@NotBlank
private String name;
@Email
private String email;
@Positive(message = "양수만 가능합니다.")
private int price;
@Negative(message = "음수만 가능합니다.")
private int discount;
@Size(min=2, max=10)
private String link;
@Max(10)
private int max;
@Min(2)
private int min;
}
[controller] - ProductController.java 맨 아래에 메서드 추가
@PostMapping("/validation")
@ResponseBody
public ProductRequestDto testValid(@RequestBody @Valid ProductRequestDto requestDto) {
return requestDto;
}
ProductRequestDto에 필드에 Bean Validation 어노테이션을 기재했다고 적용이 되는것이 아니다.
Controller 메서드의 파라미터에
@Valid ProductRequestDto requestDto
라고 기재해야 적용이 된다.
이는, Validation을 실행시키고자 하는 Dto 타입 앞에 @Valid 기재하여 Spring에게 예외처리를 할 것이라고 고지하는 것이다.
Postman 활용
- 여기에는 Cookie가 없으므로 복사해와야 함.
1) send 버튼 아래 Cookies에 들어가서 "localhost"를 입력 후 add domain
2) Add cookie를 해서 value부분에 복사한 값을 붙혀넣기
3) name부분는 Authorization 입력 후 save
왼쪽 사진은 오류 , 오른쪽 사진은 정상 작동됨
요청 데이터에서 notnull로 Validation되어 있는 name에 값을 빼고 보내봤다.
거부당하며 서버에 오류가 떴다.
아래와 같이 서버에 오류 메시지가 보인다.
Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.sparta.springauth.dto.ProductRequestDto com.sparta.springauth.controller.ProductController.testValid(com.sparta.springauth.dto.ProductRequestDto): [Field error in object 'productRequestDto' on field 'name': rejected value []; codes [NotBlank.productRequestDto.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [productRequestDto.name,name]; arguments []; default message [name]]; default message [공백일 수 없습니다]] ]