ํด๋ผ์ด์ธํธ๋ URL๋ก ์์ฒญ์ ์ ์กํ๋๋ฐ, ์์ฒญ URL์ ์ด๋ค ๋ฉ์๋๊ฐ ์ฒ๋ฆฌํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด @RequestMapping์ด๋ค.
@RequestMapping ์ด๋ ธํ ์ด์ ์ value์์ฑ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
@RequestMapping(value="/test")
@RequestMapping ์ด๋ ธํ ์ด์ ์ ๊ฐ์ ์ง์ ํ๋ฉด, ์ค์ ๋ก ์ฒ๋ฆฌ๋๋ URL์ ์๋ธ๋ฆฟ ๋งคํ์ ๋ฐ๋ฅธ ์ปจํธ๋กค๋ฌ ๊ฒฝ๋ก ๋งคํ๊ณผ ๋ํดํธ ์๋ธ๋ฆฟ ์ค์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ํ๋์ ๋ฉ์๋๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋, ๋ฐฐ์ด๋ก ๊ฒฝ๋ก ๋ชฉ๋ก์ ์ง์ ํ๋ฉด ๋๋ค.
@RequestMapping(value="{/test1, /test2}")
์ปจํธ๋กค๋ฌ์ ๋ฉ์๋์ @RequestMapping ์ด๋ ธํ ์ด์ ์ ๋ชจ๋ ์ฌ์ฉํ๋ฉด, ํด๋์ค์ ์ ์ฉํ ๊ฐ๊ณผ, ๋ฉ์๋์ ์ ์ฉํ ๊ฐ์ ์กฐํฉํด์ ๋งคํํ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํ๋ค.
@Contoroller
@RequestMapping("/event")
public class EventController {
@RequestMapping("/list")
public String list(Model model) {
...
return "evnet/list";
}
}
์ ์ฝ๋์์ list() ๋ฉ์๋์ ๋งคํ๋๋ ๊ฒฝ๋ก๋ "/event/list"๊ฐ ๋๋ค.
@RequestMapping ์ด๋ ธํ ์ด์ ์ ๊ฒฝ๋ก์ {๋ณ์} ํ์์ ๊ฒฝ๋ก ๋ณ์๋ฅผ ์ง์ ํ ์ ์๋๋ฐ, @PathVariable ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๊ฒฝ๋ก ๋ณ์์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ ์ ์๋ค.
@RequestMapping("/event/list?id={memberId}")
public String getId(@PathVariable String memberId, Model model) {
MemberInfo mi = new MemberInfo(memberId);
if(mi == null) {
return "member/memberNotFound"
}
model.addAttribute("member", mi);
return "member/memberDetail";
}
\d = ์ซ์
๊ฒฝ๋ก ๋ณ์์๋ ์ ๊ท ํํ์์ ์ฌ์ฉํ ์๋ ์๋ค.
@RequestMapping("/files/{fileId:[a-zA-Z]\\d\\d\\d}")
public String fileInfo(@PathVariable String fileId) {
...
}
์ ๊ท ํํ์์ ๋งค์นญ๋๋ ๊ฒฝ๋ก(ex. "/files/a100")๋ฅผ ์
๋ ฅํ๋ฉด, @RequestMapping์ด ์ ์ฉ๋ ๋ฉ์๋๋ฅผ ํตํด์ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
์ ๊ท ํํ์์ ๋งค์นญ๋์ง ์๋ ๊ฒฝ๋ก(ex. "/files/a10a")๋ฅผ ์
๋ ฅํ๋ฉด, ์คํ๋ง์ 404 ์๋ฌ๋ฅผ ์๋ตํ๋ค.
์์ฒญ ์ปจํ
์ธ ํ์
์ ์ ํํ๊ณ ์ถ๋ค๋ฉด, comsumes ์์ฑ์ ์ฌ์ฉํ๋ค.
Content-Type ์์ฒญ ํค๋๊ฐ "application/json"์ธ ๊ฒฝ์ฐ๋ง ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
@RequestMapping(value="/members/{memberId}", method=RequestMethod.GET,
comsumes="application/json")
public Result addMember(@RequestBody NewMember mem) {
...
}
๋ฐ๋๋ก ์๋ต ๊ฒฐ๊ณผ๋ก JSON์ ์๊ตฌํ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด,
produces ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
@RequestMapping(value="/members/{memberId}", method=RequestMethod.GET,
produces="application/json")
public Result addMember(@RequestBody NewMember mem) {
...
}
required์์ฑ์ ๊ฐ์ false๋ก ์ง์ ํ๊ฑฐ๋, defaultValue์์ฑ์ ๊ฐ์ ์ง์ ํ๋ฉด,
์์ฒญ ํ๋ผ๋ฏธํฐ๊ฐ ์กด์ฌํ์ง ์์๋ 400์๋ฌ๋ฅผ ์๋ตํ์ง ์๋๋ค.
ํผ์ ์ด์ฉํด์ ์ ์กํ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ๋์ ๊ฐ์ฒด์ ๋ด์์ ์ปค๋งจ๋ ๊ฐ์ฒด์ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ปค๋งจ๋ ๊ฐ์ฒด๋ ๋ทฐ์ ์ ๋ฌํ ๋ชจ๋ธ์ ์๋์ผ๋ก ํฌํจ๋๋ค.
boolean ํ์ ์ผ๋ก ๋ณํ ๊ฐ๋ฅํ ๊ฐ์ ๊ฐ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ง MVC๊ฐ ์๋ง๊ฒ ํ์ ๋ณํ์ ํด์ "true"๋ฅผ booleanํ์ ์ผ๋ก ๋ณํํด์ค๋ค.
๊ฐ์ ์ด๋ฆ์ ์์ฒญ ํ๋ผ๋ฏธํฐ๊ฐ ๋ ๊ฐ ์ด์ ์กด์ฌํ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ ์ด์ฉํด์ ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ชฉ๋ก์ ์ ๋ฌ๋ฐ์ผ๋ฉด ๋๋ค(ex.checkbox)
map์ ์ด์ฉํด์ ์ ๋ฌ๋ฐ์ผ๋ฉด ์๋ฐ๋น์ ๋ง๋ค์ง ์์๋ ๋๋ค.
์คํ๋ง์ ์ปค๋งจ๋ ๊ฐ์ฒด์ ์ค์ฒฉ ํ๋กํผํฐ๋ฅผ ์ง์ํ๋ค.
address ํ๋กํผํฐ๋ Address ํ์
์ ๊ฐ์ฒด์ด๋ค. address ํ๋กํผํฐ์๋ ๊ฐ์ ์ฑ์ฐ๊ณ ์ถ๋ค๋ฉด, ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ฒฉํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
<input type="text" name="address.address1"/>
<input type="text" name="address.address2"/>
<input type="text" name="address.zipcode"/>
private List<AccessPerm> perms;
public List<AccessPerm> getPerms() {
์ธ๋ฑ์ค ๋ฒํธ๊ฐ ์ค๊ฐ์ ๋น๋ฉด, null๊ฐ์ ๊ฐ๋ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
perm.get(1) : (id : null, canRead : null)
redirect: ์ ๋์ด ๋ค์ ๊ฒฝ๋ก๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ๋ด์์์ ๊ฒฝ๋ก๊ฐ ๋๋ค.
/์ ์ ๋ฌด : ์ -์ ๋๊ฒฝ๋ก ๋ฌด-์๋๊ฒฝ๋ก
์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฒ์ฌํ ๋์๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ค.
Validator
Errors
ValidatorUtils
Map์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฐฑ์๋๋จ์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์๊ฒ ๋๋ค.
rejectValue = ํ๋กํผํฐ ๊ฐ ๊ฒ์ฆ
reject = ๊ฐ์ฒด ์์ฒด์ ๊ฐ ๊ฒ์ฆ
<mvc:annotaion-driven validator="validator"/>
<bean id="validator" class="custom.CommonValidator"/ >
<mvc:annotation-driven/> ์ ๋ฑ๋ก๋ง ํด์ฃผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์คํ๋ง์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ,
ํ๋กํผํฐ ํ์ผ์ ์์ฑํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฝ์ด์ฌ ์๋ ์๋ค.
์ปค์คํ ๋ฉ์์ง๋ฅผ ์ฝ์ด์ค๊ธฐ ์ํด์๋, messageSource ๋น ๋ฑ๋ก์ด ํ์ํ๋ฐ, ํ๋กํผํฐ์๋ ์ปค์คํ ๋ฉ์์ง๊ฐ ๋ด๊ฒจ์๋ properties ํ์ผ์ ์ง์ ํด์ค๋ค.