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 하는 편이 처리가 편리함
- validation이 여러 군데에 흩어져있으면 테스트 및 유지보수성 감소
- 실무 사용 패턴
- 요청 dto에서 Java Bean Validation으로 단순 데이터(유무, 범위, 형식 등)을 1차 검증
- 로직 초기에 2차로 비즈니스 검증 수행 후 실패 시에는 Custom Exception으로 예외 Throw 하여 응답 생성
LIST
'IT > Spring Boot' 카테고리의 다른 글
[Spring Boot] 스프링 부트 SpEL(Spring Expression Language) (0) | 2024.09.27 |
---|---|
[Spring Boot] 스프링부트 Spring Resource (0) | 2024.09.27 |
[Spring Boot] 스프링 부트 Data Binding (0) | 2024.09.27 |
[Spring Boot] 스프링 부트 Layered Architecture (0) | 2024.09.27 |
[Spring Boot] 스프링 부트 REST API와 RESTful (0) | 2024.09.27 |