티스토리 뷰

게시판 만들기 요구사항을 보면 서버 측 유효성 검증 조건이 있었다.

작성자 3~4자, 비밀번호 4~15자(영문/숫자/특수문자 포함), 제목 4~99자, 내용 4~1999자, 카테고리 필수

 

어떻게 유효성 검증을하지?

Spring이 제공하는 spring-boot-starter-validation을 쓰면, DTO 필드 위에 애노테이션만 붙여서 검증 규칙을 선언할 수 있다.

// build.gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'

gradle에 넣고 싱크 돌려주면 사용이 가능하다!

 

어떻게 사용하지?

다양한 어노테이션을 지원하는데 대표적으로 @Size, @Pattern, @Min, @Max, @Email 등이 있다

 

// BoardCreateRequest.java
public record BoardCreateRequest(
    @NotNull(message = "카테고리는 필수입니다.")
    Integer categoryId,

    @NotBlank(message = "제목은 필수입니다.")
    @Size(min = 4, max = 99, message = "제목은 4자 이상 100자 미만이어야 합니다.")
    String title,

    @NotBlank(message = "작성자는 필수입니다.")
    @Size(min = 3, max = 4, message = "작성자는 3자 이상 5자 미만이어야 합니다.")
    String writer,

    @NotBlank(message = "내용은 필수입니다.")
    @Size(min = 4, max = 1999, message = "내용은 4자 이상 2000자 미만이어야 합니다.")
    String content,

    @NotBlank(message = "비밀번호는 필수입니다.")
    @Size(min = 4, max = 15, message = "비밀번호는 4자 이상 16자 미만이어야 합니다.")
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[^A-Za-z0-9]).+$", message = "비밀번호는 영문/숫자/특수문자를 모두 포함해야 합니다.")
    String password
) {}

 

@Size는 글자 수 범위, @Pattern은 정규식으로 영문/숫자/특수문자 포함 여부를 검사한다

 

여기서 주의깊게 봐야할 점은 왜 @NotNull이 아니라 @NotBlank를 썼을까?

작성자, 제목, 내용, 비밀번호는 전부 사용자가 실제로 뭔가 타이핑했는지를 확인해야 하는 필드다 만약 @NotNull만 썼다면, 사용자가 제목란에 스페이스바만 몇 번 누르고 제출해도 유효한 제목으로 통과해버렸을 것. 그래서 진짜 내용이 있는지까지 확인하는 @NotBlank를 사용했다.

 

정리하면 이렇다

@NotNull < @NotEmpty < @NotBlank (뒤로 갈수록 더 깐깐해짐)

입력값 @NotNull @NotEmpty @NotBlank
null ❌ 실패 ❌ 실패 ❌ 실패
""(빈 문자열) ✅ 통과 ❌ 실패 ❌ 실패
" "(공백) ✅ 통과 ✅ 통과 ❌ 실패
"문자" ✅ 통과 ✅ 통과 ✅ 통과

 

 

DTO에 애노테이션을 아무리 붙여도, Controller에서 @Valid를 안 붙이면 검증이 실행되지 않는다.

//BoardController
@PostMapping("/api/boards")
public BoardResponse createBoard(@Valid @RequestBody BoardCreateRequest request) {
  return boardService.createBoard(request);
}

검증에 실패하면 스프링이 자동으로 400 Bad Request를 응답해준다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함