티스토리 뷰
게시판 만들기 요구사항을 보면 서버 측 유효성 검증 조건이 있었다.
작성자 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를 응답해준다.
'게시판 만들기 > 4주차' 카테고리의 다른 글
| 만들자 게시판 4주차 (4) - 게시글과 첨부파일 연동하기 (0) | 2026.07.25 |
|---|---|
| 만들자 게시판 4주차 (3) - 게시글 검색/페이징/첨부파일 표시 구현 (1) | 2026.07.24 |
| 만들자 게시판 4주차 (1) - 첨부파일 삭제 API 구현 (0) | 2026.07.24 |
