SMALL

Request의 내용에 잘못된 내용이 있는지 확인하는 작업

  • 유형
    • 데이터 검증
      • 필수 데이터의 존재 유무
      • 문자열의 길이나 숫자형 데이터의 값의 범위 등
      • email, 신용카드 번호 등 특정 형식에 맞춘 데이터
    • 비즈니스 검증
      • 서비스 정책에 따른 데이터 검증
      • ex) 배달 요청을 할 때 해당 주문건이 결제 완료 상태인지 확인 등
      • 경우에 따라 외부 API 호출, DB 데이터 조회하여 검증하는 등
  • Spring의 Validation
    • 스프링의 경우 웹 레이어에 종속적이지 않은 방법으로 Validation을 하길 유도함
    • Java Bean Validation
      • 해당 방법이 좀 더 선호됨
      • JavaBean 내에 어노테이션으로 검증방법을 명시
        • Request DTO에 아래처럼 어노테이션 명시
        • public class MemberCreationRequest{
          	@NotBlank(message="이름을 입력해주세요.")
          	@Size(max=64, message="이름의 최대 길이는 64자 입니다.")
          	private String name;
          	@Min(0, "나이는 0보다 커야 합니다.")
          	private int age;
          	@Email("이메일 형식이 잘못되었습니다.")
          	private int email;
          	
          	//getter setter 등 ..
          }
          
        • 해당하는 @RequestBody에 @Valid 어노테이션을 달게 되면 Method 수행 전 Validation을 수행하게 됨
    • Spring validator 인터페이스
      • 특정 클래스 인스턴스에서만 동작하는 클래스를 Validator 인터페이스를 구현하여 사용
      • JavaBean Validation에 비해 조금 더 복잡한 검증이 가능하나 코드 확인이 어려울 수 있고 비즈니스 검증 로직이 여러 군데 흩어질 수 있기 때문에 잘못된 검증(중복 검증, 다른 정책을 따르는 검증)을 수행할 가능성이 높아짐
      • supports 메서드 : validator가 동작할 조건을 정의, 주로 class의 타입을 비교
      • validate : 원하는 validation을 진행
      public class PersonValidator implements Validator {
      	/*
      		This Validator validates only Person instances
      	*/
      	public boolean supports(Class clazz){
      		return Person.class.equals(clazz);
      	}
      	
      	public void validate(Object obj, Errors e){
      		ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
      		Person p = (Person) obj;
      		if(p.getAge() < 0){
      			e.rejectValue("age", "negativevalue");
      		}else if(p.getAge() > 110){
      			e.rejectValue("age", "too.darn.old");
      		}
      	}
      }
      
    • 유의사항
      • validation이 여러 군데에 흩어져있으면 테스트 및 유지보수성 감소
        • 중복된 검증, 다른 검증 등
      • 가능한 한 validation은 로직 초기에 수행 후 실패 시 exception을 throw 하는 편이 처리가 편리함
    • 실무 사용 패턴
      • 요청 dto에서 Java Bean Validation으로 단순 데이터(유무, 범위, 형식 등)을 1차 검증
      • 로직 초기에 2차로 비즈니스 검증 수행 후 실패 시에는 Custom Exception으로 예외 Throw 하여 응답 생성
LIST

+ Recent posts