[스프링 부트 핵심가이드] 유효성 검사와 예외처리 (1)🐢

FeelingXD·2023년 4월 12일
0

북스터디

목록 보기
7/13
post-thumbnail

🍃 Spring-boot-validation

✅ Validation(검증)

올바르지않은 데이터를 걸러내는것은 어플리케이션 보안을 유지하고 예상할수없는 시스템의 오류를 미연에 방지하기위해 데이터의 검증은 여러단계에서 사용된다.

⚠️ 사용자의 입력을 절대 신뢰하지 마라!

사용자는 사용자일뿐 개발자가 아니다. 개발자가 의도한대로 사용자가 입력할것이라는 기대는 시스템의 보안, 유지의 큰위협이된다. 특히 Client에서의 데이터는 조작이 쉽고(쿠키의 변조, 입력값 변조) 모든 데이터가 정상적인 방식으로 들어오는것이라 기대하는건 좋지않다. 그래서 Client side 뿐만아니라 Sever side 즉 백엔드 단에서도 .입력값에대한 검증이 필요하다.
스프링 부트 프로젝트는 의존성 추가로 유효성을 쉽고 간단하게 검증할수있다.

Spring boot Validation 사용하기

✔ Spring boot 2.3v 이상부터는 spring-boot-start-web의존성 내부에 있던 validation이 포함되지않기때문에 해당 버전보다 높은 환경이라면 따로 의존성을 추가해주어야 합니다.

우선 빌드도구에 의존성을 추가해준다 필자는 gradle을 사용하고있다. gradle에 다음과 같이 추가하였다.

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '3.0.5'
//service 
if (!(1.0 <= form.getRate() && form.getRate() <= 5.0)) {
            throw new CustomException(ErrorCode.INVALID_FORM_RATE);
// form
public class ReviewInputForm {

    private String subject;

    private String text;

    private Double rate;
}

해당 예시는 간단하게 리뷰를 작성하는 예시로 만들었다. form 의 입력값에서 Double rate(점수) 란이 1.0~5.0 이 아니라면
Custom exception을 호출하게된다.

기존의 이런 방법의 유효성검증은 로직상에서 필요이상의 코드를 작성하게 하였으며 중복코드를 작성하게 만들었다.

하지만 Spring validation을 이용한다면 form 의 입력단계 에서 검증할수있다.

다음은 validation의 적용의 예시이다.

//refactor
public class ReviewInputForm {
    @NotNull
    private String subject;
    @NotNull
    private String text;
    @DecimalMin(value = "1.0", inclusive = true, message = "Value must be greater than or equal to 0.0")
    @DecimalMax(value = "5.0", inclusive = true, message = "Value must be smaller than or equal to 0.0")
    @NotBlank
    private Double rate;
}

검증을 위한 다양한 어노테이션 👀

어노테이션검증내용
@NotNull해당 값이 null이 아닌지 검증함
@NotEmpty해당 값이 null이 아니고, 빈 스트링("") 아닌지 검증함(" "은 허용됨)
@NotBlank해당 값이 null이 아니고, 공백(""과 " " 모두 포함)이 아닌지 검증함
@AssertTrue해당 값이 true인지 검증함
@Size해당 값이 주어진 값 사이에 해당하는지 검증함(String, Collection, Map, Array에도 적용 가능)
@Min해당 값이 주어진 값보다 작지 않은지 검증함
@Max해당 값이 주어진 값보다 크지 않은지 검증함
@Pattern해당 값이 주어진 패턴과 일치하는지 검증함

그외 @DecimalMin,Max ~@Email 등 다양한 검증을 어노테이션으로 지원합니다. 자세한사항은
공식문서(java 8기준) 참고바랍니다.

검증을 위한 클래스 객체에 각각 어노테이션을 지정해주었다면 입력값에대한 검증을위해 컨트롤러 단에서도 추가적으로 검증을한다는 어노테이션을 주어야한다.


 public String writeReview(@Validated @RequestBody ReviewInputForm form) {
        reviewService.writeReview(form);
        return "작성 되었습니다.";
    }

컨트롤러에서도 어노테이션을 지정해주었다면 사용자가 값을 입력하고 서버로 전송시 Sever side에서도 입력값에대한 검사를 진행하고 입력값이 정책과 맞는지 판단 후 일치하지않는다면 exception으로 예외처리를 할수있게된다 이것으로 기존 어플리케이션의 검증 문제엿던 service 단에서 dto, form 등의 입력값을 컨트롤러 와 객체 필드에대한 검사를 진행하면서 좀더 깔끔하고 안전한 코드를 작성할수있게되었다.

profile
tistory로 이사갑니다. :) https://feelingxd.tistory.com/

0개의 댓글