포스코DX X 비트교육센터 6기 - Spring @Valid


validate

input 창에 대한 처리

성공 / 실패 (리다이랙션)

바인딩 결과를 넘겨주는 과정이 필요함.


	@RequestMapping(value="/join", method=RequestMethod.POST)
	public String join(@Valid UserVo userVo, BindingResult result, Model model) {
		if(result.hasErrors()) {
			model.addAllAttributes(result.getModel());
			return "user/join";
		}
		userService.join(userVo);
		return "redirect:/user/joinsuccess";
	}
  • pom.xml
<!-- validation -->
<dependency>
   <groupId>org.hibernate.validator</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>6.2.3.Final</version>
</dependency>
  • UserVo

image

(+) 정규표현식: [0-9a-zA-z]{8-16}

  • 아무 내용없이 가입하기를 누를 경우, join페이지로 redirect되며, 에러를 볼 수 있음.
	@RequestMapping(value="/join", method=RequestMethod.POST)
	public String join(@Valid UserVo userVo, BindingResult result, Model model) {
		if(result.hasErrors()) {
			System.out.println(result);
			//model.addAllAttributes(result.getModel());
			return "user/join";
		}
		userService.join(userVo);
		return "redirect:/user/joinsuccess";
	}

image

image

(+) 입력폼(JSP) 에서 에러 메세지 출력하기1

  • UserController.java
@RequestMapping(value="/join", method=RequestMethod.POST)
	public String join(@Valid UserVo userVo, BindingResult result, Model model) {
		if(result.hasErrors()) {
			//List<ObjectError> list =  result.getAllErrors();
			//for(ObjectError error : list) {
			//	System.out.println(error);
			//}
			model.addAllAttributes(result.getModel());
			return "user/join";
		}
		userService.join(userVo);
		return "redirect:/user/joinsuccess";
	}
  • Join.jsp

image

<spring:hasBindErrors name="userVo">
						<c:if test="${errors.hasFieldErrors('name') }">
					 	${errors.getFieldError("name").defaultMessage }
						</c:if>
					</spring:hasBindErrors>
  • 결과

image

image

에러 메시지는 두가지의 경우 랜덤으로 디폴트 메시지로 여겨서 하나만 나옴.

  • 추가 처리
		<input id="name" name="name" type="text" value="${userVo.name }">

value값을 통해 사용자가 join에 실패해도 이전 작성한 input입력 폼이 남아있도록 한다.

	@RequestMapping(value="/join", method=RequestMethod.POST)
	public String join(@ModelAttribute @Valid UserVo userVo, BindingResult result, Model model) {
		if(result.hasErrors()) {
			//List<ObjectError> list =  result.getAllErrors();
			//for(ObjectError error : list) {
			//	System.out.println(error);
			//}
			model.addAllAttributes(result.getModel());
			return "user/join";
		}
		userService.join(userVo);
		return "redirect:/user/joinsuccess";
	}

@ModelAttribute 추가를 통해 Controller에 저장이되고 Controller에서 JSP로 특별하게 보내는 코드도 없어 보이는데 JSP 코드에서 저렇게 값이 정상적으로 출력

image

(+) 입력폼(JSP) 에서 에러 메세지 출력하기2 (default message가 맘에 들지 않고, 나의 메시지를 띄우려고 하는 경우 + 다국어 버전을 사용하는 경우)

  • join.jsp
	<p style="padding:3px 0 0; text-align:left; color:#f00;">
						<spring:hasBindErrors name="userVo">
							<c:if test="${errors.hasFieldErrors('name') }">
					 	<spring:message code='${errors.getFieldError("name").codes[0] }'/>
						</c:if>
						</spring:hasBindErrors>
					</p>
  • spring-servlet (다국어 설정 과정도 이곳에서 이루어짐.)
	<!-- 6. MessageSource -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>messages/messages_ko</value>
				<value>messages/messages_en</value>
			</list>
		</property>
	</bean>
  • 다음 내용을 파일에 담을 것이다. 미리 메모장에 적어둔다.
다국어 버전을 만들어가는 과정 포함

messages_ko.properties

user.join.label.password =  비밀번호

NotEmpty.userVo.name = 사용자 이름은 필수 입니다.
Length.uerVo.name = 사용자 이름은 2~8자이어야 합니다.

NotEmpty.userVo.email = 사용자 메일은 필수 입니다.
Email.uerVo.email= 메일 형식이 맞지 않습니다.

NotEmpty.userVo.password = 사용자 비밀번호는 필수 입니다.
Length.uerVo.password= 사용자 비밀번호는 2~8자이어야 합니다.



messages_en.properties

user.join.label.password = password


NotEmpty.userVo.name = user name is nes..
Length.uerVo.name = user name

messages_cn.properties
NotEmpty.userVo.name = user name is nes..
Length.uerVo.name = user name

  • properties에서 다음 설정을 알아 본다. (UTF-8로 들어가면 안됨.)

image

  • 폴더와 파일을 생성한다.

image

  • 메모장 내용을 갖다 붙히면 알아서 엔코딩 된다.

image

image

  • 다국어 지원을 해주려면,
user.join.label.password=비밀번호
user.join.label.password=password

를 각 파일에 넣어준다.

image

그리고 join.jsp에서 다음을 넣어주면!! 된다.

image

(+) 입력폼(JSP) 에서 에러 메세지 출력하기3

<%@ taglib uri="http://www.springframework.org/tags" prefix="form"%>

내부에서 html을 만드는 태그 라이브러리 (내부는 자바 코드)

join.jsp 상단에 붙여준다.

image

:form 과 input을 추가

controller에서도 @ModelAttribute 를 추가

image

join.jsp

<label class="block-label" for="email">이메일</label>
					<input id="email" name="email" type="text" value="">
					<form:input path="email" />
					<input type="button" value="중복체크">
					<p style="padding:3px 0 5px 0; text-align: left; color: #f00">
						<form:errors path="email" />
					</p>
					

(+) 체크박스

<fieldset>
						<legend>성별</legend>
						<form:radiobutton path="gender" value="female" label="여" checked="checked" />
						<form:radiobutton path="gender" value="male" label="남" checked="checked" />
					</fieldset>