Motivation

스펙에서 벗어난 값 입력 (invalid request)

교육 & 실습: TODO App > 스펙 8페이지 참고.

할일 등록 시 할일, 담당자, 우선순위제약조건이 있다. 하지만 우리는 클라이언트로부터 제약조건을 지킨 request 가 들어다고 가정하고 로직을 구현해도 될까?

<aside> 💡 아래 request 를 요청해보자 (postman, todo-frontend 상관없음)

  1. 20byte 이상의 할일 혹은 공백
  2. 15byte 이상의 담당자, 혹은 공백, 혹은 특수문자 포함
  3. 1미만 3초과 우선순위

</aside>

현재 backend 서버(commit: 5d80d4ff)에서는 request 값을 검증하지 않고 있다. 그래서 올바르지 않은 값들이 그대로 반영되어 카드가 생성될 것이다.

이처럼 서버내부에서 로직을 실행할 때 클라이언트 로부터 올바르지 않은 값이 들어온다면 예상 못한 버그가 발생할 수 있다.

스펙에 맞는 값만 받아서 처리하고 싶을 때 (valid request)

시스템의 예상치 못한 동작을 막기 위해 스펙에 맞는 request 만 받아서 처리하는 건 정말정말 중요하다.

todo-frontend javascript 코드를 작성하여 검증된 값을 서버로 보내는 방법도 있다. 하지만 API 측에서도 대비 하는게 좋다. 즉 frontend와 backend 에서 스펙에 맞는 값 검증을 추가하는게 좋다.

<aside> 💡 backend 에서 request 값 검증 방법을 생각해보자. 일일이 코드로 구현하는 방법이 최선일까? 만약 각 단계에서 값을 검증한다면 아래와 같은 그림일 것이다.

</aside>

https://meetup.toast.com/posts/223

https://meetup.toast.com/posts/223

하지만, 애플리케이션 단계에서 데이터를 검증하는 로직은 많은 문제가 있다.

  1. 검증 로직이 애플리케이션 전체에 분산
  2. 코드 중복 발생 가능성
  3. 비즈니스 로직과 섞여 있어 코드를 읽기 어렵다. (100, 1000 줄 단위의 코드를 보면서 로직을 파악해야 할 때가 있다. 이 때 검증 로직이 여기저기 섞여있으면..)

추후 검증 로직을 추가/수정할 때 오류가 발생할 가능성이 높다.

Spring Validation