이번 게시물에서는 스프링에서 @Valid를 사용하여 검증하는 방법에 대해 소개합니다.
1. @Valid
@Valid 어노테이션은 JAVA 표준 스펙의 일부로, Bean Validation API(JSR 303/JSR 380)에 포함된 것으로 Spring Framework에서 제공하는 것이 아니라 JAVA Bean Validation API입니다.
이 어노테이션으로 객체의 필드나 메서드 파라미터에 대해 유효성 검사를 수행할 수 있게 해줍니다.
Spring에서는 @Valid를 사용해 DTO나 Entity 객체에 대해 유효성 검사를 진행하는 코드를 자주 보셨을 겁니다.
유효성 검사란?
애플리케이션에서 사용자의 입력이 올바른 형식이나 규칙을 따르는지 확인하는 과정입니다.
예를 들어, 사용자가 입력한 이메일 주소가 올바른 형식인지, 비밀번호에 숫자와 알파벳 등등이 충족되는지
2. 언제 어떻게 사용하는가
// Gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
// Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
우선, build.gradle 혹은 maven일 경우 위와 같이 의존성을 추가해주셔야 합니다.
<언제>
@Valid는 주로 RequestBody를 검증할 때 많이 사용됩니다.
@RequestBody UserDto.Request 로 넘어올 dto 객체에 대해 @Valid를 붙이면 해당 dto 객체에 대한 유효성 검사를 실시하게 됩니다.
<어떻게>
DTO는 데이터를 주고 받기 위한 객체이죠? 요청과 응답에 해당하는 데이터를 전달하는 데 사용됩니다.
보통 이 DTO 클래스에서 유효성 검사 규칙을 정의하곤 합니다.
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Request {
private Long id;
@Pattern(regexp = "^[ㄱ-ㅎ가-힣a-z0-9-_]{3,20}$", message = "이름은 특수문자를 제외한 3~20자리여야 합니다.")
@NotBlank(message = "아이디는 필수 입력 값입니다.")
private String username;
@Pattern(regexp = "(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\\W)(?=\\S+$).{8,16}", message = "비밀번호는 8~16자 영문 대 소문자, 숫자, 특수문자를 사용하세요.")
@NotBlank(message = "비밀번호는 필수 입력 값입니다.")
private String password;
@Pattern(regexp = "^[ㄱ-ㅎ가-힣a-zA-Z0-9-_]{2,10}$", message = "닉네임은 특수문자를 제외한 2~10자리여야 합니다.")
@NotBlank(message = "닉네임은 필수 입력 값입니다.")
private String nickname;
@Pattern(regexp = "^(?:\\w+\\.?)*\\w+@(?:\\w+\\.)+\\w+$", message = "이메일 형식이 올바르지 않습니다.")
@NotBlank(message = "이메일은 필수 입력 값입니다.")
private String email;
private Role role;
public User toEntity() {
User user = User.builder()
.id(id)
.username(username)
.password(password)
.nickname(nickname)
.email(email)
.role(role.USER)
.build();
return user;
}
}
몇 가지 어노테이션을 설명하면
@Pattern : 정규식을 사용하여 문자열의 형식을 검사합니다.
@NotBlank : 값이 null이거나공백일 경우 유효성 검사 실패로 처리합니다.
@NotNull : 값이 null이 아니어야 한다는 제약을 걸 때 사용합니다.
@Size(min, max) : 문자열이나 컬렉션의 크기를 지정합니다.
@Email: 유효한 이메일 형식이어야 함을 검증합니다.
위처럼 검사 규칙을 규명해주고 나면 그 결과에 따라 적절한 처리가 필요하겠죠?
예를 들어, 유효성 검사를 통과하지 못하면 적절한 에러 메시지를 클라이언트에게 반환해야 합니다.
Controller에서 @Valid를 사용하여 유효성 검사를 하며, 오류가 발생한 경우 Errors 객체를 통해 오류 정보를 받도록 합니다.
@PostMapping("/register")
public ResponseEntity<String> register(@Valid @RequestBody UserDto.Request userDto, Errors errors) {
if (errors.hasErrors()) {
// 유효성 검사 실패 시 오류 메시지를 처리
StringBuilder errorMessages = new StringBuilder();
errors.getAllErrors().forEach(error -> {
errorMessages.append(error.getDefaultMessage()).append("\n");
});
return new ResponseEntity<>(errorMessages.toString(), HttpStatus.BAD_REQUEST);
}
// 유효성 검사 성공 시 회원 가입 진행
userService.register(userDto);
return new ResponseEntity<>("회원가입 성공", HttpStatus.OK);
}
'Spring' 카테고리의 다른 글
Spring Pageable 안 쓰면 바보 (1) | 2025.01.31 |
---|---|
그래서 OAuth 2.0로 로그인 어떻게 하는 건데 (0) | 2025.01.24 |
@LoginUser 커스텀 어노테이션으로 로그인 사용자 정보 주입하기 (0) | 2025.01.14 |
Spring security Config 설정 | 생각없이 따라하다가 deprecated 놓치잖아 (0) | 2025.01.08 |
[Thymeleaf] 자꾸 챗지피티한테 맡기니까 뷰 짜는 머리가 퇴화하는데? (0) | 2024.12.27 |