[스프링 프레임워크 첫걸음] ( 8 / 9 )

박북velog·2023년 4월 29일
0

제 8장 유효성 검사 기능


8.1 유효성 검사의 종류

8.1.1 유효성 검사란 ?

입력 내용이 요건에 만족하는지 그 타당성을 확인하는 입력 체크를 말한다.

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

단일 항목 검사

입력 항목 하나에 대해 설정하는 입력 체크 기능. 클래스의 필드에 어노테이션을 부여해서 사용할 수 있다.

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

8.2 단일 항목 검사를 사용하는 프로그램

1. 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;
}

2. 컨트롤러 생성

@Controller
public class ValidationController {
	
	/** form-backing bean 초기화 */
	@ModelAttribute
	public CalcForm setUpForm() {
		return new CalcForm();
	}

	/** 입력 화면 표시 */
	@GetMapping("show")
	public String showView() {
		// 반환값으로 뷰 이름을 돌려줌
		return "entry";
	}
}

유효성 검사를 위해 form-backing bean 초기화 진행
@ModelAttribute 어노테이션을 사용하여 연결한다.

3. 뷰 생성 ( 입력 화면 )

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>입력 화면</title>
  </head>
<body>
<form th: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>
</html>

4. 컨트롤러에 추가

/** 확인 화면을 표시 : Form 클래스 이용 */
@PostMapping("calc")
public String confirmView(@Validated CalcForm form, BindingResult bindingResult, Model model) {
	// 입력 체크에서 에러가 발생한 경우
	if (bindingResult.hasError()) {
		// 입력 화면으로
		return "entry";
	}

	// 값 더하기
	Integer result = form.getLeftNum() + form.getRightNum();

	// Model에 저장
	model.addAttribute("result", result);

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

5. 뷰에 추가 ( 입력 화면 )

entry.html에 추가

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

6. 뷰 생성 ( 확인 화면 )

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>확인 화면</title>
  </head>
<body>
  <h2> 계산 결과 </h2>
  <h3>[[${calcForm.leftNum}]]+[[${calcForm.rightNum}]]=[[${result}]]</h3>
</body>
</html>

8.3 커스텀 유효성 검사기를 사용하는 프로그램

8.3.1 커스텀 유효성 검사기 생성

1. 클래스 생성

@Component
public class CalcValidator implements Validator {
	@Override
	public boolean supports(Class<?> clazz) {
		// 인수로 전달받은 Form이 입력 체크의 대상인지 논리값으로 돌려준다.
		return CalcForm.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors error) {
		// 대상 Form을 취득
		CalcForm form = (CalcForm) target;

		// 값이 입력되어 있는지
		if (form.getLeftNum() != null && form.getRightNum() != null) {
			// 왼쪽 입력 값이 홀수이고 오른쪽 입력 값이 짝수가 아닌 경우
			if (!((form.getLeftNum() % 2 == 1) && (form.getRightNum() % 2== 0))) {
				// 에러인 경우에는 Errors 인터페이스의 reject 메서드에
				// 에러 메시지의 키를 지정한다.
				error.reject("com.example.demo.validator.CalcValidator.message");
			}
		}
	}
}

2. message.properties에 추가

# 커스텀 유효성 검사용
com.example.demo.validator.CalcValidator.message=왼쪽에는 홀수를, 오른쪽에는 짝수를 입력해주세요.

3. 컨트롤러에 추가

@Autowired
CalcValidator calcValidator;

/** 커스텀 유효성 검사기 등록 */
@InitBinder("calcForm")
public void initBinder(WebDataBinder webDataBinder) {
	webDataBinder.addValidators(calcValidator);
}

@InitBinder 어노테이션에는 체크대상 Form 클래스의 Model 에 식별명을 지정한다.

profile
느리지만 끝까지 해보자구

0개의 댓글