본문 바로가기
프로젝트/토이 프로젝트) 오늘도 휴일

NullCheck 를 @Valid 로 손쉽게 ^__^

by 휴일이 2023. 6. 22.

 

Validation 라이브러리가 제공하는 애노테이션들을 사용하면

일일히 널체크 코드를 쓰지 않아도 자동 널체크를 해준다고 한다!

이런 방법이 있는 걸 안 이상 사용해보지 않을 수 없지 ! !

 

 

 

@Data
public class CommentWriteDto {

    @NotNull
    private Long boardNum;
    // 부모 댓글 번호
    @NotNull
    private Long commentNum;
    @NotBlank
    private String content;
}

일단 DTO 에 널을 받지 않는 변수들에 @NotNull @NotBlank 등의 애노테이션을 넣어준다

@NotBlank 는 널 뿐만 아니라 공백도 체크해주기 때문에 String 에서 자주 이용한다

 

 

 

@PostMapping("/write")
    public ResponseEntity<String> write(
    	@RequestBody @Valid CommentWriteDto commentWriteDto, HttpServletRequest request) {

이렇게 내가 NullCheck를 하고 싶은 객체 앞에 Valid 를 붙여준다

그러면 스프링이 변수에 붙어있는 애노테이션대로 검증해준다

-> NullCheck 코드는 과감히 삭제했다 !

 

근데! 우리가 널체크한 다음 널일 경우 특정한 작업

(예를 들어 400에러와 특정 메세지 리턴)

해주고 싶다면 어떻게 해야할까???

 

@Valid 가 실패할 경우

MethodArgumentNotValidException 예외가 생기는데

이 예외를 잡는 핸들러 컨트롤러를 만들면 된다!

 

 

 

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public Map<String, Object> invalidRequestHnadler(MethodArgumentNotValidException e) {
        Map<String, Object> result = new HashMap<>();
        Map<String, Object> invalid = new HashMap<>();

        result.put("code", 400);
        result.put("message", e.getMessage());

        for (FieldError erros : e.getFieldErrors()) {
            invalid.put(erros.getField(), erros.getDefaultMessage());
        }

        result.put("validation", invalid);

        return result;
    }

나는 해당 예외를 잡아 400 에러코드와 예외가 주는 메세지들을 보여줄 것이다.

 

보통은 ResponseBody를 리턴해주지만 일단은 예시니까 Map으로 설명하겠음!

 

@ResponseStatus 로 어떤 에러를 리턴할지 정해주고

@ExceptionHandler 로 어떤 예외 클래스를 잡을지 정해준다

그 다음엔 그냥 평소 예외 잡기처럼 내가 잡을 예외 클래스를 매개변수로 받고

필요한 로직을 넣으면 된다

 

해당 예외는 에러 메세지가 하나만 있는 게 아니라 여러개 있을 수 있어서

(여러 데이터가 널이나 공백으로 수 있으니까)

for 반복문으로 예외를 하나씩 넣어준당 ! !

 

 

 

그러면 결과가 어떻게 오냐면

 

 

이런 식으로 온다..!!! ㅎㅎ

넣은 에러코드와 메세지 등이 잘 오는 것을 볼 수 있당 ㅎㅎ

728x90