pooney
article thumbnail

유효성을 체크하기 위하여 많이 사용하는 방법은 @Valid을 사용하는 것이다. 사용하기 위해서는 dependency를 추가해 줘야한다 

 

 

Gradle dependency

compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: '6.1.5.Final'

 

 

 

TestController 

@RestController
public class TestController {


	//사용자 조회
    @GetMapping("/user")
    public String user(String id){
         throw new UserNotFoundExtion(String.format("존재하지 않는 회원 [ID : %s]", id));

    }
    
	//사용자 추가 
    @PostMapping("/user")
    public void insertUser(@Valid @RequestBody User user){
        System.out.println(user);
    }



}

 

@PostMapping을 통하여 사용자 추가를 가정하여 코드를 작성하였습니다.  이때 Json 형태로 데이터를 받기 위하여 @RequetBody를 사용하였고 해당 User 클래스에 @Valid를 사용하여 유효성 검증을 해야한다는 것을 Spring boot에 알리는 작업을 수행하였습니다. 

 

 

User

package com.ex.boot.web;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	//최소글자 정의
    @Size(min = 2)
    private String uid;
	//널이 아닌지 체크
    @NotNull
    private String password;

}

@Size,  @NotNull를 추가하여 최소글자와 Null 값을 체크를 하겠습니다 . 만약 해당 정의에 어긋나면 예외를 발생시킬것입니다. 

 

 

ExceptionResponse

package com.ex.boot.web;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExceptionResponse {
    private Date date;
    private String msg;
    private String content;
}

 

ExceptionResponse 클래스는 예외가 발상했을때 메시지를 전달할 클래스입니다. 

 

 

 

 

 

package com.ex.boot.web;

        import lombok.Data;
        import org.springframework.http.HttpHeaders;
        import org.springframework.http.HttpStatus;
        import org.springframework.http.ResponseEntity;
        import org.springframework.web.bind.MethodArgumentNotValidException;
        import org.springframework.web.bind.annotation.ControllerAdvice;
        import org.springframework.web.bind.annotation.ExceptionHandler;
        import org.springframework.web.bind.annotation.RestController;
        import org.springframework.web.client.HttpStatusCodeException;
        import org.springframework.web.context.request.WebRequest;
        import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

        import javax.xml.ws.Response;
        import java.util.Date;


@RestController
@ControllerAdvice
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {

    //Exception을 통해 예외를 받고 WebRequest를 통행 어디서 에러가 발생했는지 받을 것입니다.
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> allException (Exception e , WebRequest request){
        ExceptionResponse exceptionResponse =
                new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
        return new ResponseEntity(exceptionResponse , HttpStatus.INTERNAL_SERVER_ERROR);

    }
    //UserNotFoundExtion.class 예외가 발생 했을때 작동
    @ExceptionHandler(UserNotFoundExtion.class)
    public final ResponseEntity<Object> userFoundException (Exception e , WebRequest request){
        ExceptionResponse exceptionResponse =
                new ExceptionResponse( new Date(), e.getMessage(), request.getDescription(false));
        return new ResponseEntity(exceptionResponse , HttpStatus.NOT_FOUND);

    }
	
    
    //유효성 검증에 대한 예외가 발생하면 아래 메소드가 작동
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(
            MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), "유효성 검사 오류 !!", ex.getBindingResult().toString());

        return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
    }


}

 

[참고] AOP방식을 활용 https://pooney.tistory.com/67

 

유효성 검증에 대한 예외가 발생하면  handleMethodArgumentNotValid가 작동하면서 사용자에게 에러정보와 Status 코드를 전달할 것입니다. 

 

 

결과 

 

Uid의 크기가 2보다 작은 경우

uid의 크기를 1로 전달한 결과 예외가 발생하였고 그에 맞은 404를 전달 받은 것을 확인 할 수 있습니다. 

 

 

 

 

password가 null인 경우 

 

password를 null로 하여 보낸 결과 유효성 에러가 발생하여 404를 전달 받았고 "널이어서는 안됩니다" 라는 메시지를 받는 것을 확인 할 수 있습니다. 

 

 

 

profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!