1. @ModelAttribute
(1)๊ธฐ๋ฅ
@ModelAttribute๊ฐ ๋ถ์ด ์๋ ์ ์ฉ ๋์์ ์๋์ผ๋ก ๋ชจ๋ธ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ก ๋ฃ์ด์ค๋ค.
(2) ์ ์ฉ ๋์
a. Controller Method์ ๋งค๊ฐ ๋ณ์
// ๋งค๊ฐ๋ณ์ ์์ ๋ถ๋๋ค.
public String main(@ModelAttribute MyDate date, Model m) { /... }
//public String main(@ModelAttribute("myDate") MyDate date, Model m) {/...}
๋ฐ์ ์ฃผ์๋ ์์ ๋์ผํ ๋ป์ด๋ค. ์ด๋ ธํ ์ด์ ๋ค ()์ Model ์ Key ๊ฐ์ผ๋ก ์ฐ์ผ ์ด๋ฆ์ ์ง์ ํด ๋ฃ์ ์ ์๋ค.
์ด๋ ์๋ต ๊ฐ๋ฅํ๋ฉฐ, ์๋ตํ๋ฉด, ํด๋์ค์ ์ฒซ๊ธ์๋ฅผ ์๋ฌธ์๋ก ํ ๋ฌธ์์ด์ด Key ๊ฐ์ด ๋๋ค.
Model์์ Attribute ์ ์ฅํ๋ Map | |
Key | Value |
mydate | date ๊ฐ์ฒด์ ์ฃผ์ |
//... | //... |
์ด๋ฐ ์์ผ๋ก ๋ค์ด๊ฐ๋ค.
b. ์ผ๋ฐ Method
// ๋งค์๋์ ๋ฐํํ ์์ ๋ถ๋๋ค.
// ํด๋น ๋งค์๋์ ๋ฐํ๊ฐ์ ๋ฌด์กฐ๊ฑด ๋ชจ๋ธ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ก ๋ค์ด๊ฐ๋ค๋ ๋ป์ด๋ค.
// ์ด ๊ฒฝ์ฐ์๋ Model์ Map ์ Key๋ก ์ฐ์ผ ๊ฐ์ ๋ฌด์กฐ๊ฑด ์ ์ด์ค์ผ ํ๋ค.
private @ModelAttribute ("yoil") char getYoil(MyDate date) {
return getYoil(date.getYear(), date.getMonth(), date.getDay())
}
์ด ๊ฒฝ์ฐ ()์์ ์ ์ ๊ฐ์ด Key๊ฐ ๋๊ณ ํด๋น ๋งค์๋์ ํธ์ถ ๊ฒฐ๊ณผ๊ฐ Value๋ก ์ ์ฅ๋๋ค.
Model์ Map | |
Key | Value |
yoil | getYoil์ date ๊ฐ์ฒด ๋ฃ์์ ๋ ๋ฐํ ๊ฐ |
c. ํด๋น ์ด๋ ธํ ์ด์ ์ผ๋ก ์๊ธด ์ฝ๋์ ๊ฒฝ์ ์ฑ
// 1. ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ปจํธ๋กค๋ฌ ๋งค์๋์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ํ์๊ฐ ์๋ค!
// >> ์ด์งํผ @ModelAttribute ์ด๋
ธํ
์ด์
์ด ์๋์ผ๋ก ๋ชจ๋ธ์ ๋ค ๊ฐ์ ์ ์ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
public String main(@ModelAttribute MyDate date) {
if(!isVaild(date)) {
return "yoilError";
}
//2. ์ด๋
ธํ
์ด์
์ ์ผ๋ฐ ๋งค์๋ ๋ฐํํ ์์ ์ด ๊ฒฝ์ฐ ์ด ์ฝ๋๋ ํ์๊ฐ ์๋ค.
// @ModelAttribute("yoil") getYoil(...){...}์ ๋ฐ์ ๊ณผ์ ์ ํฌํจํ๋ค.
// char yoil = getYoil(date);
//3. ์ด๋
ธํ
์ด์
์ ์๋ ๊ฐ ์ ์ฅ ๋ฅ๋ ฅ์ผ๋ก ํด๋น ์ฝ๋๋ค์ด ํ์ ์์ด์ก๋ค.
// model.addAttribute("myDate",date);
// model.addAttribute("yoil", yoil);
return "yoil";
}
private @ModelAttribute("yoil") char getYoil(MyDate date) {
return getYoil(date.getYear(), date.getMonth(), date.getDay());
}
(3) ์ด๋ ธํ ์ด์ ์ ์๋ต ๊ฐ๋ฅํ ๊ฒฝ์ฐ
์ฐธ์กฐํ ๋ณ์์ ๊ฒฝ์ฐ @ModelAttribute๋ฅผ ์๋ต ๊ฐ๋ฅํ๋ค.
// public String main( @ModelAttribute("mydate")MyDate date) ์๋์ ๋์ผ
public String main(MyDate date) {
๋ฐ๋ผ์ ๊ทธ๋ฅ ์ฐธ์กฐํ ๋ณ์ ์ ์ธ๋ง ํด๋ Spring FrameWork๊ฐ ์์์ ๊ฐ์ Map์ ์ ์ฅ์์ผ์ค๋ค.
**์ฐธ๊ณ **
๊ธฐ๋ณธํ์ด๋ String ๋งค๊ฐ๋ณ์์ผ ๊ฒฝ์ฐ ์์ @RequestParam ์ด๋ ธํ ์ด์ ์ด ์๋ต๋์ด ์์๋ค.
ํด๋น ์ด๋ ธํ ์ด์ ์ ์ ์ ์ด๋ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์๋์ผ๋ก ์์ฒญ์ ํ๋ผ๋ฏธํฐ์ ๊ธฐ๋ณธํ,String ๋งค๊ฐ๋ณ์๋ฅผ Binding ํด์คฌ๋ค.
์ฐธ์กฐํ์ผ ๊ฒฝ์ฐ ์์ @ModelAttribute๊ฐ ์๋ต๋์ด ์์ด์ ์๋์ผ๋ก ์ฐธ์กฐํ ๋ณ์ ๊ฐ์ Model์ Map์ ์ ์ฅ์์ผ ์คฌ๋ค.
์ด๋ฌํ ์ฐจ์ด๊ฐ ์๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น?
๋จผ์ , ๊ธฐ๋ณธํ์ด๋ String ๋งค๊ฐ๋ณ์๋ ๋ชจ๋ธ์ ๋ฃ์ ์ด์ ๊ฐ ์๋ค.
์๋๋ฉด, View ๋ํ ์์ฒญ์ parameter์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์์ฒญ์ ํ๋ผ๋ฏธํฐ๋ ์ ๋ ฅ ๋ถ๋ถ์ ์๊ธฐ ๋๋ฌธ์ Controller๋ view๋ ์ง์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ชจ๋ธ์ ๋ฃ์ ํ์๊ฐ ์๋ค.
๋ฐ๋ฉด ์ฐธ์กฐํ ๋ณ์ (ex - ๊ฐ์ฒด)๋ ์ ๋ ฅ์ ์กด์ฌํ์ง ์๊ณ , ์ปจํธ๋กค๋ฌ ์์ญ์ ์กด์ฌํ๋ ๋ ์์ด๋ค. ๋ฐ๋ผ์ View์์๋ ํด๋น ๋ณ์๋ค์ ์ฌ์ฉํ๋ ค๋ฉด, ์ปจํธ๋กค๋ฌ์ View์ ๋งค๊ฐ์ฒด์ธ Model์ ๊ผญ ์์ด์ผํ๋ค.
SpringFramWork๋ ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ํธ์๋ฅผ ์ ๊ณตํ ๊ฒ์ด๋ค.
2. WebDataBinder
(1) ๊ธฐ๋ฅ
WebDataBinder๋ ์์ฒญ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ปจํธ๋กค๋ฌ ๋งค์๋์ ๋งค๊ฐ๋ณ์์ ์ฐ๊ฒฐํ ๋ ์๋ํ๋ ๋ ์์ด๊ณ , 2๊ฐ์ง ๊ธฐ๋ฅ์ ํ๋ค.
์ฒซ ๋ฒ์งธ๋ ํ ๋ณํ์ด๋ค. String์ผ๋ก ๋ค์ด์จ ๊ฐ๋ค์ ์ปจํธ๋กค๋ฌ ๋งค์๋์ ๋งค๊ฐ๋ณ์์ ๋ง๊ฒ ํ ๋ณํ ์์ผ์ค๋ค. ์ด๋์ ๊ฒฐ๊ณผ์ ์๋ฌ๋ฅผ BindingResult๋ ํด๋์ค์ ๊ฐ์ฒด์ ์ ์ฅํ๋ค.
๋ ๋ฒ์งธ๋ ๋ฐ์ดํฐ ๊ฒ์ฆ์ด๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ํจํ ๊ฐ์ธ์ง ๊ฒ์ฌํ๋ ๊ฒ์ด๋ค. ์์์ ์๋ฅผ ๋ค์ด month๋ 1~12๊น์ง๋ง ๊ฐ๋ฅํ๋ค. ์ด๋ month =34๊ฐ ๋ค์ด์จ๋ค๋ฉด ์ด๋ ์ ํจํ์ง ์์ ๊ฐ์ด๋ค.
๋ฐ์ดํฐ ๊ฒ์ฆ ๊ฒฐ๊ณผ์ ๋ฐ์ํ ์๋ฌ๋ BindingResult์ ๊ฐ์ฒด์ ์ ์ฅํ๋ค.
(2) ์ฝ๋ ๋ฆฌ๋ทฐ
//BindingResult์ ๊ฐ์ฒด๋ ์์ธ์ฒ๋ฆฌ ๋งค์๋์ ๋งค๊ฐ๋ณ์๋ก๋ ์ฐ์ผ ์ ์๋ค.
@ExceptionHandler(Exception.class)
public String Catcher (Exception ex, BindingResult result) {
System.out.println("result="+result);
//BindingResult ์์ ๋ณ์ ์ค ํ๋์ธ error ๊ฐ์ฒด๋ฅผ ํ์ฉํ์ฌ
// ์ด๋ค ์๋ฌ๊ณ ์ด๋์ ๋ฐ์ํ๋์ง ํ์ธํ๋ค.
FieldError error = result.getFieldError();
System.out.println("code="+error.getCode());
System.out.println("field="+error.getField());
System.out.println("msg="+error.getDefaultMessage());
ex.printStackTrace();
return "yoilError";
}
//์๋ BindingResult๋ ์ปจํธ๋กค๋ฌ ๋งค์๋์์ ์ฒ๋ฆฌํ๋ค.
// ์ฌ๊ธฐ์๋ URL์ ์ง์ ์น๊ณ ๋ค์ด์์ ์๊ธฐ๋ ์๋ฌ๋
// ์ปจํธ๋กค๋ฌ๊น์ง ์๊ฐ๊ณ ์์ธ์ฒ๋ฆฌ ๋ถ๋ถ์์ catch ํด์ ์ฒ๋ฆฌํ๋ค.
// ์์น๋ ํญ์ ๊ฒ์ฌ ๋นํ๋ ๋งค๊ฐ๋ณ์๋ค๋ณด๋ค ๋ค์ด๋ค.
@RequestMapping("/getYoilMVC6")
public String main(MyDate date, BindingResult result) {
System.out.println("result= " + result);
if(!isVaild(date)) {
return "yoilError";
}
return "yoil";
}
3. ์ค์ค๋ก ํด๋ณด๊ธฐ
yoilMVC5, yoilMVC6 ์์ ๊ณ yoilMVC4๋ก ์๋ก ๋ง๋ค์ด๋ด.