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 반복문으로 예외를 하나씩 넣어준당 ! !
그러면 결과가 어떻게 오냐면
이런 식으로 온다..!!! ㅎㅎ
넣은 에러코드와 메세지 등이 잘 오는 것을 볼 수 있당 ㅎㅎ
'프로젝트 > 토이 프로젝트) 오늘도 휴일' 카테고리의 다른 글
Service 를 테스트해서 오류를 잡아내다! (0) | 2023.07.01 |
---|---|
보안을 위해 닉네임 대신 id 검증으로 코드를 리팩토링 하자! (0) | 2023.06.22 |
Spring Security ) Spring 3.0 에 맞춰 SecurityConfig 를 수정하자! (1) | 2023.06.14 |
좀 더 객체 지향에 걸맞게 메일 서비스를 수정해보자 ! (1) | 2023.06.13 |
토이 프로젝트 ) 휴일 팬사이트 "오늘도 휴일" : 사이트 소개 및 설명 (0) | 2023.05.26 |