유효성 검사 (PostMapping) (+@Valid)

coding S's avatar
Apr 19, 2024
유효성 검사 (PostMapping) (+@Valid)

[ PostMapping일 때 유효성 검사가 실행 ]

바디가 있어야지만 유효성 검사가 가능한데, Post일 때 바디 데이터가 있기 때문에 유효성 검사가 Post때만 작동하게 해보자
package shop.mtcoding.blog._core.errors; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect // AOP 등록 @Component //IoC 등록 public class MyValidationHandler { // Advice (부가 로직 hello 메서드) // Advice가 수행될 위치 === PointCut @Before("@annotation(org.springframework.web.bind.annotation.PostMapping)") // <이걸 바로 PointCut 이라고 함 public void hello(JoinPoint jp) { Object[] args = jp.getArgs(); //파라미터 (매개변수) System.out.println("크기 : " + args.length); for (Object arg : args) { System.out.println("매개변수 : " + arg); } System.out.println("MyValidationHandler : hello_______________"); } }
💡
Post맨으로 확인 해보자
 

[ 컨트롤러 수정 ]

notion image
//기존 컨트롤러
notion image
//변경
@Valid를 붙이면 메서드 파라미터로 들어오는 객체에 대한 유효성 검사를 실행한다. @Valid와 함께 사용된 @RequestBody 어노테이션이 요청 본문(body)을 Java 객체로 변환하는 역할을 하고, @Valid가 이 객체에 선언된 제약 조건(예: @NotNull, @Size, @Email 등)에 따라 유효성 검사를 수행한다! 유효성 검사에 실패한 정보들은 Errors 객체에 다 담긴다. 이 객체를 컨트롤러 메서드의 파라미터로 추가함으로써, 유효성 검사 후의 오류들을 처리할 수 있다.
 

[ BoardRequest ] - 제약 조건 걸기

package shop.mtcoding.blog.board; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; import lombok.Data; import shop.mtcoding.blog.user.User; public class BoardRequest { @Data public static class SaveDTO { @Size(min = 1, max = 10, message = "제목은 10자를 초과할 수 없습니다") @NotEmpty(message = "제목은 공백일 수 없습니다") //null도 안되고, 공백만 있는 것도 안 된다 private String title; @NotEmpty private String content; // DTO를 클라이언트로 부터 받아서, PC에 전달하기 위해 사용 public Board toEntity(User user){ return Board.builder() .title(title) .content(content) .user(user) .build(); } } }
💡
saveDTO안에 @NotEmpty를 걸어준다. 리퀘스트 요청이 있을 때 자기 스스로 검사할 것!
 

[ 컨트롤러에 hasErrors 추가 ]

@PostMapping("/api/boards") public ResponseEntity<?> save(@Valid @RequestBody BoardRequest.SaveDTO reqDTO, Errors errors) { if (errors.hasErrors()) { for (FieldError error : errors.getFieldErrors()) { System.out.println(error.getField()); System.out.println(error.getDefaultMessage()); throw new Exception400(error.getDefaultMessage()+" : " +error.getField()); } } User sessionUser = (User) session.getAttribute("sessionUser"); BoardResponse.DTO respDTO = boardService.글쓰기(reqDTO, sessionUser); return ResponseEntity.ok(new ApiUtil(respDTO)); }
💡
errors.hasErrors() 메서드를 사용해 오류가 있는지 확인 유효성 검사에서 하나 이상의 오류가 발견되면 true를 반환 -> 오류가 있을 경우, 원하는 방식으로 클라이언트에 오류 정보를 응답 (여기서는 Exception400을 반환)
 

[ 포스트맨 요청 ]

notion image
notion image
💡
유효성 검사 작동 확인 !
notion image
 
Share article

codingb