Validation / Exception

강민형·2020년 11월 6일
1
post-thumbnail

Validation을 적용한 이유

기존에 팀 프로젝트를 할때는 정해진 프론트와만 통신을 했기에 프론트에서 Validation을 걸어주면 백엔드에서는 신결쓸 필요가 없었음
하지만 업무에서 타 사이트에서 우리 서버로 API를 호출할 일이 생김
상대측에서 우리 API를 호출할 때 정해진 폼에 맞춰 요청을 보내겠지만 꼭 그렇지 않을 경우가 생길 수 있음
그래서 따로 백엔드에도 Validation을 걸어주기로 했음

적용 방법

우선 데이터를 주고받을 데이터 객체에 필수 멤버변수에 Validation 설정을 걸어줬음

Class SomeThing{
	@NotNull @NotBlank
	String a;
	@NotNull @NotBlank    
	String b;
	String c;
	String d;
}

이와같이 설정해주면 문자열 a와 b는 Null이거나 빈칸일 수 없게 됨
그리고 컨트롤러에서 해당 객체를 RequestBody를 받아올때 Valid 선언을 해줘야 해당 어노테이션이 함

@PostMapping("/something")
public Map<String, ?> oneOfThePostAPIS(@Valid @Requestbody SomeThing something){
	// ...
}

이를 통해 Requestbody로 데이터를 받을때 문자열 a와 b가 Null이거나 빈칸이 들어오면 Exception을 발생시킴
그런데 이처럼 객체를 받는게 아닌 String같은 파라미터를 받게되는 경우는 조금 다름

@GetMapping("/something")
public Map<String, ?> oneOfTheGetAPIS(@RequestParam(required = false) @NotNull @NotBlank String something){
	// ...
}

이처럼 따로 객체에 어노테이션을 붙여주는것이 아닌 해당 파라미터앞에 붙여주면 됨@RequestParam(required = false)에서 required를 false값으로 준 이유는 api호출시 파라미터 자체를 넘기지 않는 상황을 Catch하기 위해서이다
이를 적용하기위해 컨트롤러에 @Validated를 붙여주면 완성

Exception

단순히 Exception만 발생시키면 이대로 끝내도 괜찮지만 팀장님이 조건으로
Validation에 걸리면 400대 에러, DB에 접근후 리턴된 데이터가 없으면 500에러를 발생시키라고 하심
현재는 Validation에 걸리면 500에러가 뜨는 상황이며 이를 400대 에러로 바꿔줘야 함
그래서 각각의 상황별로 어떤 Exception을 발생시키는지 확인해봤음

Exception 종류

먼저 Validation에 걸리는 경우는 파라미터의 경우 ConstraintViolationException이 발생했음
이를 처리하기위해 해당 Exception의 custom하는 handler를 만들어 주었음

    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    Map<String, ?>  handleConstraintViolationException(ConstraintViolationException e) {
        return Map.of("message", e.getMessage());
    }

그리고 HTTP status code를 400으로 처리하기 위해 @ResponseStatus(HttpStatus.BAD_REQUEST)를 사용함

객체의 경우는 MethodArgumentNotValidException이 발생함

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    Map<String, ?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        return Map.of("message", e.getMessage());
    }

그리고 500으로 처리해야하는 나머지 Exception의 경우

    @ExceptionHandler(NoSuchElementException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    Map<String, ?> handleNoSuchElementException(NoSuchElementException e) {
        return Map.of("message", e.getMessage());
    }

로 처리해줬다.
Exception명은 상황에 따라 달라서 그부분은 따로 만들어서 구현했다

profile
Since 2020.11.02 / BackEnd Developer / SSAFY 3기

0개의 댓글