IT/development

[springBoot] 유효성 검증(feat. @Valid, Validated)

알 수 없는 사용자 2022. 11. 22. 06:59
반응형

목차

     

    SpringBoot 유효성 검증 😄

    클라이언트에서 넘어온 값들에 대한 유효성 검증이 필요한데 if(id != null || id != ""...) 이렇게 if문으로 유효성 체크를 하기 싫어서 자바나 스프링에서 지원하는 좋은게 어디 없나 보다가 구글링을 하고 @Valid@Validated를 알게되어서 적용을 해봤고 이를 기록한다.

     

    "", " ", null 이렇게 3개만 체크하면 되는 부분이었다. 

     

    결론은 스프링부트에선 @Valid와 @Validated 2개를 사용해서 간단한 유효성 체크를 할 수 있음

     

    @Valid 🥰

    @Valid는 JSR-303 Bean Validator를 이용해서 유효성을 체크하는 어노테이션임(자바 표준 스펙)

     

    사용법

    스프링부트 버전에 따른 의존성 추가

    사용하는 스프링 부트 버전이 2.3이전버전이라면 spring-boot-starter-web 의존성에 포함되어 있어서 굳이 필요없음, 나는 현재 업무 시 2.0버전을 사용하고 있어서 의존성은 따로 추가하지 않았다.

    https://stackoverflow.com/questions/61959918/spring-boot-validations-stopped-working-after-upgrade-from-2-2-5-to-2-3-0

     

    Spring Boot - Validations stopped working after upgrade from 2.2.5 to 2.3.0

    I've migrated a Spring Boot project from 2.2.5 to 2.3.0 and after that, Validations stopped to work (they aren't invoked at all). I read in changelog documentation (https://github.com/spring-proje...

    stackoverflow.com

     

    컨트롤러에서 유효성 체크를 할 것이기에 parameter값으로 받는 객체에 @Valid 어노테이션 추가

    @Valid는 컨트롤러에서만 검증 가능(ArgumentResolver에서 처리), 만일 다른 서비스단 같은 곳에서 사용하려면 @Validated 사용

     

    Controller(RestController)

    @PostMapping("")
    public ResponseEntity<?> insertUser(@RequestBody @Valid MemberVO memberVO) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
    
        try {   
            userService.insertUser(memberVO);
            resultMap.put("result", "success");
            return new ResponseEntity<>(resultMap, HttpStatus.OK);
        } catch (Exception e) {
            resultMap.put("result", "fail");
            return new ResponseEntity<>(resultMap, HttpStatus.BAD_REQUEST);
        }
    }

     

    MemberVO

    유효성 체크할 필드에 @NotNull, NotEmppty 등의 JSR 표준 스펙에서 제공하는 어노테이션을 적용한다.

    package com.lsy.test;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.NotNull;
    
    @Getter
    @ToString
    public class MemberVO {
        // 번호
        // default message 설정 가능
        @NotNull(message = "일련번호는 필수값입니다.") // null만 불가("", " " 가능)
        private Long no;
        // 아이디
        @NotBlank(message = "아이디는 필수값입니다.")	// null, "", " " 불가
        private String id;
        // 이름
        @NotBlank(message = "이름은 필수값입니다.")
        private String name;
    }

     

     

    테스트

    화면에서는 JSON 형식으로 데이터를 전송한다. 아래처럼 일부러 아이디를 빈값으로 서버로 보내보겠다.

    {
      "no": 10,
      "id": "",
      "name": "bbbb"
    }

     

    서버에서는 아래처럼 Exception(MethodArgumentNotValidException)이 발생했다.

    default message에는 VO객체에 내가 아까 입력한 기본 메시지가 표시되었다.

     


     

    @Validated 🥰

    @Validated는 스프링에서 제공하는 기능이다.

    만일 컨트롤러에서 사용 시 아래처럼 검증할 객체앞에 @Validated를 붙이면 된다.

    @PostMapping("")
    public ResponseEntity<?> insertUser(@RequestBody @Validated MemberVO memberVO) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        나머지 생략...
    }

    @Valid는 객체 전체에 대해 유효성을 검증하고 @Validated는 그룹을 만들어서 원하는 요소만 검증할 수 있고

    컨트롤러가 아닌 곳에서도 유효성 검증을 할 수 있고 예외도 ConstraintViolationException발생한다.

     

    참조한 블로그에 가면 동작원리와 더 자세한 내용이 나와있다.

     

     

    참조 : 망나니개발자님 블로그, 2021.7.19, https://mangkyu.tistory.com/174

     

    [Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)

    Spring으로 개발을 하다 보면 DTO 또는 객체를 검증해야 하는 경우가 있습니다. 이를 별도의 검증 클래스로 만들어 사용할 수 있지만 간단한 검증의 경우에는 JSR 표준을 이용해 간결하게 처리할 수

    mangkyu.tistory.com

    반응형