관리 메뉴

거니의 velog

231123_SPRING 2 (2-2) 본문

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

231123_SPRING 2 (2-2)

Unlimited00 2023. 11. 23. 08:33
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.vo;

import lombok.Data;

@Data
public class Member {

	private String userId = "a001";
	private String userName = "hongkd";
	private String password = "1234";
	private int coin = 100;
	
}
package kr.or.ddit.controller.member;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
}

- http://localhost/registerForm

Member의 coin과 매개변수 coin 값이 둘 다 바뀐다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.vo;

import java.util.Date;

import lombok.Data;

@Data
public class Member {

	private String userId = "a001";
	private String userName = "hongkd";
	private String password = "1234";
	private int coin = 100;
	private Date dateOfBirth;
	
}
package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
}

- http://localhost/registerForm








/*
 * 		5. Date 타입 처리
 * 
 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
 */

package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect03" method="post">
			carList : <br />
			<select name="carList" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}
	
}

- http://localhost/registerForm


	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect03" method="post">
			carList : <br />
			<select name="carList" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox01" method="post">
			hobby : <br />
			<input type="checkbox" name="hobby" value="sports" />Sports<br />
			<input type="checkbox" name="hobby" value="music" />music<br />
			<input type="checkbox" name="hobby" value="movie" />Movie<br />
			<input type="checkbox" name="hobby" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox02" method="post">
			hobbyArray : <br />
			<input type="checkbox" name="hobbyArray" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyArray" value="music" />music<br />
			<input type="checkbox" name="hobbyArray" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyArray" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox03" method="post">
			hobbyList : <br />
			<input type="checkbox" name="hobbyList" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyList" value="music" />music<br />
			<input type="checkbox" name="hobbyList" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyList" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}
	
	// 9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox01", method = RequestMethod.POST)
	public String registerCheckbox01(String hobby) {
		log.info("registerCheckbox01() 실행...!");
		log.info("hobby : " + hobby);
		return "success";
	}
	
	// 10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox02", method = RequestMethod.POST)
	public String registerCheckbox02(String[] hobbyArray) {
		log.info("registerCheckbox02() 실행...!");
		log.info("hobbyArray : " + hobbyArray);
		
		if(hobbyArray != null) {
			log.info("hobbyArray.length : " + hobbyArray.length);
			for(int i = 0; i < hobbyArray.length; i++) {
				log.info("hobbyArray["+i+"] : " + hobbyArray[i]);
			}
		}else {
			log.info("hobbyArray is null");
		}
		return "success";
	}
	
	// 11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox03", method = RequestMethod.POST)
	public String registerCheckbox03(ArrayList<String> hobbyList) {
		log.info("registerCheckbox03() 실행...!");
		log.info("hobbyList : " + hobbyList);
		
		if(hobbyList != null && hobbyList.size() > 0) {
			log.info("hobbyList.size() : " + hobbyList.size());
			for(int i = 0; i < hobbyList.size(); i++) {
				log.info("hobbyList.size("+i+") : " + hobbyList.get(i));
			}
		}else {
			log.info("hobbyList is null");
		}
		return "success";
	}
	
}

- http://localhost/registerForm




<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect03" method="post">
			carList : <br />
			<select name="carList" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox01" method="post">
			hobby : <br />
			<input type="checkbox" name="hobby" value="sports" />Sports<br />
			<input type="checkbox" name="hobby" value="music" />music<br />
			<input type="checkbox" name="hobby" value="movie" />Movie<br />
			<input type="checkbox" name="hobby" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox02" method="post">
			hobbyArray : <br />
			<input type="checkbox" name="hobbyArray" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyArray" value="music" />music<br />
			<input type="checkbox" name="hobbyArray" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyArray" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox03" method="post">
			hobbyList : <br />
			<input type="checkbox" name="hobbyList" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyList" value="music" />music<br />
			<input type="checkbox" name="hobbyList" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyList" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox05" method="post">
			foreigner : <br />
			<input type="checkbox" name="foreigner" value="true" />Sports<br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}
	
	// 9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox01", method = RequestMethod.POST)
	public String registerCheckbox01(String hobby) {
		log.info("registerCheckbox01() 실행...!");
		log.info("hobby : " + hobby);
		return "success";
	}
	
	// 10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox02", method = RequestMethod.POST)
	public String registerCheckbox02(String[] hobbyArray) {
		log.info("registerCheckbox02() 실행...!");
		log.info("hobbyArray : " + hobbyArray);
		
		if(hobbyArray != null) {
			log.info("hobbyArray.length : " + hobbyArray.length);
			for(int i = 0; i < hobbyArray.length; i++) {
				log.info("hobbyArray["+i+"] : " + hobbyArray[i]);
			}
		}else {
			log.info("hobbyArray is null");
		}
		return "success";
	}
	
	// 11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	// 체크박스도 컬렉션 리스트로는 데이터를 가져올 수 없다.
	@RequestMapping(value = "/registerCheckbox03", method = RequestMethod.POST)
	public String registerCheckbox03(ArrayList<String> hobbyList) {
		log.info("registerCheckbox03() 실행...!");
		log.info("hobbyList : " + hobbyList);
		
		if(hobbyList != null && hobbyList.size() > 0) {
			log.info("hobbyList.size() : " + hobbyList.size());
			for(int i = 0; i < hobbyList.size(); i++) {
				log.info("hobbyList.size("+i+") : " + hobbyList.get(i));
			}
		}else {
			log.info("hobbyList is null");
		}
		return "success";
	}
	
	// 13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox05", method = RequestMethod.POST)
	public String registerCheckbox05(boolean foreigner) {
		log.info("registerCheckbox05() 실행...!");
		log.info("foreigner : " + foreigner);
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect03" method="post">
			carList : <br />
			<select name="carList" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox01" method="post">
			hobby : <br />
			<input type="checkbox" name="hobby" value="sports" />Sports<br />
			<input type="checkbox" name="hobby" value="music" />music<br />
			<input type="checkbox" name="hobby" value="movie" />Movie<br />
			<input type="checkbox" name="hobby" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox02" method="post">
			hobbyArray : <br />
			<input type="checkbox" name="hobbyArray" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyArray" value="music" />music<br />
			<input type="checkbox" name="hobbyArray" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyArray" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox03" method="post">
			hobbyList : <br />
			<input type="checkbox" name="hobbyList" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyList" value="music" />music<br />
			<input type="checkbox" name="hobbyList" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyList" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox05" method="post">
			foreigner : <br />
			<input type="checkbox" name="foreigner" value="true" />Sports<br />
			<button type="submit">전송</button>
		</form>
		
		<p>14) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerAddress" method="post">
			postCode : <input type="text" name="postCode" /><br />
			location : <input type="text" name="location" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>

[Address.java]

package kr.or.ddit.vo;

import lombok.Data;

@Data
public class Address {

	private String postCode;
	private String location;
	
}
package kr.or.ddit.controller.member;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}
	
	// 9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox01", method = RequestMethod.POST)
	public String registerCheckbox01(String hobby) {
		log.info("registerCheckbox01() 실행...!");
		log.info("hobby : " + hobby);
		return "success";
	}
	
	// 10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox02", method = RequestMethod.POST)
	public String registerCheckbox02(String[] hobbyArray) {
		log.info("registerCheckbox02() 실행...!");
		log.info("hobbyArray : " + hobbyArray);
		
		if(hobbyArray != null) {
			log.info("hobbyArray.length : " + hobbyArray.length);
			for(int i = 0; i < hobbyArray.length; i++) {
				log.info("hobbyArray["+i+"] : " + hobbyArray[i]);
			}
		}else {
			log.info("hobbyArray is null");
		}
		return "success";
	}
	
	// 11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	// 체크박스도 컬렉션 리스트로는 데이터를 가져올 수 없다.
	@RequestMapping(value = "/registerCheckbox03", method = RequestMethod.POST)
	public String registerCheckbox03(ArrayList<String> hobbyList) {
		log.info("registerCheckbox03() 실행...!");
		log.info("hobbyList : " + hobbyList);
		
		if(hobbyList != null && hobbyList.size() > 0) {
			log.info("hobbyList.size() : " + hobbyList.size());
			for(int i = 0; i < hobbyList.size(); i++) {
				log.info("hobbyList.size("+i+") : " + hobbyList.get(i));
			}
		}else {
			log.info("hobbyList is null");
		}
		return "success";
	}
	
	// 13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox05", method = RequestMethod.POST)
	public String registerCheckbox05(boolean foreigner) {
		log.info("registerCheckbox05() 실행...!");
		log.info("foreigner : " + foreigner);
		return "success";
	}
	
	// 14) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerAddress", method = RequestMethod.POST)
	public String registerAddress(Address address) {
		log.info("registerAddress() 실행...!");
		if(address != null) {
			log.info("address.postCode : " + address.getPostCode());
			log.info("address.location : " + address.getLocation());
		}
		return "success";
	}
	
}

- http://localhost/registerForm


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect03" method="post">
			carList : <br />
			<select name="carList" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox01" method="post">
			hobby : <br />
			<input type="checkbox" name="hobby" value="sports" />Sports<br />
			<input type="checkbox" name="hobby" value="music" />music<br />
			<input type="checkbox" name="hobby" value="movie" />Movie<br />
			<input type="checkbox" name="hobby" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox02" method="post">
			hobbyArray : <br />
			<input type="checkbox" name="hobbyArray" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyArray" value="music" />music<br />
			<input type="checkbox" name="hobbyArray" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyArray" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox03" method="post">
			hobbyList : <br />
			<input type="checkbox" name="hobbyList" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyList" value="music" />music<br />
			<input type="checkbox" name="hobbyList" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyList" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox05" method="post">
			foreigner : <br />
			<input type="checkbox" name="foreigner" value="true" />Sports<br />
			<button type="submit">전송</button>
		</form>
		
		<p>14) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerAddress" method="post">
			postCode : <input type="text" name="postCode" /><br />
			location : <input type="text" name="location" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>15) 폼 텍스트 필드 요소값을 중첩된 자바 빈즈 매개변수로 처리한다.</p>
		<form action="/registerUserAddress" method="post">
			postCode : <input type="text" name="postCode" /><br />
			location : <input type="text" name="location" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.vo;

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

import lombok.Data;

@Data
public class Member {

	private String userId = "a001";
	private String userName = "hongkd";
	private String password = "1234";
	private int coin = 100;
	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;
	
}

[Card.java]

package kr.or.ddit.vo;

import java.util.Date;

import lombok.Data;

@Data
public class Card {

	private String no;
	private Date validMonth;
	
}
package kr.or.ddit.controller.member;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}
	
	// 9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox01", method = RequestMethod.POST)
	public String registerCheckbox01(String hobby) {
		log.info("registerCheckbox01() 실행...!");
		log.info("hobby : " + hobby);
		return "success";
	}
	
	// 10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox02", method = RequestMethod.POST)
	public String registerCheckbox02(String[] hobbyArray) {
		log.info("registerCheckbox02() 실행...!");
		log.info("hobbyArray : " + hobbyArray);
		
		if(hobbyArray != null) {
			log.info("hobbyArray.length : " + hobbyArray.length);
			for(int i = 0; i < hobbyArray.length; i++) {
				log.info("hobbyArray["+i+"] : " + hobbyArray[i]);
			}
		}else {
			log.info("hobbyArray is null");
		}
		return "success";
	}
	
	// 11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	// 체크박스도 컬렉션 리스트로는 데이터를 가져올 수 없다.
	@RequestMapping(value = "/registerCheckbox03", method = RequestMethod.POST)
	public String registerCheckbox03(ArrayList<String> hobbyList) {
		log.info("registerCheckbox03() 실행...!");
		log.info("hobbyList : " + hobbyList);
		
		if(hobbyList != null && hobbyList.size() > 0) {
			log.info("hobbyList.size() : " + hobbyList.size());
			for(int i = 0; i < hobbyList.size(); i++) {
				log.info("hobbyList.size("+i+") : " + hobbyList.get(i));
			}
		}else {
			log.info("hobbyList is null");
		}
		return "success";
	}
	
	// 13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox05", method = RequestMethod.POST)
	public String registerCheckbox05(boolean foreigner) {
		log.info("registerCheckbox05() 실행...!");
		log.info("foreigner : " + foreigner);
		return "success";
	}
	
	// 14) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerAddress", method = RequestMethod.POST)
	public String registerAddress(Address address) {
		log.info("registerAddress() 실행...!");
		if(address != null) {
			log.info("address.postCode : " + address.getPostCode());
			log.info("address.location : " + address.getLocation());
		}
		return "success";
	}
	
	// 15) 폼 텍스트 필드 요소값을 중첩된 자바 빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserAddress", method = RequestMethod.POST)
	public String registerUserAddress(Member member) {
		log.info("registerUserAddress() 실행...!");
		log.info("member.address.postCode : " + member.getAddress().getPostCode());
		log.info("member.address.location : " + member.getAddress().getLocation());
		return "success";
	}
	
}

- http://localhost/registerForm


		<p>15) 폼 텍스트 필드 요소값을 중첩된 자바 빈즈 매개변수로 처리한다.</p>
		<form action="/registerUserAddress" method="post">
			postCode : <input type="text" name="address.postCode" /><br />
			location : <input type="text" name="address.location" /><br />
			<button type="submit">전송</button>
		</form>
	// 15) 폼 텍스트 필드 요소값을 중첩된 자바 빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserAddress", method = RequestMethod.POST)
	public String registerUserAddress(Member member) {
		log.info("registerUserAddress() 실행...!");
		
		Address address = member.getAddress();
		if(address != null) {
			log.info("address.postCode : " + address.getPostCode());
			log.info("address.location : " + address.getLocation());
		}else {
			log.info("address is null");
		}
		
		return "success";
	}


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>RegisterForm</title>
	</head>
	<body>
		<h3>REGISTER FORM</h3>
		<hr /><br />
		
		<h4>2. 요청 처리</h4>
		<hr />
		
		<p>1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register?userId=hongkd&password=1234">Button1</a>
		<br />
		
		<p>2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.</p>
		<a href="/register/hongkd">Button2</a>
		<br />
		
		<p>
			3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<p>
			4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.<br />
		</p>
		<form action="/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		<br />
		
		<hr /><br />
		
		<h4>3. 요청 데이터 처리 어노테이션</h4>
		<hr />
		
		<p>1) URL 경로 상의 경로 변수가 여러 개일 떄, @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해준다.</p>
		<a href="/register/hongkd/100">Button3</a><br />
		
		<p>2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.</p>
		<form action="/register0202" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>4. 요청 처리 자바빈즈</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/beans/register01" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.</p>
		<form action="/beans/register02" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			coin : <input type="text" name="coin" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>5. Date 타입 처리</h4>
		<hr />
		
		<p>1) 쿼리 파라미터(dateOfBirth=1234)로 전달받은 값이 날짜 문자열 형식에 맞지 않아 Date 타입으로 변환에 실패한다.</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=1234">button1</a><br />
		
		<p>2) 쿼리 파라미터(dateOfBirth=2018-09-08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018-09-08">button2</a><br />
		
		<p>3) 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=20180908">button3</a><br />
		
		<p>4) 쿼리 파라미터(dateOfBirth=2018/09/08)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet01?userId=hong&dateOfBirth=2018/09/08">button4</a><br />
		
		<p>5) Member 매개변수와 쿼리 파라미터(dateOfBirth=20180908)로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<a href="/registerByGet02?userId=hong&dateOfBirth=20180908">button4</a><br />
		
		<p>6) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/register" method="post">
			userId : <input type="text" name="userId" /><br />
			password : <input type="text" name="password" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>6. @DateTimeFormat 어노테이션</h4>
		<hr />
		
		<p>1) Member 매개변수와 폼 방식 요청으로 전달받은 값이 날짜 문자열 형식으로 설정 시, Date 타입으로 받는가?</p>
		<form action="/registerByGet03" method="post">
			userId : <input type="text" name="userId" /><br />
			dateOfBirth : <input type="text" name="dateOfBirth" /><br />
			<button type="submit">전송</button>
		</form>
		
		<hr /><br />
		
		<h4>7. 폼 방식 요청 처리</h4>
		<hr />
		
		<p>1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerMemberUserId" method="post">
			userId : <input type="text" name="userId" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerPassword" method="post">
			password : <input type="password" name="password" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerRadio" method="post">
			gender : <br />
			<input type="radio" name="gender" value="male" checked="checked" />Male<br />
			<input type="radio" name="gender" value="female" />Female<br />
			<input type="radio" name="gender" value="other" />Other<br />
			<button type="submit">전송</button>
		</form>
		
		<p>5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerSelect" method="post">
			nationality : <br />
			<select name="nationality">
				<option value="korea">대한민국</option>
				<option value="germany">독일</option>
				<option value="austrailia">호주</option>
				<option value="canada">캐나다</option>
				<option value="usa">미국</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect01" method="post">
			cars : <br />
			<select name="cars" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect02" method="post">
			carArray : <br />
			<select name="carArray" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerMultiSelect03" method="post">
			carList : <br />
			<select name="carList" multiple="multiple">
				<option value="jeep">JEEP</option>
				<option value="volvo">VOLVO</option>
				<option value="bmw">BMW</option>
				<option value="audi">AUDI</option>
			</select>
			<button type="submit">전송</button>
		</form>
		
		<p>9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox01" method="post">
			hobby : <br />
			<input type="checkbox" name="hobby" value="sports" />Sports<br />
			<input type="checkbox" name="hobby" value="music" />music<br />
			<input type="checkbox" name="hobby" value="movie" />Movie<br />
			<input type="checkbox" name="hobby" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox02" method="post">
			hobbyArray : <br />
			<input type="checkbox" name="hobbyArray" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyArray" value="music" />music<br />
			<input type="checkbox" name="hobbyArray" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyArray" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox03" method="post">
			hobbyList : <br />
			<input type="checkbox" name="hobbyList" value="sports" />Sports<br />
			<input type="checkbox" name="hobbyList" value="music" />music<br />
			<input type="checkbox" name="hobbyList" value="movie" />Movie<br />
			<input type="checkbox" name="hobbyList" value="book" />Book<br />
			<button type="submit">전송</button>
		</form>
		
		<p>13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.</p>
		<form action="/registerCheckbox05" method="post">
			foreigner : <br />
			<input type="checkbox" name="foreigner" value="true" />Sports<br />
			<button type="submit">전송</button>
		</form>
		
		<p>14) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerAddress" method="post">
			postCode : <input type="text" name="postCode" /><br />
			location : <input type="text" name="location" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>15) 폼 텍스트 필드 요소값을 중첩된 자바 빈즈 매개변수로 처리한다.</p>
		<form action="/registerUserAddress" method="post">
			postCode : <input type="text" name="address.postCode" /><br />
			location : <input type="text" name="address.location" /><br />
			<button type="submit">전송</button>
		</form>
		
		<p>16) 폼 텍스트 필드 요소값을 중첩된 자바빈즈 매개변수로 처리한다.</p>
		<form action="/registerUserCardList" method="post">
			카드1 - 번호 : <input type="text" name="cardList[0].no" /><br />
			카드1 - 유효년월 : <input type="text" name="cardList[0].validMonth" /><br />
			카드2 - 번호 : <input type="text" name="cardList[1].no" /><br />
			카드2 - 유효년월 : <input type="text" name="cardList[1].validMonth" /><br />
			<button type="submit">전송</button>
		</form>
	</body>
</html>
package kr.or.ddit.controller.member;

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

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

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

@Slf4j
@Controller
public class MemberController {

	/*
	 * [ 5장 : 컨트롤러 요청 처리 ]
	 * 
	 * 		1. 컨트롤러 메서드 매개변수
	 * 
	 * 			- Model : 이동 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- RedirectAttributes : 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스
	 * 			- 자바빈즈 클래스 : 요청 파라미터를 가지고 있는 자바빈즈 클래스
	 * 			- MultipartFile : 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스
	 * 			- BindingResult : 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스
	 * 			- Locale : 클라이언트 Locale
	 * 			- Principal : 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스
	 */
	
	// 요청 처리 페이지
	@RequestMapping(value = "/registerForm", method = RequestMethod.GET)
	public String registerForm() {
		log.info("registerForm() 실행...!");
		return "member/registerForm";
	}
	
	// 1) URL 경로 상의 쿼리 파라미터 정보로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String registerByParameter(String userId, String password) {
		log.info("registerByParameter() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 2) URL 경로 상의 경로 변수로부터 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register/{userId}", method = RequestMethod.GET)
	public String registerByPath(@PathVariable String userId) {
		// 넘겨 받은 userId를 경로상에서 꺼낼 때, @PathVariable를 이용한다.
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 3) HTML Form 필드명과 컨트롤러 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	//		그리고, 매개변수의 위치는 순서에 상관없고 오직 매개변수명이 일치하면 요청 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register01", method = RequestMethod.POST)
	public String register01(String userId, String password) {
		log.info("register01() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		return "success";
	}
	
	// 4) HTML Form 필드 값이 숫자일 경우에는 숫자로 타입 변환되어 데이터를 취득할 수 있다.
	@RequestMapping(value = "/register02", method = RequestMethod.POST)
	public String register02(String userId, String password, int coin) {
		log.info("register02() 실행...!");
		log.info("userId : " + userId);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		3. 요청 데이터 처리 어노테이션
	 * 
	 * 			- @PathVariable : URL에서 경로 변수 값을 가져오기 위한 어노테이션
	 * 			- @RequestParam : 요청 파라미터 값을 가져오기 위한 어노테이션
	 * 			- @RequestHeader : 요청 헤더 값을 가져오기 위한 어노테이션
	 * 			- @RequestBody : 요청 본문 내용을 가져오기 위한 어노테이션
	 * 			- @CookieValue : 쿠키 값을 가져오기 위한 어노테이션
	 */
	
	// 1) URL 경로 상의 경로 변수가 여러 개 일때 @PathVariable 어노테이션을 사용하여 특정한 경로 변수명을 지정해 준다.
	@RequestMapping(value = "/register/{userId}/{coin}", method = RequestMethod.GET)
	public String registerByPath(
			@PathVariable("userId") String userId,
			@PathVariable("coin") int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("userId : " + userId);
		log.info("coin : " + coin);
		return "success";
	}
	
	// 2) @RequestParam 어노테이션을 사용하여 특정한 HTML Form의 필드명을 지정하여 요청을 처리한다.
	@RequestMapping(value = "/register0202", method = RequestMethod.POST)
	public String register0202(
			@RequestParam("userId") String username, String password, int coin
			) {
		log.info("registerByPath() 실행...!");
		log.info("username : " + username);
		log.info("password : " + password);
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 *		4. 요청 처리 자바빈즈
	 */
	
	// 1) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register01", method = RequestMethod.POST)
	public String registerBeans01(Member member) {
		log.info("registerBeans01() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수와 기본 데이터 타입인 정수 타입 매개변수로 처리한다.
	@RequestMapping(value = "/beans/register02", method = RequestMethod.POST)
	public String registerBeans02(Member member, int coin) {
		log.info("registerBeans02() 실행...!");
		log.info("mamber.userId : " + member.getUserId());
		log.info("mamber.password : " + member.getPassword());
		log.info("mamber.coin : " + member.getCoin());
		log.info("coin : " + coin);
		return "success";
	}
	
	/*
	 * 		5. Date 타입 처리
	 * 
	 * 			- 스프링 MVC는 Date 타입의 데이터를 처리하는 여러 가지 방법을 제공한다.
	 * 			- 클라이언트에서 날짜 데이터를 서버로 보낼 때에는 '년/월/일' 형식에 맞춰서 보내야 한다.
	 */
	
	// 1)
	@RequestMapping(value = "/registerByGet01", method = RequestMethod.GET)
	public String registerByGet01(String userId, Date dateOfBirth) {
		log.info("registerByGet01() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " + dateOfBirth);
		return "success";
	}
	
	// 2)
	@RequestMapping(value = "/registerByGet02", method = RequestMethod.GET)
	public String registerByGet02(Member member) {
		log.info("registerByGet02() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	// 3)
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String register(Member member) {
		log.info("register() 실행...!");
		log.info("member.userId : " + member.getUserId());
		log.info("member.password : " + member.getPassword());
		log.info("member.dateOfBirth : " + member.getDateOfBirth());
		return "success";
	}
	
	/*
	 * 		6. @DateTimeFormat 어노테이션
	 * 
	 * 			- @DateTimeFormat 어노테이션의 pattern 속성 값에 원하는 날짜형식을 지정할 수 있다.
	 */
	
	@RequestMapping(value = "/registerByGet03", method = RequestMethod.POST)
	public String registerByGet03(String userId, @DateTimeFormat(pattern = "yyyyMMdd") Date dateOfBirth) {
		log.info("registerByGet03() 실행...!");
		log.info("userId : " + userId);
		log.info("dateOfBirth : " +dateOfBirth);
		return "success";
	}
	
	/*
	 * 		7. 폼 방식 요청 처리
	 */
	
	// 1) 폼 텍스트 필드 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserId", method = RequestMethod.POST)
	public String registerUserId(String userId) {
		log.info("registerUserId() 실행...!");
		log.info("userId : " + userId);
		return "success";
	}
	
	// 2) 폼 텍스트 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerMemberUserId", method = RequestMethod.POST)
	public String registerMemberUserId(Member member) {
		log.info("registerMemberUserId() 실행...!");
		log.info("member.userId : " + member.getUserId());
		return "success";
	}
	
	// 3) 폼 비밀번호 필드 요소 값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerPassword", method = RequestMethod.POST)
	public String registerPassword(Member member) {
		log.info("registerPassword() 실행...!");
		log.info("member.password : " + member.getPassword());
		return "success";
	}
	
	// 4) 폼 라디오 버튼 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerRadio", method = RequestMethod.POST)
	public String registerRadio(String gender) {
		log.info("registerRadio() 실행...!");
		log.info("gender : " + gender);
		return "success";
	}
	
	// 5) 폼 셀렉트 박스 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerSelect", method = RequestMethod.POST)
	public String registerSelect(String nationality) {
		log.info("registerSelect() 실행...!");
		log.info("nationality : " + nationality);
		return "success";
	}
	
	// 6) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect01", method = RequestMethod.POST)
	public String registerMultiSelect01(String cars) {
		log.info("registerMultiSelect01() 실행...!");
		log.info("cars : " + cars);
		return "success";
	}
	
	// 7) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect02", method = RequestMethod.POST)
	public String registerMultiSelect02(String[] carArray) {
		log.info("registerMultiSelect02() 실행...!");
		log.info("carArray : " + carArray);
		if(carArray != null) {
			log.info("carArray.length : " + carArray.length);
			for(int i = 0; i < carArray.length; i++) {
				log.info("carArray["+i+"] : " + carArray[i]);
			}
		}else {
			log.info("carArray is null");
		}
		return "success";
	}
	
	// 8) 복수 선택이 가능한 폼 셀렉트 박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerMultiSelect03", method = RequestMethod.POST)
	public String registerMultiSelect03(ArrayList<String> carList) {
		// 받는 타입을 List로 하게 되면 No primary or default constructor found for interface java.util.List 에러 발생
		// 스프링에서는 List 타입으로 데이터를 받는 데에 문제가 있다. (데이터 바인딩이 안 됨)
		// 리스트와 같은 형태의 값을 받으려면 String[]로 여러 데이터를 받아 주거나 객체 안에 있는 List 필드로 받아야 한다.
		log.info("registerMultiSelect03() 실행...!");
		log.info("carList : " + carList);
		if(carList != null && carList.size() > 0) { // 데이터가 존재
			log.info("carList.size() : " + carList.size());
			for(int i = 0; i < carList.size(); i++) {
				log.info("carList.get("+i+") : " + carList.get(i));
			}
		}else {
			log.info("carList is null");
		}
		return "success";
	}
	
	// 9) 폼 체크박스 요소값을 기본 데이터 타입인 문자열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox01", method = RequestMethod.POST)
	public String registerCheckbox01(String hobby) {
		log.info("registerCheckbox01() 실행...!");
		log.info("hobby : " + hobby);
		return "success";
	}
	
	// 10) 폼 체크박스 요소값을 문자열 배열 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox02", method = RequestMethod.POST)
	public String registerCheckbox02(String[] hobbyArray) {
		log.info("registerCheckbox02() 실행...!");
		log.info("hobbyArray : " + hobbyArray);
		
		if(hobbyArray != null) {
			log.info("hobbyArray.length : " + hobbyArray.length);
			for(int i = 0; i < hobbyArray.length; i++) {
				log.info("hobbyArray["+i+"] : " + hobbyArray[i]);
			}
		}else {
			log.info("hobbyArray is null");
		}
		return "success";
	}
	
	// 11) 폼 체크박스 요소값을 문자열 요소를 가진 리스트 컬렉션 타입 매개변수로 처리한다.
	// 체크박스도 컬렉션 리스트로는 데이터를 가져올 수 없다.
	@RequestMapping(value = "/registerCheckbox03", method = RequestMethod.POST)
	public String registerCheckbox03(ArrayList<String> hobbyList) {
		log.info("registerCheckbox03() 실행...!");
		log.info("hobbyList : " + hobbyList);
		
		if(hobbyList != null && hobbyList.size() > 0) {
			log.info("hobbyList.size() : " + hobbyList.size());
			for(int i = 0; i < hobbyList.size(); i++) {
				log.info("hobbyList.size("+i+") : " + hobbyList.get(i));
			}
		}else {
			log.info("hobbyList is null");
		}
		return "success";
	}
	
	// 13) 폼 체크박스 요소값을 기본 데이터 타입인 불리언 타입 매개변수로 처리한다.
	@RequestMapping(value = "/registerCheckbox05", method = RequestMethod.POST)
	public String registerCheckbox05(boolean foreigner) {
		log.info("registerCheckbox05() 실행...!");
		log.info("foreigner : " + foreigner);
		return "success";
	}
	
	// 14) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerAddress", method = RequestMethod.POST)
	public String registerAddress(Address address) {
		log.info("registerAddress() 실행...!");
		if(address != null) {
			log.info("address.postCode : " + address.getPostCode());
			log.info("address.location : " + address.getLocation());
		}
		return "success";
	}
	
	// 15) 폼 텍스트 필드 요소값을 중첩된 자바 빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserAddress", method = RequestMethod.POST)
	public String registerUserAddress(Member member) {
		log.info("registerUserAddress() 실행...!");
		
		Address address = member.getAddress();
		if(address != null) {
			log.info("address.postCode : " + address.getPostCode());
			log.info("address.location : " + address.getLocation());
		}else {
			log.info("address is null");
		}
		
		return "success";
	}
	
	// 16) 폼 텍스트 필드 요소값을 중첩된 자바빈즈 매개변수로 처리한다.
	@RequestMapping(value = "/registerUserCardList", method = RequestMethod.POST)
	public String registerUserCardList(Member member) {
		log.info("registerUserCardList() 실행...!");
		
		List<Card> cardList = member.getCardList();
		
		if(cardList != null && cardList.size() > 0) {
			log.info("cardList.size() : " + cardList.size());
			for(int i = 0; i < cardList.size(); i++) {
				Card card = cardList.get(i);
				log.info("card["+i+"].no : " + card.getNo());
				log.info("card["+i+"].validMonth : " + card.getValidMonth());
			}
		}else {
			log.info("cardList is null");
		}
		
		return "success";
	}
	
}

- http://localhost/registerForm


 

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

231124_SPRING 2 (3-1)  (2) 2023.11.24
231123_SPRING 2 (2-3) 과제  (0) 2023.11.23
231123_SPRING 2 (2-1)  (0) 2023.11.23
231122_SPRING 2 (1-2)  (0) 2023.11.22
231122_SPRING 2 (1-1)  (0) 2023.11.22