
[ 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맨으로 확인 해보자
[ 컨트롤러 수정 ]

//기존 컨트롤러

//변경
@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을 반환)
[ 포스트맨 요청 ]


유효성 검사 작동 확인 !

Share article