티스토리 뷰

1. @Min, @Max를 이용한 숫자 범위 설정

 

(1) Development Process

  - 'Free Passes'필드를 새로운 폼에 추가

  - 0에서 10까지만 입력할 수 있고 벗어나면 validation error나오기

1) Customer class에 validation rule 추가하기

2) HTML form에 에러메세지 표기하기

3) Controller class에 Validation 수행하기

4) confirmation page 업데이트하기

 

(2) 코드 예시

1) Customer class에 validation rule 추가하기

public class Customer {
	
	//@NotNull(message="is required")
	@Min(value=0, message ="must be greater than or equal to zero")
	@Max(value=10, message="must be less than or equal to 10")
	private int freePasses;
	
    //getters & setters

2) HTML form에 에러메세지 표기하기

Free passes : <form:input path="freePasses"/>
		<form:errors path="freePasses" cssClass="error"/>

3) Controller class에 Validation 수행하기 -> 이미 @Valid통해서 설정되어 있다. 

 - 지난 post 참조

 

4) confirmation page 업데이트하기

Free passes : ${customer.freePasses}

 

2. Regular Expression(정규식)을 이용한 Spring MVC Validation

 

(1) 정규식이란 : 검색 패턴을 정의하는 문자 sequence

 - free tutorial : docs.oracle.com/javase/tutorial/essential/regex/

 

Lesson: Regular Expressions (The Java™ Tutorials > Essential Classes)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

(2) Development Process

  - 새로운 input field를 폼에 추가하기 : Postal Code

  - 유저는 오직 5개의 문자와 숫자를 입력할 수 있다.(정규식을 사용)

1) Custormer class에 validation rule 추가하기

2) HTML form에 에러메세지 표기하기

3) confirmation page 업데이트하기

 

(3) 코드예시

1) Custormer class에 validation rule 추가하기

	@Pattern(regexp = "^[a-zA-Z0-9]{5}", message="only 5 chars/digits")
	private String postalCode;
    
    // getters & setters

2),3)은 위의 @Min, @Max를 이용한 숫자 범위 설정방식과 동일함.

 

3. Integer field를 required로 만들어 주기 (Custom error message 만들기)

 

가장 처음 설정했던 freePasses 필드에 대해서 Required 조건을 주기 위해서 다음과 같이 @NotNull을 설정한다.

public class Customer {
	
	@NotNull(message="is required")
	@Min(value=0, message ="must be greater than or equal to zero")
	@Max(value=10, message="must be less than or equal to 10")
	private int freePasses;
	
    //getters & setters

그리고 실행해보면 다음과같은 에러가 발생한다.

이 에러가 뜨는 이유는 Controller에서 @InitBinder에서 설정해준 StringTrimmer때문인데, 공백을 null로 잘라주는데 int는 null이 될수 없기때문에 Integer로 바꾸면 문제를 해결 할 수 있다.

public class Customer {
	
	@NotNull(message="is required")
	@Min(value=0, message ="must be greater than or equal to zero")
	@Max(value=10, message="must be less than or equal to 10")
	private Integer freePasses;
	
    //getters & setters

따라서 위와같이 Integer로 바꿔주고 getter와 setter또한 Integer로 박싱을 시켜주면 문제는 해결된다.

하지만 이번엔 Integer type을 입력하는것이 아닌 String을 입력하면 다음과 같이 에러가 발생한다.

이 문제를 해결하기 위해서는 또 다른 방식이 필요하다.

* Int와 Integer같이 primitive type과 reference type에 대한 이해는 다음 페이지 참고

www.baeldung.com/java-primitives-vs-objects

 

Java Primitives versus Objects | Baeldung

A quick and practical comparison of objects and primitives in Java.

www.baeldung.com

 

(1) Development Process

1) custom 에러 메세지를 만든다

  - src/resources/messages.properties

2) custom message resource를 Spring config file에 로드시킨다.

  - WebContent/WEB-INF/spring-mvc-demo-servlet.xml

 

(2) 코드예시

 

1) custom 에러 메세지를 만든다

위와 같이 스프링 프로젝트의 src및에 resources폴더를 만들고 messages.properties파일을 만들어 위와같이 입력해준다.

 

2) custom message resource를 Spring config file에 로드시킨다.

<!-- Load custom message resources -->
	<bean id="messageSource"
	class="org.springframework.context.support.ResourceBundleMessageSource">
	
    	<property name="basenames" value="resources/messages"/>
	</bean>

위와같이 WebContent/WEB-INF/spring-mvc-demo-servlet.xml에 bean을 등록시켜준다.

 - Spring이 자동으로 '.properties'를 붙혀 주기때문에 명시할 필요 없다.

 

그러면

위와같이 String을 입력시 custom message로 설정한 "Invalid number"가 뜨는것을 확인할 수 있다.

위 과정을 조금 더 깊게 파고들면, 

CustomerController에서 binding result 객체를 조사해보면, validation process동안 무슨일이 일어나는지 해독할 좋은 많은 데이터가 있다. CustomerController의 processForm메소드의 BindingResult객체를 sysout으로 출력해 에러를 발생시키면 다음과 같은 내용이 출력된다.

위에 보면 왼쪽의 매우 특정한 에러부터 오른쪽으로 갈수록 매우 포괄적인 에러코드까지 전부 볼 수 있다.

이렇게 bindingResult를 출력해서 Spring이 사용하거나 찾는 모든 코드를 보여주는데, 그것을 overriding해서 custom message를 줄 수 있는것이다. (resource package를 만들고, 그안에 messages.properties를 통해서. 그리고 xml 설정파일에 custom message source를 로드할수 있게 설정해주면 된다... web 검색을 해보니 springboot에서 xml로 설정하는것이 아닌 자바 파일로 설정할 수 있다는 것을 알고.. 그냥 이런게 있다 하고 넘어가면 될듯 싶다.)

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday