Day087

RISK_TAKER·2023년 6월 5일
0

유효성 검사

  • 화면 뿐아니라 서버쪽에서도 유효성에 대한 검사하는 과정이 필요하다.

pom.xml에 아래의 mvn dependency를 추가

https://mvnrepository.com
1. Bean Validation API » 2.0.1.Final
2. Hibernate Validator Engine » 6.2.5.Final

  <properties>
      <javax.validation-version>2.0.1.Final</javax.validation-version>
      <org.hibernate.validator-version>6.2.5.Final</org.hibernate.validator-version>
  </properties>

  <dependencies>
      <dependency>
          <groupId>javax.validation</groupId>
          <artifactId>validation-api</artifactId>
          <version>${javax.validation-version}</version>
      </dependency>

          <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
      <dependency>
          <groupId>org.hibernate.validator</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>${org.hibernate.validator-version}</version>
      </dependency>
  </dependencies>

Controller(ValidationController.java)

  1. Url 직접 입력하고 들어오는 경로와 화면쪽에서 입력된 값을 검증하는 부분이 GET, POST방식으로 이루어지기 때문에 Mapping되는 페이지가 같아도 상관이 없다.

  2. 화면쪽에서 입력된 값들을 맵핑할 Dto클래스가 필요하다.(@Valid 어노테이션을 붙여줘야 한다.)

  3. 유효성 검사를 통과하지 못한 값들이 BindingResult 인터페이스에 저장이 된다.

  4. 잘못된 값들에 대한 처리를 한 이후 페이지를 이동한다.

  5. @InitBinder 어노테이션을 붙인 initBinder 메소드를 작성하여 별로도 만든 Validator를 등록하고 사용할 수 있다.

Dto(InputFormDto.java)

  • 화면에서 입력한 값을 받아서 처리하기 위한 용도로 만든 클래스

  • 유효성 검증 어노테이션 종류

	/*
	@AssertTrue 	: true
	@AssertFalse 	: false
	@Max			: value 값이 최대 (value값 보다 크면 오류)
	@Min			: value 값이 최소 (value값 보다 작으면 오류)
	@DecimalMax(value=, inclusive=true/false)	: value 값이 최대! true value<=, false value <
	 	ex) DecimalMax(value=100, inclusive=false) < 100
	 	ex) DecimalMax(value=100, inclusive=true) <= 100
	@DecimalMin(value=, inclusive=true/false)
	@Null		: Null 이어야 한다. (값이 없어야 정상)
	@NotNull	: Null 이 아니어야 한다. (값이 있어야 정상)
	@Digits(integer=3, fraction=5)	: 숫자 자릿수!! integer(정수형 3자리수)	fraction(소수점자릿수 5자리)
	@Size(min=5, max=10)			: 글자 자릿수 (5~10자리면 정상)
	@Pattern(regexp=정규식)			: 정규식에 맞아야 정상!
		ex) @Pattern(regexp="^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$");
	@NotEmpty		: 값이 뭐라도 있어야 정상! (띄어쓰기 입력하면 인정)
	@NotBlank		: 값이 뭐라도 있어야 정상! (띄어쓰기 제외, 뭐라도 입력)
	@Positive		: 양수가 들어와야 정상!
	@PositiveOrZero	: 양수 + 0 까지 인정
	@Negative		: 음수가 들어와야 정상!
	@NegativeOrZero : 음수 + 0 까지 인정
	@Email			: 이메일 형식이 맞아야한다. (입력값 사이에 @가 있는지 정도를 체크)
		ex) ab@cd : 이메일로 인정
	*/

입력 페이지(valid_form.jsp)

<label>input1<input type="text" name="input1" value="${inputFormDto.input1}"></label><br/><!-- maxlength="8" -->
		
<span class="errMsg">
  <spring:hasBindErrors name="inputFormDto">
    <c:if test="${errors.hasFieldErrors('input1')}">
      <!-- input1은 8~14자리 인데 잘못입력한것 같다. -->
      <spring:message code="${errors.getFieldError('input1').codes[0]}"></spring:message>
    </c:if>
    ${errors.getFieldError('input1').defaultMessage}
  </spring:hasBindErrors>
</span>

errors.properties 파일 생성

#valid_view 페이지 input 에러 메시지
Size.inputFormDto.input1=8~14자리로 입력해주세요.
Max.inputFormDto.input2=1000 아래로 입력해주세요.
NotBlank.inputFormDto.input3=필수 입력 항목입니다.
input2.hasError.inputFormDto.input2=자체적으로 만든 validator에서 나온 코드.
input1.sizeError.inputFormDto.input1=12자리는 안된다.
#other_page 페이지 input 에러메시지

직접 만든 Validator(InputFormDtoValidator.java)

  • Validator Interface를 구현한다.

  • support 메소드의 return 부분

	return InputFormDto.class.isAssignableFrom(clazz);
  • validate 메소드
    유효성 검증 작업을 처리하는 메소드 구현 부분
	InputFormDto inputFormDto = (InputFormDto)target;
		
	//8~14	//8~11	//12자리는 안된다.	13~14
	if(inputFormDto.getInput1().length() == 12) {
		//rejectValue(필드명, 에러코드, defaultMessage);
		errors.rejectValue("input1", "input1.sizeError", "12자리는 불가능");
	}

	errors.rejectValue("input2", "input2.hasError", "이러면 무조건 에러가 발생한다.");

property 파일 1개 / n개 등록하는 방법

	<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
		<!-- 1개 등록 -->
		<beans:property name="basename" value="/WEB-INF/properties/property01"></beans:property>
		<!-- n개 등록 -->
		<beans:property name="basenames">
			<beans:list>
				<beans:value>/WEB-INF/properties/property01</beans:value>
				<beans:value>/WEB-INF/properties/property02</beans:value>
				<beans:value>/WEB-INF/properties/property03</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>

0개의 댓글