[Spring] 유효성 검사 패턴

노유성·2023년 7월 21일
0
post-thumbnail

스프링 프레임워크에는 Errors라는 라이브러리가 있다. 해당 라이브러리를 이용하면은 에러를 처리하기가 간편하다.

예제

예를 들어서 client가 값을 입력하는 상황에서 3가지의 오류가 발생할 수 있다고 가정하자.

  • Null값을 입력
  • 필요하지 않은 값을 입력
  • 유효성에 어긋나는 값을 입력

원래대로라면 3가지의 경우에 대해 유효성 검사를 진행하는 함수를 3개를 만들고 bool값을 반환하고 bool값을 if문에 넣어서 유효성 검사를 진행한다.

하지만 위 방법에는 단점이 하나 있는데, 조건절 안에 있는 함수명이 직관적이라 할 지라도 다른 사람이 보기에 조건절을 하나하나 자세하게 보면서 '아 유효성 검사를 하는 if문이구나'를 알아야 한다는 단점이 있다. 해당 상황에서 Errors객체를 이용하면은 편리하다. 왜냐하면 error가 발생하는 경우라면 Errors 객체에 에러를 집어넣은 다음 외부에서는 Erros class 의 hasErros() 메소드를 이용해서 처리하면 되기 떄문에 모든 조건절에 error.hasErros()라는 동일한 문장이 들어가게 된다. 그러면 직관적으로 유효성 검사를 진행하고 있음을 알 수 있다.

@PostMapping
public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) {
    if (errors.hasErrors()) {
        return ResponseEntity.badRequest().build();
    }
    eventValidator.validate(eventDto, errors);
    if (errors.hasErrors()) {
        return ResponseEntity.badRequest().build();
    }

    Event event = modelMapper.map(eventDto, Event.class);
    Event newEvent = this.eventRepository.save(event);

    // 요청을 받아서 id를 추가한 후 body에 event를 담아서 반환한다.
    URI uri = linkTo(EventController.class).slash(newEvent.getId()).toUri();
    return ResponseEntity.created(uri).body(event);
}

@Valid anntation에 의해 entity에 정의된 조건이 어긋나는 경우 바로 다음 매개변수인 Errors의 객체에 에러를 담아준다. (@Valid annotaion의 특징)
그런 다음 validator에 정의된 유효성 검사 함수에 entity와 에러 객체를 집어넣는다.

그리고 그 다음 문장에서 바로 errors에 새로운 에러가 있는지 검사한다.
에러 객체 검사 -> 유효성 검사 -> 에러 객체 검사 -> ...
위와 같은 패턴을 이용하면 한 눈에 어떤 일을 처리하고 있는지 알 수 있다.

profile
풀스택개발자가되고싶습니다:)

0개의 댓글