8. 유효성 검사 기능 알아보기

DAEILLIM·2023년 12월 3일
0
post-thumbnail

1. 유효성 검사

유효성 검사(Validation)는 입력 내용이 조건에 만족하는지 그 타당성을 확인하는 입력 체크를 말합니다. 유효성 검사는 크게 두 개로 나뉩니다.

  • 단일 항목 검사
  • 상관 항목 검사(서로 관련이 있는 항목을 함께 체크하는 방법)

1.1 단일 항목 검사

단일 항목 검사는 입력 항목 하나에 대해 설정하는 입력 체크 기능입니다. Form 클래스 등의 필드에 어노테이션을 부여해서 사용합니다.

입력 체크를 위한 어노테이션은 JavaEE에서 제공하는 어노테이션(Bean Validation) 혹은 하이버네이트(Hibernate) 프레임워크에서 제공하는 어노테이션(Hibernate Validator)이 있습니다. 또 수치 입력 항목에 알파벳 등의 문자열을 입력 등의 '형변환 체크'는 입력 체크를 설정하는 것만으로도 이용할 수 있기 때문에 '형변환 체크'용 어노테이션을 추가할 필요는 없습니다.


단일 항목 검사에 이용되는 주요 어노테이션

스프링에서 단일 항목(메서드 파라미터, 필드 등)의 검사에 사용되는 주요 어노테이션 중 몇 가지를 설명하겠습니다. 이러한 어노테이션들은 주로 폼 검증, 요청 데이터 검증 등에서 사용되며, 컨트롤러 메서드의 파라미터 또는 빈(Bean) 클래스의 필드에 적용됩니다.

  1. @RequestParam

    • 설명: HTTP 요청 파라미터를 메서드의 파라미터로 바인딩합니다.

    • 예시:

      @GetMapping("/example")
      public String exampleMethod(@RequestParam String parameter) {
          // 로직 수행
          return "result";
      }
      
  2. @PathVariable

    • 설명: URL 경로의 일부를 메서드의 파라미터로 바인딩합니다.

    • 예시:

      @GetMapping("/example/{id}")
      public String exampleMethod(@PathVariable Long id) {
          // 로직 수행
          return "result";
      }
  3. @RequestHeader

    • 설명: HTTP 헤더를 메서드의 파라미터로 바인딩합니다.

    • 예시:

      @GetMapping("/example")
      public String exampleMethod(@RequestHeader("User-Agent") String userAgent) {
          // 로직 수행
          return "result";
      }
  4. @RequestBody

    • 설명: HTTP 요청의 본문(body)을 자바 객체로 변환하여 메서드의 파라미터로 바인딩합니다.
      JSON이나 XML 등의 형식을 처리할 때 사용됩니다.

    • 예시:

      @PostMapping("/example")
      public String exampleMethod(@RequestBody User user) {
          // 로직 수행
          return "result";
      }
  5. @Valid@ModelAttribute

    • 설명: 객체의 필드 검증에 사용됩니다.
      @Valid는 검증을 활성화하고, @ModelAttribute는 폼 데이터를 자바 객체에 바인딩합니다.

    • 예시:

      @PostMapping("/example")
      public String exampleMethod(@ModelAttribute @Valid User user, BindingResult result) {
          if (result.hasErrors()) {
              // 검증 오류 처리
              return "error";
          }
          // 로직 수행
          return "result";
      }
  6. @NotNull, @NotEmpty, @NotBlank

    • 설명: 필드가 null, 비어 있거나(컬렉션도 해당) 공백 문자열이 아닌지를 검사합니다.

    • 예시:

      public class User {
          @NotNull
          private String username;
          
          // 나머지 필드와 메서드 생략
      } 

null 체크를 확인하는 어노테이션은 (@NotNull, @NotEmpty, @NotBlank) 모두 미입력(null) 체크 기능을 제공하지만, 각각의 특징을 잘 이해하고 적절하게 사용해야 합니다.

어노테이션null 인 경우공백 문자("")인 경우스페이스나 탭인 경우
@NotNull체크 에러허가허가
@NotEmpty체크 에러체크 에러허가
@NotBlank체크 에러체크 에러체크 에러

@NotEmpty, @NotBlank 는 컬렉션, 문자열, 배열용입니다. 정수(Integer 타입)에 사용하면 java.validation.UnexpectedTypeException 이 발생합니다. Integer 타입에는 @NotNull을 사용합니다.

  1. @Max

    • 설명: 필드가 특정 최댓값 이하인지를 검증합니다. 대부분 숫자형 필드에서 사용됩니다.

    • 예시:

      public class User {
          @Max(value = 100, message = "나이는 100 이하여야 합니다.")
          private int age;
          
          // 나머지 필드와 메서드 생략
      }
  2. @Min

    • 설명: 필드가 특정 최솟값 이상인지를 검증합니다. 주로 숫자형 필드에서 사용됩니다.

    • 예시:

      public class User {
          @Min(value = 18, message = "나이는 18 이상이어야 합니다.")
          private int age;
          
          // 나머지 필드와 메서드 생략
      }
  3. @Size

    • 설명: 문자열, 배열, 리스트 등의 크기를 검증합니다. 최소 크기와 최대 크기를 설정할 수 있습니다.

    • 예시:

      public class User {
          @Size(min = 3, max = 50, message = "이름은 3자 이상, 50자 이하여야 합니다.")
          private String username;
          
          // 나머지 필드와 메서드 생략
      }
  4. @AssertTrue

  • 설명: 필드가 true인지를 검증합니다. 주로 불린 값에 사용됩니다.

  • 예시:

    public class User {
        @AssertTrue(message = "이용 약관에 동의해야 합니다.")
        private boolean agreedToTerms;
        
        // 나머지 필드와 메서드 생략
    }
  1. @AssertFalse
  • 설명: 필드가 false인지를 검증합니다. 주로 불린 값에 사용됩니다.

  • 예시:

    public class User {
        @AssertFalse(message = "비밀번호를 공개설정으로 두지 마세요.")
        private boolean publicPassword;
        
        // 나머지 필드와 메서드 생략
    }
  1. @Pattern
  • 설명: 필드가 지정된 정규표현식과 일치하는지를 검증합니다. 주로 문자열에 사용됩니다.

  • 예시:

    public class User {
        @Pattern(regexp = "[a-zA-Z0-9]+", message = "영문자와 숫자만 허용됩니다.")
        private String username;
        
        // 나머지 필드와 메서드 생략
    }
  1. @Range
  • 설명: 숫자 필드가 지정된 범위 내에 있는지를 검증합니다.

  • 예시:

    public class Product {
        @Range(min = 1, max = 100, message = "가격은 1에서 100 사이여야 합니다.")
        private int price;
        
        // 나머지 필드와 메서드 생략
    }
  1. @DecimalMax **

    • 설명: 숫자 필드가 지정된 최댓값 이하인지를 검증합니다. 소수점을 포함한 숫자에 주로 사용됩니다.

    • 예시:

      import javax.validation.constraints.DecimalMax;
      
      public class Product {
          @DecimalMax(value = "1000.00", inclusive = true, message = "가격은 1000 이하이어야 합니다.")
          private BigDecimal price;
      
          // 나머지 필드와 메서드 생략
      }
      • value: 필드의 최댓값을 나타냅니다. 소수점 이하의 숫자도 지원하며, 문자열로 지정합니다.
      • inclusive: 기본값은 true로, 지정된 값과 같은지 여부를 나타냅니다. (true이면 이하, false이면 미만)
  1. @DecimalMin
  • 설명: 숫자 필드가 지정된 최솟값 이상인지를 검증합니다. 소수점을 포함한 숫자에 주로 사용됩니다.

  • 예시:

    import javax.validation.constraints.DecimalMin;
    
    public class Product {
        @DecimalMin(value = "0.50", inclusive = true, message = "가격은 0.50 이상이어야 합니다.")
        private BigDecimal price;
    
        // 나머지 필드와 메서드 생략
    }
    • value: 필드의 최솟값을 나타냅니다. 소수점 이하의 숫자도 지원하며, 문자열로 지정합니다.
    • inclusive: 기본값은 true로, 지정된 값과 같은지 여부를 나타냅니다. (true이면 이상, false이면 초과)
  1. @Digits

    • 설명: 숫자 필드의 정수 및 소수 자릿수를 검증합니다.

    • 예시:

      import javax.validation.constraints.Digits;
      
      public class Product {
          @Digits(integer = 5, fraction = 2, message = "5자리 정수 및 2자리 소수여야 합니다.")
          private BigDecimal price;
      
          // 나머지 필드와 메서드 생략
      }
      • integer: 정수 자릿수를 나타냅니다.
      • fraction: 소수 자릿수를 나타냅니다.
  1. @Future

    • 설명: 날짜나 시간 필드가 현재 시각 이후인지를 검증합니다.

    • 예시:

      import javax.validation.constraints.Future;
      
      public class Event {
          @Future(message = "이벤트 일자는 현재 이후여야 합니다.")
          private Date eventDate;
      
          // 나머지 필드와 메서드 생략
      }
  1. @Past

    • 설명: 날짜나 시간 필드가 현재 시각 이전인지를 검증합니다.

    • 예시:

      import javax.validation.constraints.Past;
      
      public class Document {
          @Past(message = "문서 작성일은 현재 이전이어야 합니다.")
          private Date creationDate;
      
          // 나머지 필드와 메서드 생략
      }
  1. @Valid

    • 설명: 중첩된 객체에 대한 검증을 활성화합니다. 주로 컨트롤러나 서비스에서 사용됩니다.

    • 예시:

      import javax.validation.Valid;
      
      public class Order {
          @Valid
          private Address shippingAddress;
      
          // 나머지 필드와 메서드 생략
      }
  1. @Length

    • 설명: 문자열 필드의 길이를 검증합니다.

    • 예시:

      import org.hibernate.validator.constraints.Length;
      
      public class Message {
          @Length(min = 5, max = 200, message = "메시지는 5자 이상 200자 이하여야 합니다.")
          private String content;
      
          // 나머지 필드와 메서드 생략
      }
  1. @Email
    • 설명: 문자열이 이메일 주소의 형식을 갖추고 있는지를 검증합니다.
    • 예시:
import org.hibernate.validator.constraints.Email;

public class User {
    @Email(message = "올바른 이메일 주소를 입력하세요.")
    private String email;

    // 나머지 필드와 메서드 생략
}
  1. @CreditCardNumber
    • 설명: 문자열이 신용카드 번호의 형식을 갖추고 있는지를 검증합니다.
    • 예시:
import org.hibernate.validator.constraints.CreditCardNumber;

public class Payment {
    @CreditCardNumber(message = "올바른 신용카드 번호를 입력하세요.")
    private String creditCardNumber;

    // 나머지 필드와 메서드 생략
}
  1. @URL
    • 설명: 문자열이 URL의 형식을 갖추고 있는지를 검증합니다.
    • 예시:
import org.hibernate.validator.constraints.URL;                    

public class Website {
    @URL(message = "올바른 URL을 입력하세요.")
    private String url;

    // 나머지 필드와 메서드 생략
}
profile
필기하고, 타이핑하고, 말하면서 읽고, 코딩하고, 눈으로 읽고 오감으로 공부하기

0개의 댓글