[Spring boot] @Valid is not working, @Valid가 동작하지 않을 때

Byuk_mm·2022년 7월 29일
1

Spring Boot Development

목록 보기
1/13
post-thumbnail
post-custom-banner

Spring Boot 개발 중 학습이 필요한 내용을 정리하고,
트러블 슈팅 과정을 기록하는 포스팅입니다.


✅ Background

아래 코드는 회원 가입에 관한 기본적인 Application 계층의 코드와 dto 그리고 test 코드입니다.

AccountSign up api

@PostMapping("/api/account")
public AccountSignUpResponse signUp(@RequestBody @Valid final AccountSignUpRequest dto){

	Account account = accountService.signUp(dto);

	return new AccountSignUpResponse(account);
}

AccountSignUpRequestDto

@Getter
@NoArgsConstructor
public class AccountSignUpRequest {

    @NotBlank
    @Email(message = "이메일을 양식을 지켜주세요.")
    private String email;

    @NotBlank
    private String name;

    @NotBlank
    private String password;

    public AccountSignUpRequest(String email, String name, String password) {
        this.email = email;
        this.name = name;
        this.password = password;
    }

    public Account toEntity() {
        return Account.builder()
                .email(email)
                .name(name)
                .password(Password.builder().password(this.password).build())
                .build();
    }

}

AccountSignUpTest

@Test
public void 회원가입_이메일_유효하지않은_입력값() throws Exception {

	//given
	String USER_EMAIL = "asdasdwedas";
    String USER_NAME = "홍길동";
	String USER_PASSWORD = "qwer1234";

	AccountSignUpRequest accountSignUpRequest = new AccountSignUpRequest(USER_EMAIL, USER_NAME, USER_PASSWORD);

	//when
	ResultActions resultActions = mvc.perform(post("/api/account")
						.contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(accountSignUpRequest))
						.accept(MediaType.APPLICATION_JSON))
                        .andDo(print());

	//then
	resultActions.andExpect(status().isBadRequest());
}



✅ Problem

위의 테스트 코드에서는 email에 적절하지 못한 값이 들어갔기 때문에
@Email 애노테이션에 의해 BadRequest를 반환해야 합니다.

하지만 다음과 같이 예외를 반환하지 못하고 정상적으로 처리되는 모습을 확인할 수 있습니다.




✅ Solution

코드적인 문제일 것이라고 생각하고 예시 코드를 참고하여 controller, dto 코드를 이것저것 고쳐보면서 괜한 삽질을 했지만 문제는 그 부분이 아니었습니다,,

implementation 'org.springframework.boot:spring-boot-starter-validation'

해결 방법은 spring-boot-starter-validation 의존성을 추가하는 것이었습니다.

spring boot 2.3 version 이전에는 spring-boot-starter-web 의존성 내부에 validation 의존성이 포함돼 있었지만, 2.3 버전 이후로는 포함되지 않는다고 합니다.

때문에 validation 의존성을 따로 추가해야줘야합니다!!
IDEA에서도 따로 오류 표시가 안뜨고, validation 관련 애노테이션을 불러올 때 제대로 불러오는 것으로 표시돼서 gradle 의존성 관련 문제는 아닐 것이라고 생각했습니다 ㅠㅠ.. 허무하게 시간을 날린 것이 아깝지만,, 시작부터 꼼꼼하지 못했던 탓이기 때문에 하나 배웠다고 생각합니다!

아래는 정상적으로 test 코드가 처리 된 모습입니다.

profile
어디야 벽벽 / 블로그 이전 -> byuk.dev
post-custom-banner

0개의 댓글