• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@Valid 어노테이션에 대한 테스트 질문입니다.

23.09.08 17:51 작성 23.09.08 17:52 수정 조회수 370

0

안녕하세요. 강의에 매우 깊은 감명을 받고 토이 프로젝트에 말씀해주신 부분들 적용해보고 있습니다.

강의에서 가이드 주신대로 유효성 검증에 대한 테스트도 mock 라이브러리 없이 순수 자바 코드로 해보고 있습니다.

기존 코드에서는 입력값 유효성 검증을 위해 @Valid 어노테이션을 사용했는데요. 스프링부트를 실행시키지 않으니 @Valid 어노테이션이 정상작동을 안해서 테스트를 작성하는데 어려움을 겪고 있습니다....ㅎㅎ

그래서 유효성 검증을 하는 코드를 직접 작성해야 하나 고민하다가 질문을 남기게 되었습니다. 강사님께서는 유효성 검증에 대한 테스트 코드를 작성하는데 어떤 방법을 사용하시는지 궁금합니다.

(@Valid는 자바 표준 스펙으로 알고 있어서 스프링을 실행시키지 않아도 방법을 잘 찾아보면 가능할 것 같다 라고도 생각하고 있습니다.)

 

 

답변 2

·

답변을 작성해보세요.

0

안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.

우선 mockito나 spring-boot-starter-test 쓰셔도 됩니다…! 저도 종종 애용합니다. 😭 이 강의에서 말하고 싶었던 것은 “쓸덴 쓰더라도 이것들이 어떻게 만들어졌는지 알고, 이런 것들 없이 설계만으로도 이 문제를 어떻게 해결할 수 있는지 알자”였습니다. 그러니 모든 코드를 꼭 테스트 프레임워크 없이 짜려고 노력하지 않으셔도 되고요! (물론 공부 차원에선 안 써보는 것도 나쁘진 않은 것 같습니다.)

이야기하신 상황도 이에 부합한 상황 같습니다. 결국 질문자님이 원하는 상황은 “mockMvc 같은 도구를 활용해 API 호출을 했을 때 validation 로직이 정상적으로 도는가?”이기 때문에 이런 경우는 어쩔 수 없이 대형 테스트를 하는 방향으로 가야 할 것 같고요.

다만 valid 애너테이션이 제대로 동작하는지만 판단하고 싶다면 꼭 스프링 컨테이너를 띄울 필요는 없습니다. 아래와 같이 코드를 작성해 valid 테스트를 할 수 있습니다.

import org.junit.jupiter.api.Test;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

import javax.validation.ConstraintViolation;
import java.util.Set;

class MyObjectTest {

    private final LocalValidatorFactoryBean validatorFactory = new LocalValidatorFactoryBean();

    @Test
    public void MyObject의_valid_로직을_검사할_수_있다() {
        // given
        validatorFactory.afterPropertiesSet();
        MyObject myObject = MyObject.builder()
            // ...
            // ...
            .build();

        // when
        // 제약 조건을 어긴 경우 violations에 데이터가 들어갑니다. 
        Set<ConstraintViolation<MyObject>> violations = validatorFactory.validate(myObject);

        // then
        // ...
    }
}

답변이 도움 됐길 바랍니다.

-2

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.09

안녕하세요, 인프런 AI 인턴이에요. @Valid 어노테이션에 대한 테스트 질문에 대해서 답변드릴게요.

@Valid 어노테이션은 자바 표준 스펙인 JSR-303(Bean Validation)의 일부로, 주로 스프링 프레임워크에서 사용됩니다. 스프링 부트를 실행시키지 않으면 스프링의 Bean Validation 기능이 작동되지 않기 때문에 @Valid 어노테이션이 정상적으로 동작하지 않을 수 있어요.

만약 @Valid 어노테이션을 사용하여 유효성 검증을 직접 테스트하고 싶다면, 스프링 프레임워크를 사용하지 않고, Bean Validation 스펙을 구현한 다른 라이브러리를 적용해볼 수도 있어요. Hibernate Validator, Apache BVal 등이 있으니 참고해보시면 좋을 것 같아요.

그 외에도 순수 자바 코드로 유효성 검증을 테스트하고 싶다면, 객체의 속성에 대한 검증 코드를 직접 작성해볼 수도 있어요. 예를 들어, 필드의 값이 유효한 범위에 속하는지를 확인하거나, 정규식을 사용하여 형식에 맞는지 검증하는 등의 방식을 사용할 수 있어요.

어떤 방법을 사용하더라도 중요한 것은 테스트 코드에서 유효성 검증을 충분히 커버하고, 예외 상황에 대한 처리를 잘 다뤄주는 것이에요. 이를 위해 JUnit이나 AssertJ와 같은 유용한 테스트 도구들을 활용해보시면 좋을 것 같아요.

더 자세한 내용은 Bean Validation 스펙과 사용하고 계신 라이브러리의 공식 문서를 참고하시면 도움이 될 것 같아요. 이 외에 궁금한 점이 있으면 언제든지 물어보세요. 좋은 결과 얻으시길 바랄게요!