유효성 검사 ( Validation )
: 사용자가 입력한 데이터가 허용된 형태인지 검사하는 과정
spring-boot-starter-validation
Jakarta Bean Validation
- 유효성 검증을 위한 기술 명세
- 어떤 항목이 어떤 규칙을 지켜야 하는지를 표시하는 기준
Hibernate Validation
- Jakarta Bean Validation를 토대로 실제로 검증해주는 프레임워크
@NotBlank
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class UserDto {
private Long id;
@NotBlank // 비어있지 않다.
private String username;
private String email;
private String phone;
}
@NotBlank로 인해 Postman에서 username 값을 공백으로 보낼 시 에러가 뜬다.
@Data
public class UserDto {
private Long id;
@NotBlank // 비어있지 않다.
private String username;
@Email // 형식이 이메일이어야
private String email;
private String phone;
}
@대신 _을 넣을 시 400 에러 , email 형식이 아니라면 에러를 띄운다.
@NotNull
@Data
public class UserDto {
private Long id;
@NotBlank // 비어있지 않다.
private String username;
@Email // 형식이 이메일이어야
private String email;
@NotNull // null이 아니다.
private String phone;
}
@NotBlank와 달리 공백도 들어간다. ( " ", "" ) 위 사진처럼 아예 값을 지워야 400 에러를 띄운다.
예외 처리 메세지
@Data
public class UserDto {
private Long id;
@NotBlank // 비어있지 않다.
@Size(min = 8, message = "최소 8글자여야 합니다.")
private String username;
@Email // 형식이 이메일이어야
private String email;
@NotNull // null이 아니다.
private String phone;
@Min(value = 14, message = "14세 미만은 부모님의 동의가 필요합니다.") // 최솟값
private Integer age;
@Future(message = "미래의 시간까지 우효해야 합니다.")// 미래의 시간만
private LocalDate validUntil;
@NotNull // notNullString이 널이 아닌지만 검증
private String notNullString;
@NotEmpty // notEmptyString이 길이가 0이 아닌지만 검증
private String notEmptyString;
@NotBlank //notBlankString이 공백 문자로만 이루어지지 않았는지 검증
private String notBlankString;
}
age 부분을 보면 Dto에서 지정해준 message의 문구가 나와있는 것을 볼 수 있다.
Controller
import com.example.validation.dto.UserDto;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
public class UserController {
@PostMapping("/users")
// ResponseDto 대신 Map을 열심히 사용할 예정입니다.
public ResponseEntity<Map<String, String>> addUser(
// @Valid : UserDto가 우리가 정의한 요구사항을 지키고 있는지 유효성 검사
@Valid @RequestBody UserDto dto
){
log.info(dto.toString());
Map<String, String> responseBody = new HashMap<>();
responseBody.put("message","success!");
return ResponseEntity.ok(responseBody);
}
}
예외처리 (Controller)
// 예외처리
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String>handleValidationException(
MethodArgumentNotValidException exception
){
Map<String, String> errors = new HashMap<>();
for(FieldError error : exception.getBindingResult().getFieldErrors()){
errors.put(error.getField(), error.getDefaultMessage());
}
return errors;
}
'study' 카테고리의 다른 글
WebSocket (0) | 2024.09.03 |
---|---|
(230627) AOP (0) | 2024.09.03 |
(230623) [Postman] MultipartFile (0) | 2024.09.03 |
(230614) JPA (0) | 2024.09.03 |
(230613) Stack, DFS / MyBatis 설정 (0) | 2024.09.03 |