1. @RequestParam
(1)@RequestParam ์ด๋?
์์ฒญ์ ํ๋ผ๋ฏธํฐ๋ฅผ Mapping๋ Method์ ๋งค๊ฐ๋ณ์์ ์ฐ๊ฒฐ์ํค๋ ์ด๋ ธํ ์ด์
ํ์ง๋ง ํ์์ ์ฐ๋ฆฌ๋ ํด๋น ์ด๋ ธํ ์ด์ ์ ์ฐ์ง ์๊ณ ๋ฐ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ด๋, ๋งค์๋๊ฐ ์๋ํ๋ค.
๊ทธ ์ด์ ๋ @RequestParam ์์ฒด๊ฐ ์๋ต ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ตํด๋ Spring FrameWork๊ฐ ์๋์ผ๋ก ์์ฒญ์ ํ๋ผ๋ฏธํฐ์ ๋งค์๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๊ฒฐ์์ผ์ค๋ค. (default: ์ฐ์ธ ์ฐจ๋ก๋๋ก 1๋1)
(2) ๊ตฌ์กฐ
public String main2(@RequestParam(name="year", requried=false) String year) {...}
// ์ฐ๊ฒฐํ ๋งค๊ฐ ๋ณ์ ์์๋ค๊ฐ ์ฐ๊ณ ,
// @RequestParam(name="์ฐ๊ฒฐํ ์์ฒญ์ ํ๋ผ๋ฏธํฐ name", ํ์ ์
๋ ฅ ์ฌ๋ถ) ์ฐ๊ฒฐํ ๋งค๊ฐ๋ณ์์ ํ์
์ด๋ฆ
// ()์์ ๊ฐ์ ์ํ๋ ๊ฒ๋ง ์จ๋ ๋ฌธ์ ์์. ์ ์ฒด ์๋ตํด๋ฒ๋ ค๋ ๋จ.
(3) ์ฝ๋ ๋ฆฌ๋ทฐ
A. ๋งค๊ฐ ๋ณ์์ ํ์ ์ด String
: ํ ๋ณํ ์ ์ฐจ๋ฅผ ๊ฑธ์น์ง ์๋๋ค. ๋ฐ๋ผ์ ํ์์ ๋ ฅ๋ง ์๋๋ผ๋ฉด null์ด ๋ค์ด์ค๋ , ""(๊ณต๋ฐฑ)์ด ๋ค์ด์ค๋ ์๋ฌ๊ฐ ์๋๋ค.
a. main 2 ๋ถ๋ถ
ํ์ ์ ๋ ฅ์ด ์๋๊ธฐ ๋๋ฌธ์, URL ๋ค์์ String Query๋ก ์์ฒญ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ ์ด์ฃผ์ง ์์๋ ๋๋ค.(์๋ฌ๊ฐ ์๋!)
์ด๋ ์์ ์ ์ ์์ ๋์ ํ๋ผ๋ฏธํฐ name์ ์ ์๋๋ฐ value๋ฅผ ์ ์ง ์์์ ๋๋ก ๋๋๋ค.
requestParam2 | year ๊ฐ์ null์ด ๋ค์ด๊ฐ๋ค. |
requestParam2/year | year์ ๊ณต๋ฐฑ์ด ๋ค์ด๊ฐ๋ค. |
b. main 3 ๋ถ๋ถ
ํ์ ์ ๋ ฅ์ด ์ฐธ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์์ผ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
requestParam3 | year์ null์ด ๋ค์ด๊ฐ๋ค. ๊ฐ์ด ์์ผ๋ฏ๋ก ์๋ฌ๊ฐ ๋๋ค. 404 ์๋ฌ์ธ ์ด์ ๋ ํ์ ์ ๋ ฅ์ด๋ผ๋ ์กฐ๊ฑด์ ํด๋ผ์ด์ธํธ ์ชฝ์์ ์งํค์ง ์์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ ์๋ชป ์ด๋ผ์๋ค. |
requestParam3/year | year="" , ๊ณต๋ฐฑ์ด๋ผ๋ ๋ค์ด๊ฐ๋ค. ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ์ ์ถ๋ ฅ์ ์ด์ํ ์ ์์ง๋ง ์๋ฌ๋ ์๋๋ค. |
B. ๋งค๊ฐ ๋ณ์ ํ์ ์ด int์ธ ๊ฒฝ์ฐ
: String query๋ก ๋ค์ด์ค๋ ๊ฐ์ ๋ฌด์กฐ๊ฑด String type์ด๋ฏ๋ก ๊ฐ์ ๋ฐ์ ํ int๋ก ํ ๋ณํํ๋ ์ ์ฐจ๋ฅผ ๊ฑธ์น๋ค.
๊ทธ๋์ null์ด๋ ""(๊ณต๋ฐฑ)์ด ๋ค์ด์ค๋ฉด ํ๋ณํ ์ ์ฐจ๋ฅผ ๊ฑฐ์น ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ค.
a. main8 ๋ถ๋ถ
ํ์ ์ ๋ ฅ์ ์๋์ง๋ง ๋งค๊ฐ๋ณ์์ ํ์ ์ด int ์ด๋ฏ๋ก ๋ฐ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ํ ๋ฌด์กฐ๊ฑด์ ์ธ int ํ ๋ณํ์ด ์ด๋ฃจ์ด์ง๋ค.
๋ฐ๋ผ์ ์์ ์ค๋ช ๊ณผ ๊ฐ์ด null์ด๋ ""(๊ณต๋ฐฑ)์ด ๋ค์ด์ค๋ฉด ํ ๋ณํ ์์ฒด๊ฐ ์ ๋๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋ค.
๋๊ฐ ์ฑ ์์ ์ง๋๊ฐ? ์ ๋ฐ๋ผ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋ค๋ฆ(์ ์ผ๋ ค๊ณ ์๋ -> ํด๋ผ์ด์ธํธ๊ฐ ์ฑ ์์ง๋ค๋ ์์ง -> ์๋ฒ ์๋ชป)
requestParam8 | year = null 500(์๋ฒ ์๋ชป) ์๋ฌ๊ฐ ๋๋ค. why? ์ผ๋จ ํ์ ์ ๋ ฅ์ด ์๋๊ธฐ์ ๊ฐ์ ์ ์ ์ ํด๋ผ์ด์ธํธ ์๋ชป์ ์๋๋ค. ๋ฐ๋ฉด null ๊ฐ์ด ๋ค์ด์ค๋ฉด ํ๋ณํ์ด ์๋์ ์๋ฌ๊ฐ ๋ฌ๋ค๋ ๊ฑธ ์๋ฉด์๋ ๋์ฒํ์ง ์์ ์๋ฒ ์๋ชป์ด ๋๋ค. |
requestParam8/year | year="" 400(ํด๋ผ์ด์ธํธ ์๋ชป)์๋ฌ why? ํด๋ผ์ด์ธํธ๊ฐ year๋ฅผ ์ฐ๋ฉฐ ๊ฐ์ ์ ์ผ๋ ค๋ ์๋๋ฅผ ํ๋๋ฐ, ๊ธฐ์ ํ๋ ํ์์ด ์๋ชป๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ์ ๊ธฐ์ ๋ฐฉ์์ด ์๋ชป๋์์์ ์๋ ค์ฃผ๋ฉฐ, ๋ค์ ์ ๋๋ก ์ ๋ ํด์ผํ๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ ๋จ์ 404 error ํ์ด์ง๋ฅผ ๋์ฐ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๋ค. ํด๋ผ์ด์ธํธ์ ์ฌ๋ฐ๋ฅธ ์์ฑ์ ์ ๋ํ๋ ํ์ด์ง๋ฅผ ๋ฐ๋ก ์์ฑ ํด์ ๋์์ผ ํ๋ค. |
** null์ด๋ ""(๊ณต๋ฐฑ)๊ฐ์ด ๋ค์ด์์ ๋ ๋์ฒ ๋ฐฉ๋ฒ
//param (์์ defaultValue๋ฅผ ๋ฃ์ด์ค๋ค. ์ด๋ null์ด๋ ""์ด ๋ค์ด์์ ๋ ๋์ ๋ค์ด๊ฐ๋ ๊ฐ์ด๋ค.)
@RequestMapping("/requestParam11")
public String main11(@RequestParam(required=false, defaultValue="1") int year) {
// http://localhost/ch2/requestParam11 ---->> year=1
// http://localhost/ch2/requestParam11?year ---->> year=1
System.out.printf("[%s]year=[%s]%n", new Date(), year);
return "yoil";
}
b. main 9
ํ์ ์ ๋ ฅ์ด๋ฏ๋ก, ๋ฌด์กฐ๊ฑด ์ ์ ์ ํด๋ผ์ด์ธํธ ์๋ชป์ด๋ค.
requestParam9 | year = null; 400(ํด๋ผ์ด์ธํธ ์๋ชป) year์ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฌ ๋ธ |
requestParam9/year | year="" 400(ํด๋ผ์ด์ธํธ ์๋ชป) year์ ๊ธฐ์ ํ ๋ด์ฉ์ ํ์์ด ์๋ชป ๋๋ค๋ ์๋ฌ ๋ธ |
์ฌ๊ธฐ์ ํ์์ ๋ ฅ์ด๋ฏ๋ก, ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์ ๊ฒ ๋ ๋ คํ๋ ํ์ด์ง๋ฅผ ์๋ฌ ๋ฉ์ธ์ง ๋์ ์ฌ๋ ค์ค์ผํจ.
C. ํด๋ผ์ด์ธํธ๊ฐ null์ด๋ ""(๊ณต๋ฐฑ)์ ์คฌ์ ๋ ์์ธ์ฒ๋ฆฌ
์์์ ๋งํ ๋ฐ์ ๊ฐ์ด, ํด๋ผ์ด์ธํธ์๊ฒ ๊ทธ๋ฅ 404 ์๋ฌ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๋ฉด, ๊ทธ ๋ค์์ ์ด๋ป๊ฒ ๋์ฒํด์ผํ ์ง ํด๋ผ์ด์ธํธ๋ก์๋ ๋๋ต๋๊ฐํ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๋ ๋ฉ์ธ์ง ๋์ ์ ๋๋ก ๋ ์ ๋ ฅ์ ์ ๋ํ๋ ํ์ด์ง๋ฅผ ๋์ ๋์์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ ๋ คํด์ผ ํ๋ค.
์ด๋ ์์ธ ์ฒ๋ฆฌ ๋งค์๋๋ฅผ ์ด์ฉํ๋ค.
// ์ปจํธ๋กค๋ฌ ํด๋์ค ์์ ํ๋์ ๋งค์๋๋ก์ ์ ์ด์ค๋ค.
// ์์ธ์ฒ๋ฆฌ ์ ์ฉ ์ด๋
ธํ
์ด์
์ ํด์ค๋ค. ()์์๋ ์ด๋ค ์์ธ์ ๋ํ ๊ฒ์ธ์ง, ํด๋น ์์ธ์ ํด๋์ค ํ์ผ์ ๋ฃ๋๋ค.
// ()์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ์ด๋
ธํ
์ด์
๋ฐ์ ๋งค์๋๊ฐ ํธ์ถ
// ์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ชจ๋ ์์ธ์ ๋ํด ์ฒ๋ฆฌ ํ๊ธฐ ์ํด Exception.class ๋ฅผ ()์์ ๋ฃ์๋ค.
// ๋ฐ๋ผ์ ์ด๋ค ์์ธ๋ yoilError view๋ฅผ ํ๋ฉด์ ๋์ฐ๋ ๋งค์๋์ด๋ค.
@Controller
public class RequestParamTest {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex) {
return "yoilError";
}
/...
}
2. @RequestMapping ๋ ๋งค์๋์ ๋งค๊ฐ๋ณ์๋ค์ด ๋๋ฌด ๋ง์ ๋,
ํ๋์ ๊ฐ์ฒด๋ฅผ ์จ์ ๋ฌถ์ด ํํํ๋ ์์
// ์์ฒญ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฃ์ ๊ฐ์ฒด Date
package com.fastcampus.ch2;
public class MyDate {
private int year;
private int month;
private int day;
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
@Override
public String toString() {
return "MyDate [year=" + year + ", month=" + month + ", day=" + day + "]";
}
}
//๋
์์ผ์ ์
๋ ฅํ๋ฉด ์์ผ์ ์๋ ค์ฃผ๋ ํ๋ก๊ทธ๋จ
@Controller
public class YoilTellerMVC4 {
// ์์ธ์ฒ๋ฆฌ
@ExceptionHandler(Exception.class)
public String catcher(Exception ex) {
ex.printStackTrace();
return "yoilError";
}
@RequestMapping("/getYoilMVC4")
//Date ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ. ์์ฒญ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ฒด์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ Spring์ด ์๋์ผ๋ก ํด์ค.
public String main(MyDate date, Model model) {
if(!isVaild(date)) {
return "yoilError";
}
char yoil = getYoil(date);
// Model์ Map ์ฅ๋ถ์ ๊ฐ๊ฐ key value๋ก์จ ์ ํ๋ค.
// ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ Date๋ ๊ฐ์ฒด ์์ฒด๊ฐ ์ ํ๋ค๋ ๊ฒ์ด๋ค.
// ๋ฐ๋ผ์ View๋ Date ๊ฐ์ฒด์์ ํ์ํ ๋ณ์๋ฅผ ๊บผ๋ด ์ฐ๋๋ก ์์ ํด์ค์ผ ํ๋ค.
model.addAttribute("myDate",date);
model.addAttribute("yoil", yoil);
return "yoil";
}
// ์ถ๊ฐ๋ ํจ์, Date์ ๊ฐ์ฒด์์ ๋ณ์๋ค์ ๊บผ๋ด, ์๋ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ง์ด๋ฃ๋๋ค.
// ํ์ฒญ ๋๋ ค์ ๊ฐ ์ป์ด๋.
private boolean isVaild(MyDate date) {
return isVaild(date.getYear(),date.getMonth(),date.getDay());
}
private char getYoil(MyDate date) {
return getYoil(date.getYear(),date.getMonth(),date.getDay());
}
private boolean isVaild(int year, int month, int day) {
if(year ==-1 || month == -1 || day == -1)
return false;
return (1<=month && month<=12) &&(1<=day && day<=31);
}
//์์ผ ๊ณ์ฐ
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return "์ผ์ํ์๋ชฉ๊ธํ ".charAt(dayOfWeek);
}
}
<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>YoilTellerMVC</title>
</head>
<body>
<h1>year=<%=request.getParameter("year") %> </h1>
<!--JSP ํ์ผ๋ ์ด ์ฒ๋ผ Date ๊ฐ์ฒด์์ ๊บผ๋ด์ธ ์ ์๊ฒ ๋ฐ๋์ด ์์.-->
<h1>${myDate.year}๋
${myDate.month}์ ${myDate.day}์ผ์ ${yoil}์์ผ์
๋๋ค.</h1>
</body>
</html>
3. ์ค์ค๋ก ํด๋ณด๊ธฐ
(ํ์ ์ ๋ ฅ on/off ํด์ ๋๋ ค๋ณด๊ธฐ, ์์ธ์ฒ๋ฆฌ ๋งค์๋ ๋ง๋ค์ด๋ณด๊ธฐ, ๋งค์๋์ ๋งค๊ฐ๋ณ์ ํ๋์ ๊ฐ์ฒด์ ๋ฃ๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋งค์๋ ์๋์ํค๊ธฐ)
์๋ฃ