study

(230626) Validation

hjkeeeem 2024. 9. 3. 01:46

유효성 검사 ( 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 값을 공백으로 보낼 시 에러가 뜬다.

 

 

@Email

@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