spring boot
@NotBlank 이용해서 dto값 검증하기
원코드
2024. 8. 26. 18:34
1. build.gradle에 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-validation’
2. 컨트롤러에 @Validated 추가
public ResponseEntity<MemberSignUpResponse> signUp(@Validated @RequestBody MemberSignUpRequest request) {
return ResponseEntity.status(HttpStatus.CREATED).body(new MemberSignUpResponse(memberService.signUp(request)));
}
3. dto에 @NotBlank 추가
import javax.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Getter
public class MemberSignUpRequest {
@NotBlank(message = "이메일을 입력해주세요.")
private String email;
@NotBlank(message = "비밀번호를 입력해주세요.")
private String password;
@NotBlank(message = "비밀번호 재확인을 입력해주세요.")
private String checkPassword;
@NotBlank(message = "닉네임을 입력해주세요.")
private String nickname;
@Builder
public MemberSignUpRequest(String email, String password, String checkPassword, String nickname) {
this.email = email;
this.password = password;
this.checkPassword = checkPassword;
this.nickname = nickname;
}
public Member toEntity() {
return Member.builder()
.email(email)
.nickname(nickname)
.password(password)
.role(Role.GUEST)
.build();
}
}
4. 테스트
package com.tlog.backend.member.web.dto;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class MemberSignUpRequestTest {
private static Validator validator;
@BeforeAll
protected static void init() {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
@Test
@DisplayName("회원가입 시 빈값 체크")
protected void signUp_request_test() {
//given
String email = " ";
String password = " ";
String checkPassword = " ";
String nickname = " ";
MemberSignUpRequest request = MemberSignUpRequest.builder()
.email(email)
.password(password)
.checkPassword(checkPassword)
.nickname(nickname)
.build();
// when
Set<ConstraintViolation<MemberSignUpRequest>> violations =
validator.validate(request);
//에러메세지
ConstraintViolation<MemberSignUpRequest> violation_email = violations.stream()
.filter(v -> v.getPropertyPath().toString().equals("email"))
.findFirst()
.get();
ConstraintViolation<MemberSignUpRequest> violation_password = violations.stream()
.filter(v -> v.getPropertyPath().toString().equals("password"))
.findFirst()
.get();
ConstraintViolation<MemberSignUpRequest> violation_checkPassword = violations.stream()
.filter(v -> v.getPropertyPath().toString().equals("checkPassword"))
.findFirst()
.get();
ConstraintViolation<MemberSignUpRequest> violation_nickname = violations.stream()
.filter(v -> v.getPropertyPath().toString().equals("nickname"))
.findFirst()
.get();
//then
assertThat(violation_email.getMessage()).isEqualTo("이메일을 입력해주세요.");
assertThat(violation_password.getMessage()).isEqualTo("비밀번호를 입력해주세요.");
assertThat(violation_checkPassword.getMessage()).isEqualTo("비밀번호 재확인을 입력해주세요.");
assertThat(violation_nickname.getMessage()).isEqualTo("닉네임을 입력해주세요.");
}
}
참고 블로그:
https://medium.com/sjk5766/spring-boot-notnull-notempty-notblank-validation과-테스트-c3410e82689c
Spring Boot NotNull, NotEmpty, NotBlank validation과 테스트
Spring boot에서 입력값 검증(Request Dto 검증)을 처음 구현했을 때 String 필드에 대해 NotNull, NotEmpty, NotBlank 어노테이션 중 뭘 써야 할지 몰라 검색한 내용을 대충 읽고 작업했는데 이번에 정리하도록
medium.com