08장. 유효성 검사 알아보기

박근수·2024년 4월 13일
0

유효성 검사의 종류

유효성 검사란?

유효성 검사(validation)란 입력 내용이 요건에 만족하는지 그 타당성을 확인하는 입력 체크를 말함.

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

단일 항목 검사란?

입력 항목 하나에 대해 설정하는 입력 체크 기능. Form 클래스 등의 필드에 어노테이션을 부여해서 사용함.
어노테이션은 Java EE에서 제공하는 어노테이션(Bean Validator)이나 하이버네이트(Hibernate) 프레임워크에서 제공하는 어노테이션(Hibernate Validator) 이 있음

어노테이션기능 설명사용 예
@NotNullnull 값이 아닌 것을 검증@NotNull
Integer no;
@NotEmpty문자열이 null 혹은 공백문자("")가 아닌 것을 검증@NotEmpty
String name;
@NotBlank문자열이 null 혹은 공백(스페이스나 탭)이 아닌 것을 검증@NotBlank
String name;
@Max지정한 숫자 이하인 것을 검증@Max(100)
Integer price;
@Min지정한 숫자 이상인 것을 검증@Min(10)
Integer age;
@Size문자열이나 컬렉션이 지정한 범위의 크기 내인 것을 검증@Size(min=0, max=10)
List<> selected;
@AssertTrue값이 true인 것을 검증@AssertTrue
Boolean empty;
@AssertFalse값이 false인 것을 검증@AssertFalse
Boolean empty;
@Pattern지정한 정규 표현과 일치하는 것을 검증@Pattern(regexp="[a-zA-Z0-9]"
@Range지정한 숫자 범위 안에 있는 것을 검증@Range(min=1, max=10)
Integer point;
@Decimalmax지정한 숫자 이하인 것을 검증@DecimalMax("100.0")
BigDecimal val;
@DecimalMin지정한 숫자 이상인 것을 검증@DecimalMax("10.0")
BigDecimal val;
@Digits정수부와 소수부의 자릿수를 검증@Digits(integer=3, fraction=1)
BigDecimal val;
@Future미래의 날짜인 것을 검증@Future
Date date;
@Past과거의 날짜인 것을 검증@Past
Date date
@Valid중첩된 Form을 검증@Valid
SampleForm sampleForm;
@Length문자열 길이가 지정한 범위 안에 있는 것을 검증@Length(min=0,max=10)
String name;
@Email문자열이 이메일 주소 형식인지 검증@Email
String email;
@CreditCardNumber문자열이 신용카드 번호 형식인지 검증@CreditCardNumber
String card;
@URL문자열이 URL 형식인지 검증@URL
String url;

커스텀 유효성 검사란?

단일 항목 검사는 하나의 필드를 체크함. 여러 필드에 대해 혼잡해서 체크하는 것을 상관 항목 검사라고 함

  • Bean Validator을 사용하는 방법
  • 스프링 프레임워크에서 제공하는 Validator 인터페이스를 구현하는 방법

단일 항목 검사를 사용하는 프로그램 만들기

프로젝트 생성

  • Spring Boot DevTools(개발 툴)
  • Lombok(개발 툴)
  • Validation(I/O)
  • Thymeleaf(템플릿 엔진)
  • Spring Web(웹)

애플리케이션 레이어 생성

Form 클래스 생성

@Data
public class CalcForm {
    @NotNull(message = "왼족 : 숫자를 입력해주세요")
    @Range(min=1, max=10, message = "왼쪽 : {min}~{max} 범위의 숫자를 입력해주세요.")
    private Integer leftNum;

    @NotNull(message = "오른쪽 : 숫자를 입력해주세요")
    @Range(min=1, max=10, message = "오른쪽 : {min}~{max} 범위의 숫자를 입력해주세요.")
    private Integer rightNum;

}

컨트롤러 생성

@Controller
public class ValidationController {
    //form-backing bean 초기화
    @ModelAttribute
    public CalcForm setUpForm(){
        return new CalcForm();
    }
    //입력 화면 표시
    @GetMapping("show")
    public String showView(){
        return "entry";
    }
}

뷰 생성(입력 화면)

<body>
    <form action="@{/calc}" method="post" th:object="${calcForm}">
        <div>
            <input type="text" th:field="*{leftNum}">
            + <input type="text" th:field="*{rightNum}">
        </div>
      	<input type="submit" value="계산">
    </form>
</body>

컨트롤러에 추가

//확인 화면을 표시 : form 클래스 이용
    @PostMapping("calc")
    public String conFirmView(@Validated CalcForm form,
                              BindingResult bindingResult, Model model){
        //입력 체크에서 에러가 발생한 경우
        if(bindingResult.hasErrors()){
            //입력 화면으로
            return "entry";
        }
        //값 더하기
        Integer result = form.getLeftNum() + form.getRightNum();
        //Model에 저장
        model.addAttribute("result", result);

        //확인 화면으로
        return "confirm";

뷰에 추가(입력 화면)

 <!--에러 표시-->
        <ul th:if="${#fields.hasErrors('*)}">
            <li th:each="err:${#fields.errors('*')" th:text="${err}"></li>
        </ul>

메세지 관리에 대해 알아보기

일반적인 메시지 관리

애플리케이션에서 표시하는 메세지는 프로그램과 별도로 관리함. 메시지를 템플릿에서 분리해서 메시지만 프로퍼티파 파일로 관리하는 편히 유지관리가 편하기 때문

스프링 부트에서 메세지 관리하기

message.properties
#entry 화면용
title.entry = 입력화면
button.send = 계산
#CalcForm용
calcForm.leftNum=왼쪽
calcForm.rightNum=오른쪽

뷰 수정(입력 화면)

<title th:text="#{title.entry}">제목</title>
<button type="submit" th:text="#{button.send}"></button>

ValidationMessage.properties 생성

# 단일 항목 검사용 메세지
javax.validation.constraints.NotNull.message={0} : 숫자를 입력해주세요
org.hibernate.validator.constraints.Range.message ={0} : {min}~{max} 범위의 숫자를 입력해주세요.
# 형변환 체크용 메세지
typeMismatch.java.lang.Integer={0}은 정수를 입력해주세요.

Form 클래스 수정

 @NotNull
    @Range(min=1, max=10)
    private Integer leftNum;

    @NotNull
    @Range(min=1, max=10)
    private Integer rightNum;

유효성 검사 흐름

  1. 화면에서 id=100, name='' 으로 입력하고 [보내기] 버튼을 클릭
  2. 설정된 어노테이션으로 값을 검증
  3. 검증에서 에러가 발생하지 않으면 값을 요청 파라미터와 같은 필드에 저장하고, 에러가 발생하면 메세지를 취득
  4. 어노테이션과 같은 메세지를 취득
  5. 항목명과 같은 키 이름으로 값을 취득
  6. 메세지를 만들어서 송신
profile
개발블로그

0개의 댓글