@ReqeustMapping

dongerangukยท2021๋…„ 11์›” 25์ผ
0
post-custom-banner

1. @RequestMapping ์„ ์ด์šฉํ•œ ์š”์ฒญ ๋งคํ•‘

ํด๋ผ์ด์–ธํŠธ๋Š” URL๋กœ ์š”์ฒญ์„ ์ „์†กํ•˜๋Š”๋ฐ, ์š”์ฒญ URL์„ ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด @RequestMapping์ด๋‹ค.

1.1. @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) {
	...
}

3. HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

  • HttpServletRequest์˜ getParameter() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•˜๊ธฐ
  • @RequestParam ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•˜๊ธฐ
  • ์ปค๋งจ๋“œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•˜๊ธฐ

3.1. @RequestParam ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ตฌํ•˜๊ธฐ

required์†์„ฑ์˜ ๊ฐ’์„ false๋กœ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, defaultValue์†์„ฑ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด,
์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ 400์—๋Ÿฌ๋ฅผ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค.

3.2. ์ปค๋งจ๋“œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ํผ ์ „์†ก ์ฒ˜๋ฆฌํ•˜๊ธฐ

ํผ์„ ์ด์šฉํ•ด์„œ ์ „์†กํ•œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ปค๋งจ๋“œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์ปค๋งจ๋“œ ๊ฐ์ฒด๋Š” ๋ทฐ์— ์ „๋‹ฌํ•  ๋ชจ๋ธ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋œ๋‹ค.

boolean ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๊ฐ–๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง MVC๊ฐ€ ์•Œ๋งž๊ฒŒ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•ด์„œ "true"๋ฅผ booleanํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

๊ฐ™์€ ์ด๋ฆ„์˜ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์กด์žฌํ•  ๊ฒฝ์šฐ, ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก์„ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด ๋œ๋‹ค(ex.checkbox)

map์„ ์ด์šฉํ•ด์„œ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด ์ž๋ฐ”๋นˆ์„ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


4. ์ปค๋งจ๋“œ ๊ฐ์ฒด์˜ ์ค‘์ฒฉ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ง€์›

์Šคํ”„๋ง์€ ์ปค๋งจ๋“œ ๊ฐ์ฒด์˜ ์ค‘์ฒฉ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.
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: ์ ‘๋‘์–ด ๋’ค์— ๊ฒฝ๋กœ๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.

/์˜ ์œ ๋ฌด : ์œ -์ ˆ๋Œ€๊ฒฝ๋กœ ๋ฌด-์ƒ๋Œ€๊ฒฝ๋กœ


5. ์ปค๋งจ๋“œ ๊ฐ์ฒด ๊ฐ’ ๊ฒ€์ฆ๊ณผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๊ฒ€์‚ฌํ•  ๋•Œ์—๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค.

  • ์›น ๋ธŒ๋ผ์šฐ์ € : ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์›น ์„œ๋ฒ„์— ์ „์†กํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • ์›น ์„œ๋ฒ„ : ์ „๋‹ฌ๋ฐ›์€ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์‘๋‹ตํ•˜๊ฑฐ๋‚˜, ์žฌ์ž…๋ ฅ์„ ์œ„ํ•œ ํผ ํ™”๋ฉด์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•œ๋‹ค.

Validator

  • supports()
  • validate()

Errors

  • rejectValue()
  • reject

ValidatorUtils

  • rejectIfEmptyOrWhitespace(Errors errors, String field, String errCode, String defaultMessage)

Map์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฑ์—”๋“œ๋‹จ์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

rejectValue = ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฒ€์ฆ
reject = ๊ฐ์ฒด ์ž์ฒด์˜ ๊ฐ’ ๊ฒ€์ฆ

๊ธ€๋กœ๋ฒŒ Validator์™€ ์ปจํŠธ๋กค๋Ÿฌ Validator

<mvc:annotaion-driven validator="validator"/>
<bean id="validator" class="custom.CommonValidator"/ >


@Valid ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ JSR 303 ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ๊ฐ’ ๊ฒ€์ฆ ์ฒ˜๋ฆฌ

<mvc:annotation-driven/> ์„ ๋“ฑ๋ก๋งŒ ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ ,
ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์— ์ž‘์„ฑํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

์ปค์Šคํ…€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š”, messageSource ๋นˆ ๋“ฑ๋ก์ด ํ•„์š”ํ•œ๋ฐ, ํ”„๋กœํผํ‹ฐ์—๋Š” ์ปค์Šคํ…€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” properties ํŒŒ์ผ์„ ์ง€์ •ํ•ด์ค€๋‹ค.

post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€