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