관리 메뉴

거니의 velog

231128_SPRING 2 (5-1) 본문

대덕인재개발원/대덕인재개발원_웹기반 애플리케이션

231128_SPRING 2 (5-1)

Unlimited00 2023. 11. 28. 08:32

[JSPFormSelectboxTagController.java]

package kr.or.ddit.controller.jsp.selectbox;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/formtag/selectbox")
public class JSPFormSelectboxTagController {

	/*
	 * 		11. 셀렉트 박스 요소
	 * 
	 * 			- HTML 셀렉트 박스를 출력하려면 <form:select> 요소를 사용한다.
	 */
	
	@RequestMapping(value = "/registerFormSelectBox01", method = RequestMethod.GET)
	public String registerFormSelectBox01(Model model) {
		log.info("registerFormSelectBox01() 실행...!");
		
		Map<String, String> nationalityCodeMap = new HashMap<String, String>();
		nationalityCodeMap.put("01", "Korea");
		nationalityCodeMap.put("02", "Canada");
		nationalityCodeMap.put("03", "Austrailia");
		
		model.addAttribute("nationalityCodeMap", nationalityCodeMap);
		model.addAttribute("member", new Member());
		
		return "home/formtag/selectbox/registerFormSelectBox01";
	}
	
}

[registerFormSelectBox01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerFormSelectBox01</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/selectbox/result">
			<table border="1">
				<tr>
					<td>국적</td>
					<td>
						<form:select path="nationality" items="${nationalityCodeMap }" multiple="true"></form:select>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/formtag/selectbox/registerFormSelectBox01


	@RequestMapping(value = "/registerFormSelectBox02", method = RequestMethod.GET)
	public String registerFormSelectBox02(Model model) {
		log.info("registerFormSelectBox02() 실행...!");
		
		List<CodeLabelValue> nationalityCodeList = new ArrayList<CodeLabelValue>();
		nationalityCodeList.add(new CodeLabelValue("01", "Korea"));
		nationalityCodeList.add(new CodeLabelValue("02", "Canada"));
		nationalityCodeList.add(new CodeLabelValue("03", "Austrailia"));
		
		model.addAttribute("nationalityCodeList", nationalityCodeList);
		model.addAttribute("member", new Member());
		
		return "home/formtag/selectbox/registerFormSelectBox02";
	}

[registerFormSelectBox02.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerFormSelectBox02</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/selectbox/result">
			<table border="1">
				<tr>
					<td>국적</td>
					<td>
						<form:select path="nationality" items="${nationalityCodeList }" multiple="true" itemValue="value" itemLabel="label"></form:select>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/formtag/selectbox/registerFormSelectBox02


	@RequestMapping(value = "/registerFormSelectBox03", method = RequestMethod.GET)
	public String registerFormSelectBox03(Model model) {
		log.info("registerFormSelectBox03() 실행...!");
		
		List<CodeLabelValue> carCodeList = new ArrayList<CodeLabelValue>();
		carCodeList.add(new CodeLabelValue("01", "Jeep"));
		carCodeList.add(new CodeLabelValue("02", "Bmw"));
		carCodeList.add(new CodeLabelValue("03", "Audi"));
		
		model.addAttribute("carCodeList", carCodeList);
		model.addAttribute("member", new Member());
		
		return "home/formtag/selectbox/registerFormSelectBox03";
	}

[registerFormSelectBox03.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerFormSelectBox03</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/selectbox/result">
			<table border="1">
				<tr>
					<td>차량</td>
					<td>
						<form:select path="carList" multiple="true">
							<form:option value="" label="---선택---" />
							<form:options items="${carCodeList }" itemValue="value" itemLabel="label" />
						</form:select>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/formtag/selectbox/registerFormSelectBox03


[JSPFormHiddenTagController.java]

package kr.or.ddit.controller.jsp.hidden;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/formtag/hidden")
public class JSPFormHiddenTagController {

	/*
	 * 		12. 숨겨진 필드 요소
	 * 
	 * 			- HTML 숨겨진 필드를 출력하려면 <form:hidden> 요소를 사용한다.
	 */
	
	@RequestMapping(value = "/registerFormHidden01", method = RequestMethod.GET)
	public String registerFormHidden01(Model model) {
		log.info("registerFormHidden01() 실행...!");
		
		Member member = new Member();
		member.setUserId("hong123");
		member.setUserName("홍길순");
		model.addAttribute("member", member);
		return "home/formtag/hidden/registerFormHidden01";
	}
	
}

[registerFormHidden01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerFormHidden01</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/hidden/result">
			<form:hidden path="userId"/>
			<table border="1">
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/formtag/hidden/registerFormHidden01


[JSPFormButtonTagController.java]

package kr.or.ddit.controller.jsp.button;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/formtag/button")
public class JSPFormButtonTagController {

	/*
	 * 		14. 버튼 요소
	 * 
	 * 			- HTML 버튼을 출력하면 <form:button> 요소를 사용한다.
	 */
	
	@RequestMapping(value = "/registerFormButton01", method = RequestMethod.GET)
	public String registerFormButton01(Model model) {
		log.info("registerFormButton01() 실행...!");
		Member member = new Member();
		model.addAttribute("member", member);
		return "home/formtag/button/registerFormButton01";
	}
	
}

[registerFormButton01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerFormButton01</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/button/result">
			<table border="1">
				<tr>
					<td>유저 ID</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
				<tr>
					<td>E-Mail</td>
					<td>
						<form:input path="email"/>
						<font color="red">
							<form:errors path="email" />
						</font>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

[registerForLabel01.java]

package kr.or.ddit.controller.jsp.label;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/formtag/label")
public class JSPFormLabelTagController {

	/*
	 * 		13. 라벨 요소
	 * 
	 * 			- HTML 라벨을 출력하려면 <form:label> 요소를 사용한다.
	 */
	
	@RequestMapping(value = "/registerFormLabel01", method = RequestMethod.GET)
	public String registerFormLabel01(Model model) {
		log.info("registerFormLabel01() 실행...!");
		model.addAttribute("member", new Member());
		return "home/formtag/label/registerFormLabel01";
	}
	
}

[registerForLabel01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerForLabel01</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/label/result">
			<table border="1">
				<tr>
					<td>
						<form:label path="userId">유저 ID</form:label>
					</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/formtag/label/registerFormLabel01


[JSPFormValidationController.java]

package kr.or.ddit.controller.jsp.validation;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/formtag/validation")
public class JSPFormValidationController {
	
	/*
	 * 		15. 입력값 검증 에러
	 * 
	 * 			- 입력값 검증 에러를 출력하려면 <form:errors> 요소를 사용한다.
	 */

	@RequestMapping(value = "/registerFormValidation01", method = RequestMethod.GET)
	public String registerFormValidation01(Model model) {
		log.info("registerFormValidation01() 실행...!");
		model.addAttribute("member", new Member());
		return "home/formtag/validation/registerFormValidation01";
	}
	
}

[registerFormValidation01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerFormValidation01</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/formtag/validation/result">
			<table border="1">
				<tr>
					<td>유저 ID</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
				<tr>
					<td>E-Mail</td>
					<td>
						<form:input path="email"/>
						<font color="red">
							<form:errors path="email" />
						</font>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

package kr.or.ddit.controller.jsp.validation;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/formtag/validation")
public class JSPFormValidationController {
	
	/*
	 * 		15. 입력값 검증 에러
	 * 
	 * 			- 입력값 검증 에러를 출력하려면 <form:errors> 요소를 사용한다.
	 */

	@RequestMapping(value = "/registerFormValidation01", method = RequestMethod.GET)
	public String registerFormValidation01(Model model) {
		log.info("registerFormValidation01() 실행...!");
		model.addAttribute("member", new Member());
		return "home/formtag/validation/registerFormValidation01";
	}
	
	@RequestMapping(value = "/result", method = RequestMethod.POST)
	public String registerFormValidationResult(Member member) {
		log.info("registerFormValidationResult() 실행...!");
		
		log.info("userId : " + member.getUserId());
		log.info("userName : " + member.getUserName());
		log.info("email : " + member.getEmail());
		
		return "home/formtag/validation/result";
	}
	
}

[result.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RESULT</title>
	</head>
	<body>
		
		<h2>Result</h2>
		유저 ID : ${member.userId }<br />
		이름 : ${member.userName }<br />
		E-Mail : ${member.email }<br />
		
	</body>
</html>

- http://localhost/formtag/validation/registerFormValidation01


에러 검증이 안된다


[ValidationController.java]

package kr.or.ddit.controller.validation;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/validation")
public class ValidationController {

	/*
	 * [ 9장 : 입력 유효성 검증 ]
	 * 
	 * 		1. 입력값 검증
	 * 
	 * 			- 스프링 MVC Bean Validaion 기능을 이용해 요청 파라미터 값이 바인딩된 도메인 클래스 (또는 커맨드 클래스)의 입력값 검증을 한다.
	 * 
	 * 			[환경설정]
	 * 			# 의존 관계 상이
	 * 			- 입력값 검증을 위한 의존 라이브러리를 추가한다.
	 * 			- pom.xml에서 hibernate-validator 추가
	 * 
	 * 			# 입력값 검증 활성화
	 * 			- Member 클래스로 넘어가서 임시 테스트로 userId, userName 규칙을 활성화한다.
	 * 			- 이 때, 규칙을 활성화하기 위해서 사용할 어노테이션이 있다.
	 * 				> @Validates를 지정한다.
	 * 				> 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의한다.
	 * 					BindingResult에는 요청 데이터의 바인딩 오류와 입력값 검증 오류 정보가 저장된다.
	 * 
	 * 			# 입력값 검증 환경설정 순서
	 * 			1. 입력값 검증을 위한 의존 라이브러리 추가
	 * 			2. 입력값 검증 활성화
	 * 				> 활성화를 할 도메인 클래스 안에 @Validated 어노테이션을 지정한다.
	 * 			3. 도메인 클래스 내 필드에다가 검증을 위한 어노테이션들로 데이터 검증을 설정한다 (@NotBlank, @Size 등등)
	 * 			4. 에러를 받을 BindingResult를 설정한다. (컨트롤러 메서드 내에 설정한다.)
	 */
	
	@RequestMapping(value = "/registerValidationForm01", method = RequestMethod.GET)
	public String registerValidationForm01(Model model) {
		log.info("registerValidationForm01() 실행...!");
		model.addAttribute("member", new Member());
		return "validation/registerValidationForm01";
	}
	
}

[registerValidationForm01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerValidationForm01</title>
	</head>
	<body>
		
		<form:form modelAttribute="member" method="post" action="/validation/result">
			<table border="1">
				<tr>
					<td>유저 ID</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
				<tr>
					<td>패스워드</td>
					<td>
						<form:input path="password"/>
						<font color="red">
							<form:errors path="password" />
						</font>
					</td>
				</tr>
				<tr>
					<td>E-Mail</td>
					<td>
						<form:input path="email"/>
						<font color="red">
							<form:errors path="email" />
						</font>
					</td>
				</tr>
				<tr>
					<td>성별</td>
					<td>
						<form:radiobutton path="gender" value="male" label="Male"/>
						<form:radiobutton path="gender" value="female" label="Female"/>
						<form:radiobutton path="gender" value="other" label="Other"/>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

[pom.xml]

		<!--  
			입력값을 검증하기 위한 라이브러리 의존 관계 정의
		-->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.4.2.Final</version>
		</dependency>
package kr.or.ddit.controller.validation;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/validation")
public class ValidationController {

	/*
	 * [ 9장 : 입력 유효성 검증 ]
	 * 
	 * 		1. 입력값 검증
	 * 
	 * 			- 스프링 MVC Bean Validaion 기능을 이용해 요청 파라미터 값이 바인딩된 도메인 클래스 (또는 커맨드 클래스)의 입력값 검증을 한다.
	 * 
	 * 			[환경설정]
	 * 			# 의존 관계 상이
	 * 			- 입력값 검증을 위한 의존 라이브러리를 추가한다.
	 * 			- pom.xml에서 hibernate-validator 추가
	 * 
	 * 			# 입력값 검증 활성화
	 * 			- Member 클래스로 넘어가서 임시 테스트로 userId, userName 규칙을 활성화한다.
	 * 			- 이 때, 규칙을 활성화하기 위해서 사용할 어노테이션이 있다.
	 * 				> @Validates를 지정한다.
	 * 				> 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의한다.
	 * 					BindingResult에는 요청 데이터의 바인딩 오류와 입력값 검증 오류 정보가 저장된다.
	 * 
	 * 			# 입력값 검증 환경설정 순서
	 * 			1. 입력값 검증을 위한 의존 라이브러리 추가
	 * 			2. 입력값 검증 활성화
	 * 				> 활성화를 할 도메인 클래스 안에 @Validated 어노테이션을 지정한다.
	 * 			3. 도메인 클래스 내 필드에다가 검증을 위한 어노테이션들로 데이터 검증을 설정한다 (@NotBlank, @Size 등등)
	 * 			4. 에러를 받을 BindingResult를 설정한다. (컨트롤러 메서드 내에 설정한다.)
	 */
	
	@RequestMapping(value = "/registerValidationForm01", method = RequestMethod.GET)
	public String registerValidationForm01(Model model) {
		log.info("registerValidationForm01() 실행...!");
		model.addAttribute("member", new Member());
		return "validation/registerValidationForm01";
	}
	
	@RequestMapping(value = "/result", method = RequestMethod.POST)
	public String registerValidationFormResult(@Validated Member member, BindingResult result) {
		log.info("registerValidationFormResult() 실행...!");
		
		log.info("userId : " + member.getUserId());
		log.info("userName : " + member.getUserName());
		
		if(result.hasErrors()) {
			return "validation/registerValidationForm01";
		}
		
		return "validation/success";
	}
	
}

[success.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>SUCCESS</title>
	</head>
	<body>
		
		<h2>유저 등록이 완료되었습니다!</h2>
		<p>${member.userName }님! 등록이 완료되었습니다!</p>
		
	</body>
</html>

- http://localhost/validation/registerValidationForm01


[Member.java]

package kr.or.ddit.vo;

import java.util.Date;
import java.util.List;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class Member {
	@NotBlank
	private String userId = "a001";
	@NotBlank
	@Size(max = 3) // 이름은 3글자를 넘어가면 안 됨
	private String userName = "hongkd";
	private String password = "1234";
	private int coin = 100;
	@DateTimeFormat(pattern = "yyyy/MM/dd")
	private Date dateOfBirth;
	
	private String email;
	private String gender;
	private String hobby;
	private String[] hobbyArray;
	private List<String> hobbyList;
	private boolean foreigner;
	private String developer;
	private String nationality;
	private Address address;
	private List<Card> cardList;
	private String cars;
	private String[] carArray;
	private List<String> carList;
	private String introduction;
	private String birthDay;
	
}


	/*
	 * 		2. 입력값 검증 결과
	 * 
	 * 			- 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의한다.
	 * 
	 * 			# BindingResult에는 요청 데이터의 바인딩 에러와 입력값 검증 에러 정보가 저장된다.
	 * 
	 * 			1) 에러 정보 확인을 위한 BindingResult 메서드
	 * 
	 * 				hasErrors()
	 * 				- 에러가 발생한 경우 true를 반환한다.
	 * 				hasGlobalErrors()
	 * 				- 객체 레벨의 에러가 발생한 경우 true를 반환한다.
	 * 				hasFieldErrors()
	 * 				- 필드 레벨의 에러가 발생한 경우 true를 반환한다.
	 * 				hasFieldErrors(String)
	 * 				- 인수에 지정한 필드에서 에러가 발생한 경우 true를 반환한다.
	 */
	
	@RequestMapping(value = "/registerValidationForm02", method = RequestMethod.GET)
	public String registerValidationForm02(Model model) {
		log.info("registerValidationForm02() 실행...!");
		model.addAttribute("member", new Member());
		return "validation/registerValidationForm02";
	}
	
	@RequestMapping(value = "/result2", method = RequestMethod.POST)
	public String registerValidationForm02Result(@Validated Member member, BindingResult result) {
		
		log.info("registerValidationForm02Result() 실행...!");
		log.info("result.hasError() : " + result.hasErrors());
		
		if(result.hasErrors()) { // 에러 정보가 존재
			List<ObjectError> allErrors = result.getAllErrors();
			List<ObjectError> globalErrors = result.getGlobalErrors();
			List<FieldError> fieldErrors = result.getFieldErrors();
			
			log.info("allErrors.size() : " + allErrors.size());
			log.info("globalErrors.size( : " + globalErrors.size());
			log.info("fieldErrors.size() : " + fieldErrors.size());
			
			// 객체와 필드 레벨의 에러정보 모두를 출력한다.
			for(int i = 0; i < allErrors.size(); i++) {
				ObjectError objError = allErrors.get(i);
				log.info("allError : " + objError + "\n");
			}
			
			// 객체 레벨의 에러정보를 출력한다.
			for(int i = 0; i < globalErrors.size(); i++) {
				ObjectError objError = globalErrors.get(i);
				log.info("globalError : " + objError + "\n");
			}
			
			// 필드 레벨의 에러정보를 출력한다.
			for(int i = 0; i < fieldErrors.size(); i++) {
				FieldError fieldError = fieldErrors.get(i);
				log.info("fieldError : " + fieldError + "\n");
				log.info("fieldError.getDefaultMessage : " + fieldError.getDefaultMessage());
			}
			
			return "validation/registerValidationForm02";
		}
		
		log.info("userId : " + member.getUserId());
		log.info("userName : " + member.getUserName());
		log.info("email : " + member.getEmail());
		log.info("gender : " + member.getGender());
		return "validation/success";
		
	}

[registerValidationForm02.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerValidationForm02</title>
	</head>
	<body>
		<!--  
			[입력값 검증 결과 테스트 시나리오]
			1. 사용자 아이디를 빈 값으로 입력 후 진행
			2. 사용자 이름을 빈 값으로 입력 후 진행
			3. 사용자 이름의 길이를 최대값보다 크게 입력(max=3)
		-->
		<form:form modelAttribute="member" method="post" action="/validation/result2">
			<table border="1">
				<tr>
					<td>유저 ID</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
				<tr>
					<td>패스워드</td>
					<td>
						<form:input path="password"/>
						<font color="red">
							<form:errors path="password" />
						</font>
					</td>
				</tr>
				<tr>
					<td>E-Mail</td>
					<td>
						<form:input path="email"/>
						<font color="red">
							<form:errors path="email" />
						</font>
					</td>
				</tr>
				<tr>
					<td>생년월일</td>
					<td>
						<form:input path="dateOfBirth" type="date"/>
						<font color="red">
							<form:errors path="dateOfBirth" />
						</font>
					</td>
				</tr>
				<tr>
					<td>성별</td>
					<td>
						<form:radiobutton path="gender" value="male" label="Male"/>
						<form:radiobutton path="gender" value="female" label="Female"/>
						<form:radiobutton path="gender" value="other" label="Other"/>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/validation/registerValidationForm02


	/*
	 * 		3. 입력값 검증 규칙
	 * 
	 * 			- 입력값 검증 규칙은 Bean Validation이 제공하는 제약 어노테이션으로 설정한다.
	 * 
	 * 				검사 규칙은 크게 세가지로 분류할 수 있다.
	 * 				- Bean Validation 표준 제약 어노테이션
	 * 				- 서드파티에서 구현한 제약 어노테이션(서드파티란 제3자에서 만든~)
	 * 				- 직접 구현한 제약 어노테이션
	 * 
	 * 				1) Member 클래스에서 테스트를 위한 어노테이션으로 설정 (아래 명시되어 있는 내용들을 가지고 테스트 해보시길!)
	 * 				- @NotNull				: 빈 값이 아닌지를 검사한다.
	 * 				- @Null					: null 인지를 검사한다.
	 * 				- @NotBlank				: 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사한다.
	 * 				- @NotEmpty				: 문자열이 null이거나 비어있는지 검사한다.
	 * 				- @Size					: 글자수나 컬렉션의 요소 개수를 검사한다.
	 * 					> @Size(max=, min=)
	 * 				- @Max(value=)			: value보다 작거나 같은걸 검사한다.
	 * 				- @Min(value=)			: value보다 크거나 같은걸 검사한다.
	 * 				- @Email				: email 주소 형식인지를 검사한다.
	 * 				- @Past					: 과거 날짜인지를 검사한다.
	 * 				- @Future				: 미래 날짜인지를 검사한다.
	 * 				- @Pattern(regexp=)		: CharSequence는 지정된 정규식과 일치해야 하고, 정규식은 Java 정규식 규칙을 따른다.
	 * 				- @Positive				: 양수여야합니다(0은 에러)
	 * 				- @PositiveOrZero		: 양수 또는 0이어야 합니다.
	 * 				- @Length(min=, max=)	: 문자열의 길이가 min과 max 사이인지 확인한다.
	 * 
	 * 				[테스트]
	 * 				- Member 클래스의 검증 활성화 추가
	 * 					> userId, password, userName, email, dateOfBirth
	 * 				- 테스트는 registerValidationForm02에서 진행 (시나리오를 기반으로)
	 */
package kr.or.ddit.vo;

import java.util.Date;
import java.util.List;

import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class Member {
	// 입력값 검증 규칙을 지정한다.
	
	// 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사한다.
	@NotBlank(message = "아이디를 입력해주세요! X_X")
	private String userId = "a001";
	@NotBlank(message = "이름을 입력해주세요! X_X")
	@Size(max = 3) // 이름은 3글자를 넘어가면 안 됨
	private String userName = "hongkd";
	@NotBlank(message = "비밀번호는 필수!")
	private String password = "1234";
	private int coin = 100;
	// 과거 날짜인지를 검사한다.
	@Past
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date dateOfBirth;
	// 이메일 주소 형식인지를 검사한다.
	@Email
	private String email;
	private String gender;
	private String hobby;
	private String[] hobbyArray;
	private List<String> hobbyList;
	private boolean foreigner;
	private String developer;
	private String nationality;
	private Address address;
	private List<Card> cardList;
	private String cars;
	private String[] carArray;
	private List<String> carList;
	private String introduction;
	private String birthDay;
	
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerValidationForm02</title>
	</head>
	<body>
		<!--  
			[입력값 검증 결과 테스트 시나리오]
			1. 사용자 아이디를 빈 값으로 입력 후 진행
			2. 사용자 이름을 빈 값으로 입력 후 진행
			3. 사용자 이름의 길이를 최대값보다 크게 입력(max=3)
			
			[입력값 검증 결과 테스트 시나리오]
			1. 유효한 데이터 입력
			2. 사용자 아이디를 빈 값으로 입력 후 진행
			3. 사용자 이름을 빈 값으로 입력 후 진행
			4. 사용자 이름이 길이를 최대값보다 크게 입력
			5. 사용자 이메일 주소를 형식에 맞지 않게 입력
			6. 사용자 생년월일을 과거가 아닌 날짜로 입력
		-->
		<form:form modelAttribute="member" method="post" action="/validation/result2">
			<table border="1">
				<tr>
					<td>유저 ID</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
				<tr>
					<td>패스워드</td>
					<td>
						<form:input path="password"/>
						<font color="red">
							<form:errors path="password" />
						</font>
					</td>
				</tr>
				<tr>
					<td>E-Mail</td>
					<td>
						<form:input path="email"/>
						<font color="red">
							<form:errors path="email" />
						</font>
					</td>
				</tr>
				<tr>
					<td>생년월일</td>
					<td>
						<form:input path="dateOfBirth" type="date"/>
						<font color="red">
							<form:errors path="dateOfBirth" />
						</font>
					</td>
				</tr>
				<tr>
					<td>성별</td>
					<td>
						<form:radiobutton path="gender" value="male" label="Male"/>
						<form:radiobutton path="gender" value="female" label="Female"/>
						<form:radiobutton path="gender" value="other" label="Other"/>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>

- http://localhost/validation/registerValidationForm02



	/*
	 * 		4. 중첩된 자바빈즈 입력값 검증
	 * 
	 * 			- 중첩된 자바빈즈와 자바빈즈의 컬렉션에서 정의한 프로퍼티에 대해 입력값 검증을 할 때는 @Valid를 지정한다.
	 * 
	 * 				1) 중첩된 자바빈즈 클래스를 정의하고 @Valid를 지정한다.
	 * 
	 * 					- Member 클래스 내 Address address 필드에 @Valid 어노테이션을 지정
	 * 					- Member 클래스 내 List<Card> cardList 필드에 @Valid 어노테이션을 지정
	 * 
	 * 				2) Address 클래스 내에도 validation을 설정한다.
	 * 				3) Card 클래스 내에도 validation을 설정한다.
	 */
	
	@RequestMapping(value = "/registerValidationForm03", method = RequestMethod.GET)
	public String registerValidationForm03(Model model) {
		log.info("registerValidationForm03() 실행...!");
		model.addAttribute("member", new Member());
		return "validation/registerValidationForm03";
	}

[registerValidationForm03.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>registerValidationForm03</title>
	</head>
	<body>
		<!--  
			[입력값 검증 결과 테스트 시나리오]
			1. 유효한 데이터 입력
			2. 우편번호를 빈 값으로 입력
			3. 카드번호를 빈 값으로 입력
			4. 카드 유효년월 과거 날짜 입력
		-->
		<form:form modelAttribute="member" method="post" action="/validation/result3">
			<table border="1">
				<tr>
					<td>유저 ID</td>
					<td>
						<form:input path="userId"/>
						<font color="red">
							<form:errors path="userId" />
						</font>
					</td>
				</tr>
				<tr>
					<td>이름</td>
					<td>
						<form:input path="userName"/>
						<font color="red">
							<form:errors path="userName" />
						</font>
					</td>
				</tr>
				<tr>
					<td>패스워드</td>
					<td>
						<form:input path="password"/>
						<font color="red">
							<form:errors path="password" />
						</font>
					</td>
				</tr>
				<tr>
					<td>E-Mail</td>
					<td>
						<form:input path="email"/>
						<font color="red">
							<form:errors path="email" />
						</font>
					</td>
				</tr>
				<tr>
					<td>생년월일</td>
					<td>
						<form:input path="dateOfBirth" type="date"/>
						<font color="red">
							<form:errors path="dateOfBirth" />
						</font>
					</td>
				</tr>
				<tr>
					<td>우편번호</td>
					<td>
						<form:input path="address.postCode"/>
						<font color="red">
							<form:errors path="address.postCode" />
						</font>
					</td>
				</tr>
				<tr>
					<td>주소</td>
					<td>
						<form:input path="address.location"/>
						<font color="red">
							<form:errors path="address.location" />
						</font>
					</td>
				</tr>
				<tr>
					<td>카드1 - 번호</td>
					<td>
						<form:input path="cardList[0].no"/>
						<font color="red">
							<form:errors path="cardList[0].no" />
						</font>
					</td>
				</tr>
				<tr>
					<td>카드1 - 유효년월</td>
					<td>
						<form:input path="cardList[0].validMonth"/>
						<font color="red">
							<form:errors path="cardList[0].validMonth" />
						</font>
					</td>
				</tr>
				<tr>
					<td>카드2 - 번호</td>
					<td>
						<form:input path="cardList[1].no"/>
						<font color="red">
							<form:errors path="cardList[1].no" />
						</font>
					</td>
				</tr>
				<tr>
					<td>카드2 - 유효년월</td>
					<td>
						<form:input path="cardList[1].validMonth"/>
						<font color="red">
							<form:errors path="cardList[1].validMonth" />
						</font>
					</td>
				</tr>
			</table>
			<form:button name="register">등록</form:button>
		</form:form>
		
	</body>
</html>
package kr.or.ddit.vo;

import java.util.Date;
import java.util.List;

import javax.validation.Valid;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class Member {
	// 입력값 검증 규칙을 지정한다.
	
	// 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사한다.
	@NotBlank(message = "아이디를 입력해주세요! X_X")
	private String userId = "a001";
	@NotBlank(message = "이름을 입력해주세요! X_X")
	@Size(max = 3) // 이름은 3글자를 넘어가면 안 됨
	private String userName = "hongkd";
	@NotBlank(message = "비밀번호는 필수!")
	private String password = "1234";
	private int coin = 100;
	// 과거 날짜인지를 검사한다.
	@Past
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date dateOfBirth;
	// 이메일 주소 형식인지를 검사한다.
	@Email
	private String email;
	private String gender;
	private String hobby;
	private String[] hobbyArray;
	private List<String> hobbyList;
	private boolean foreigner;
	private String developer;
	private String nationality;
	// 중첩된 자바빈즈의 입력값 검증을 지정한다.
	@Valid
	private Address address;
	// 자바빈즈 컬렉션의 입력값 검증을 지정한다.
	@Valid
	private List<Card> cardList;
	private String cars;
	private String[] carArray;
	private List<String> carList;
	private String introduction;
	private String birthDay;
	
}
package kr.or.ddit.vo;

import org.hibernate.validator.constraints.NotBlank;

import lombok.Data;

@Data
public class Address {
	@NotBlank
	private String postCode;
	@NotBlank
	private String location;
}
package kr.or.ddit.vo;

import java.util.Date;

import javax.validation.constraints.Future;

import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class Card {
	@NotBlank
	private String no;
	// 미래 날짜인지를 검사한다.
	@Future
	@DateTimeFormat(pattern = "yyyyMMdd")
	private Date validMonth;
}
	@RequestMapping(value = "/result3", method = RequestMethod.POST)
	public String registerValidationForm03Result(@Validated Member member, BindingResult result) {
		log.info("registerValidationForm03Result() 실행...!");
		
		if(result.hasErrors()) {
			return "validation/registerValidationForm03";
		}
		
		log.info("userId : " + member.getUserId());
		log.info("dateOfBirth : " + member.getDateOfBirth());
		
		Address address = member.getAddress();
		if(address != null) {
			log.info("postCode : " + address.getPostCode());
			log.info("location : " + address.getLocation());
		}
		
		List<Card> cardList = member.getCardList();
		if(cardList != null && cardList.size() > 0) {
			for(int i = 0; i < cardList.size(); i++) {
				Card card = cardList.get(i);
				log.info("no : " + card.getNo());
				log.info("validMonth : " + card.getValidMonth());
			}
		}
		
		return "validation/success";
	}

- http://localhost/validation/registerValidationForm03



'대덕인재개발원 > 대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231129_SPRING 2 (6-1)  (0) 2023.11.29
231128_SPRING 2 (5-2)  (0) 2023.11.28
231127_SPRING 2 (4-2)  (0) 2023.11.27
231127_SPRING 2 (4-1)  (0) 2023.11.27
231124_SPRING 2 (3-2)  (1) 2023.11.24