유효성 검사(Validation)란?
사용자가 폼 페이지에서 입력한 데이터 값이 서버로 전송되기 전에 규칙에 맞게 입력되었는지 검증하는 것.
검증이 필요한 이유는?
보안 공격, 잘못된 데이터, 사용자의 실수로 누락되거나 오류를 방지할 수 있다.
검사는 어디서 할까?
서버와 화면 중 어디서 유효성 검사를 해야할까? 정답부터 말하면 둘 다 필요하다.
프론트단에서만 검사를 하면 프론트는 강제로 값을 넣을 수 있다. 프론트단에서 검사를 하고 서버에서도 검사를 하고
데이터를 DB에 저장을 해야 안전하게 올바른 데이터를 저장할 수 있다.
이번 게시글은 서버에서 유효성 검사를 하는 @Valid 어노테이션에 대해서 알아보자.
@Valid
어노테이션 종류
더보기
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 인가? |
Spring Boot Dependency
더보기
implementation 'org.springframework.boot:spring-boot-starter-validation'
상품등록 예시로 살펴보자.
VO
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
@Data
public class Item {
private Long id;
@NotEmpty(message = "itemName은 필수 값입니다.")
private String itemName;
@Max(value = 10000, message = "만원 이하만 가능합니다.")
private Integer price;
private Integer quantity;
public Item() {
}
public Item(String itemName, Integer price, Integer quantity) {
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
}
여러 어노테이션이 있지만 필자는 @NotEmpty 와 @Max를 이용했다.위치는 멤버 변수 상단에 어노테이션을 입력한다.
옆에 message는 에러가 발생하면 넘어오는 message이다. Controller에서 값을 출력 할 수 있다.
Controller
@PostMapping("/add")
public ResponseEntity addItemV6(@Valid Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes){
if(bindingResult.hasErrors()){
List<ObjectError> errorList = bindingResult.getAllErrors();
for (ObjectError objectError : errorList) {
System.out.println("error=="+objectError.getDefaultMessage());
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(bindingResult.getAllErrors());
}
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemdId", savedItem.getId());
redirectAttributes.addAttribute("status",true);
return ResponseEntity.ok(item);
}
1.Controller에서는 vo옆에 @valid 어노테이션을 추가한다.
2. 컨트롤러 메소드 파라미터로 BindingResult 타입 변수를 추가한다.
3. bindingResult를 이용하여 위와 같이 에러메시지를 가져올 수 있다.
예시)
의도적으로 itemName에는 null을 담고, price에서는1111111을 입력했다.
콘솔창
error==Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'price'; nested exception is java.lang.NumberFormatException: For input string: "1111111111111"
error==itemName은 필수 값입니다.
참고
'Programming > Back-end Language' 카테고리의 다른 글
트랜잭션 (0) | 2024.04.19 |
---|---|
[Spring] WebClient 란? (0) | 2022.08.29 |
[JAVA] Comparable, Comparator이란? (0) | 2022.05.26 |
[JAVA] BufferedReader와 StringTokenizer 사용법 (0) | 2022.05.09 |
[JAVA] ConcurrentModificationException 오류 원인 및 해결 방법 (0) | 2022.05.02 |