[Spring] 유효성 검증과 예외 처리

mingsso·2023년 10월 28일
0

SpringBoot

목록 보기
8/11

1️⃣ 유효성 검증이란

View로부터 전달되는 데이터가 DB에 수용 가능한지 확인하는 과정
즉, 입력 데이터가 시스템의 요구사항을 충족하는지 확인하기 위해 유효성 검증이 필요함

유효성 검증의 종류

  • 예외가 발생하는 유효성 검증
    • 웹 애플리케이션에서 폼 입력시 제약 조건에 맞지 않는 파라미터가 발생하면 예외가 발생함
      • 상품 등록시 Integer타입의 가격에 문자열이 들어가게 되면 형변환 예외와 SQL Exception이 발생함
    • 예외 발생시 오류 페이지로 자동으로 넘어가기 때문에 기존에 작성했던 내용들은 다 사라지고 사용자는 다시 작성해야 함
    • 예외로 발생하는 유효성 검증은 많지 않다
  • 예외가 발생하지 않는 유효성 검증
    • 상품명이 null(공백)인 경우, 상품명에 띄어쓰기가 있는 경우 등

유효성 검증을 처리하는 방법

검증은 크게 클라이언트와 서버 두 영역에서 가능하다

  • 클라이언트 검증(프론트 검증)
    • 자바스크립트를 이용해서 유효성 검증을 처리함
    • 서버로 값을 보내지 않아 빠른 사용자 경험을 제공하고, 서버가 불필요하게 검증을 하지 않게 도와줘 서버 리소스를 줄인다는 장점
    • 보안에 취약하다는 단점
  • 서버 검증(백엔드 검증)
    • 가장 최신의 서버 검증 방법은 스프링에서 제공하는 Bean Validation

두 가지 검증 방법이 장단점이 있기 때문에, 두 방법을 적절히 섞어서 사용해야 함



2️⃣ Bean Validation

Bean Validation을 사용하는 이유

일반적인 데이터 유효성 검사 로직은 아래와 같은 문제를 가지고 있음

  • 코드 중복이 심하고 모든 예외 케이스를 일일이 하드코딩 해야 함
  • 비즈니스 로직과 유효성 검증 로직이 섞여 있어 복잡함

즉, 위의 사진처럼 데이터 유효성 검사를 위해 띄어쓰기, 불필요한 문자열 처리 등과 같이 모든 유효성 케이스를 만들어서 처리해야 하고, 컨트롤러의 검증로직이 수십, 수백줄에 다다르게 될 것
-> 이는 유지보수적에 큰 어려움을 줄 것이고 실제로 중요한 비즈니스 로직은 보이지도 않게 될 것


Hibernate Validator

Hibernate Validator는 Bean Validation 명세의 구현체

  • 스프링부트에서는 Hibernate Validation을 유효성 검사 표준으로 채택하여 사용하고 있음
  • Hibernate Validation은 도메인 모델에서 어노테이션을 통한 필드값 검증을 가능하게 도와줌
  • spring-boot-starter-validation 의존성을 추가하여 사용할 수 있음


스프링부트의 유효성 검사

유효성 검사는 각 계층으로 데이터가 넘어오는 시점에 해당 데이터에 대한 검사를 실시

스프링부트 프로젝트에서는 계층 간 데이터 전송에 대체로 DTO 객체를 활용하고 있기 때문에 유효성 검사를 DTO 객체를 대상으로 수행하는 것이 일반적

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
public class ValidRequestDto {

    @NotBlank
    String name;

    @Email
    String email;

    @Pattern(regexp = "01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$")
    String phoneNumber;

    @Min(value = 20) @Max(value = 40)
    int age;

    @Size(min = 0, max = 40)
    String description;

    @Positive
    int count;

    @AssertTrue
    boolean booleanCheck;
}

각 어노테이션은 유효성 검사를 위한 조건을 설정하는데 사용됨

또한 커스텀 Validation을 추가하여, 자바 또는 스프링의 유효성 검사 어노테이션에서 제공하지 않는 검사 기능을 사용할 수 있음

// 전화번호 형식이 일치하는지 확인하는 유효성 검사 어노테이션 생성 
public class TelephoneValidator implements ConstraintValidator<Telephone,String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if(value == null){
            return false;
        }
        return value.matches("01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$");
    }
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TelephoneValidator.class)
public @interface Telephone {
    String message() default "전화번호 형식이 일치하지 않습니다.";
    Class[] groups() default {};
    Class[] payload() default {};
}






참고자료

도서 '스프링부트 핵심 가이드'
https://velog.io/@uo3641493/%EA%B5%AD%EB%B9%84%EA%B3%BC%EC%A0%95%ED%8C%8C%EC%9D%B4%EB%84%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9C%A0%ED%9A%A8%EC%84%B1-%EA%B2%80%EC%82%AC

profile
🐥👩‍💻💰

0개의 댓글