๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ์ธ ๊ณต๋ถ€/WEB

[๊ฐ•์˜ ์ •๋ฆฌ] ์Šคํ”„๋ง MVC ํ™œ์šฉ

by syLim___ 2024. 2. 29.
728x90

 

๊ฐ•์˜ ์ถœ์ฒ˜: https://www.inflearn.com/course/%EC%9B%B9-mvc

 

์Šคํ”„๋ง ์›น MVC ๊ฐ•์˜ - ์ธํ”„๋Ÿฐ

์ด ๊ฐ•์˜๋Š” ์ž๋ฐ” ์„œ๋ธ”๋ฆฟ(Servlet) ๊ธฐ๋ฐ˜์˜ MVC ํ”„๋ ˆ์ž„์›Œํฌ์ธ ์Šคํ”„๋ง ์›น MVC์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์›ํ• ํ•œ ํ•™์Šต์„ ์œ„ํ•ด์„œ ใ€Š์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ํ•ต์‹ฌ ๊ธฐ์ˆ ใ€‹ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•ด์ฃผ์„ธ์š”., ์Šคํ”„๋ง ์›น MVC์˜ ํ•ต์‹ฌ ์›

www.inflearn.com


 

๐Ÿ‘ฉ‍๐Ÿ’ป HTTP ์š”์ฒญ ๋งตํ•‘ํ•˜๊ธฐ

 

@RequestMapping(์š”์ฒญurl)

 -  ๋ฉ”์„œ๋“œ ์ง€์ • ์•ˆ ํ•ด์ฃผ๋ฉด ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๊ฒŒ ๋œ๋‹ค

 - ํŠน์ • ๋ฉ”์„œ๋“œ ์ง€์ • ํ•ด์ฃผ๋ ค๋ฉด:

    @RequestMapping(value={์š”์ฒญurl}  , method=RequestMethod.GET)

    @RequestsMapping(value={์š”์ฒญurl}, method={RequestMethod.GET, RequestMethod.POST})

 

โœ… @RequestMapping url ํŒจํ„ด

 ?: ํ•œ ๊ธ€์ž (“/author/???” => “/author/123”) 

 *: ์—ฌ๋Ÿฌ ๊ธ€์ž (“/author/*” => “/author/keesun”) 

 **: ์—ฌ๋Ÿฌ path (“/author/** => “/author/keesun/book”) 

 ์ •๊ทœํ‘œํ˜„์‹ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

 - ์Šคํ”„๋ง์—์„œ๋Š” URI ํ™•์žฅ์ž ๋งตํ•‘ (.json, .zip ๋“ฑ)์„ ์ง€์›ํ•˜์ง€๋งŒ, ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ

 - RFD Attack ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ

 - ๊ทธ๋ž˜์„œ ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š” URI ํ™•์žฅ์ž ๋งตํ•‘ ๊ธฐ๋Šฅ์ด ๋ง‰ํ˜€ ์žˆ์Œ

 

โœ… ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํŠน์ •ํ•œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ธฐ

 

@ReqestMapping(consumes=MediaType.APPLICATION_JSON_UTF8_VALUE, value="", method="")

 

์š”์ฒญ ๋ฉ”์‹œ์ง€ ํ—ค๋”์˜ Content-Type:{}์ด ํ•ธ๋“ค๋Ÿฌ์˜ consumes={} ์™€ ๊ฐ™์œผ๋ฉด ๋งตํ•‘์ด ๋œ๋‹ค

Content-Type ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ์‘๋‹ต์ฝ”๋“œ๋Š” 415 Unsupported media type

 

โœ… ํŠน์ • ํƒ€์ž…์˜ ์‘๋‹ต์„ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ธฐ

 

@RequestMapping(produces=MediaType.TEXT_PLAIN_VALUE, value="", method="")

 

์š”์ฒญ ๋ฉ”์‹œ์ง€ ํ—ค๋”์˜ Accept:{}์ด ํ•ธ๋“ค๋Ÿฌ์˜ produces={} ์™€ ๊ฐ™์œผ๋ฉด ๋งตํ•‘์ด ๋œ๋‹ค

Accept์™€ produces ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ์‘๋‹ต์ฝ”๋“œ๋Š” 406 Not Acceptable

 

๋งŒ์•ฝ ์š”์ฒญ๋ฉ”์‹œ์ง€์— Accept ํ—ค๋”๊ฐ€ ์—†์œผ๋ฉด? -> ๋งตํ•‘ ์„ฑ๊ณตํ•œ๋‹ค.

 

 ๋งŒ์•ฝ ํด๋ž˜์Šค์— ์„ ์–ธํ•œ @RequestMapping๊ณผ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ์— ์„ ์–ธํ•œ @RequestMapping์— ๋ชจ๋‘ content type ์„ค์ •์„ ํ•ด์ฃผ๋ฉด,

ํด๋ž˜์Šค ์–ด๋…ธํ…Œ์ด์…˜์˜ ์„ค์ •์ •๋ณด๋Š” ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ ์„ค์ •์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ๋‹ค.

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป ํ—ค๋”์™€ ๋งค๊ฐœ๋ณ€์ˆ˜

 

์ด๋ฒˆ์—๋Š”

์œ„์—์„œ ํ•œ consumes, produces ๋ณด๋‹ค ๋” ์ œ๋„ˆ๋Ÿดํ•œ

 

Http์š”์ฒญ์— ํŠน์ •ํ•œ ํ—ค๋”๊ฐ’์ด ์žˆ๊ฑฐ๋‚˜ ์—†์„ ๊ฒฝ์šฐ ํ•ธ๋“ค๋Ÿฌ์™€ ๋งตํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•!

 

 

โœ… ํ—ค๋” ๊ด€๋ จ

// ์š”์ฒญํ—ค๋”์— from์ด ์žˆ๋Š” ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฒ ๋‹ค๋Š” ๋œป
@GetMapping(value="", headers = HttpHeaders.FROM)

// ์š”์ฒญํ—ค๋”์— from์ด ์—†๋Š” ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฒ ๋‹ค๋Š” ๋œป
@GetMapping(value="", headers = "!" + HttpHeaders.FROM)

 

์š”์ฒญํ—ค๋”์™€ ํ•ธ๋“ค๋Ÿฌ ํ—ค๋” ๋งค์น˜ ๋˜์ง€ ์•Š์œผ๋ฉด, ์‘๋‹ต์ฝ”๋“œ๋Š” 404 NOT FOUND

 

 

@GetMapping(value = "/test", headers = HttpHeaders.FROM + "=111")

์ด๋ ‡๊ฒŒ ํ—ค๋” ๊ฐ’๊นŒ์ง€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•ด์ค„ ์ˆ˜๋„ ์žˆ์Œ

 

 

 

 

 

โœ… ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ด€๋ จ

 

 

Request param ์— ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋„๋ก ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ

@GetMapping(value = "/test", params = "name")

 

์š”์ฒญ์— name์ด๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์œผ๋ฉด, ์‘๋‹ต์ฝ”๋“œ๋Š” 400 BAD REQUEST

 

@GetMapping(value = "/test", params = "name=sy")

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐธ๋ฅ˜๊นŒ์ง€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ

์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ์‘๋‹ต์ฝ”๋“œ๋Š” 400 BAD REQUEST

 

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป Http method - HEAD์™€ OPTIONS

 

head๋กœ ์š”์ฒญ๋ณด๋‚ด๋ฉด -> get์š”์ฒญ์ด ๊ฐ„๋‹ค -> ์‘๋‹ต์€ ๋ฐ”๋”” ๋นผ๊ณ  ์‘๋‹ต ํ—ค๋”๋งŒ ์˜ด

 

 

Options ๋ฉ”์„œ๋“œ:

์„œ๋ฒ„๋‚˜ ํŠน์ • URI์— ํ•ด๋‹นํ•˜๋Š” ํŠน์ • ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

๋˜๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ด์•„์žˆ๋Š”์ง€, ์š”์ฒญ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ์ง€ ๋“ฑ

 

 

Allow: GET, HEAD, OPTIONS

(GET์€ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ / HEAD, OPTIONS๋Š” ์Šคํ”„๋งMVC๊ฐ€ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ)

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป Custom Annotation

 

โœ… Meta Annotation

 - ์–ด๋…ธํ…Œ์ด์…˜ ์œ„์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 

 

โœ… Composed Annotation

 - ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ๋งŒ๋“œ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 - ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•œ ๊ฐœ ์ด์ƒ ์ ์šฉํ•ด์„œ ๋งŒ๋“  ์–ด๋…ธํ…Œ์ด์…˜

 - Composed Annotation์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ @Target, @Retention์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

 

โœ… @Retention

 - ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์–ธ์ œ๊นŒ์ง€ ์œ ์ง€ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด

 - ๊ธฐ๋ณธ๊ฐ’์€ CLASS : ์ปดํŒŒ์ผ์ด ๋˜์–ด๋„ .class ์•ˆ์— ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๊ฐ€ ๋‚จ์•„ ์žˆ์Œ. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ์ˆœ๊ฐ„ ์ด ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋Š” ์‚ฌ๋ผ์ง„๋‹ค.

 - ์Šคํ”„๋ง์œผ๋กœ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด , Retention์„ RUNTIME์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

- Retention = SOURCE : ์ฃผ์„๊ฐ™์€๊ฑฐ ์ ์„๋•Œ. ์†Œ์Šค์ฝ”๋“œ์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 

 

 

โœ… @Documented

 - ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์˜ ํ•„๋“œ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ณต์‹ ๋ฌธ์„œ์— ์ ๋Š”๋‹ค๋Š” ๋œป

 

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌํ€˜์ŠคํŠธ๋งตํ•‘์˜ ๊ณต์‹๋ฌธ์„œ:

 

 

 

 

โœ… MatrixVariable

 

 

 

 

728x90

'๊ฐœ์ธ ๊ณต๋ถ€ > WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

@SessionAttribute, @SessionAttriubtes  (2) 2024.03.01
@ModelAttribute  (0) 2024.03.01
304 NOT MODIFIED  (0) 2024.02.28
[๊ฐ•์˜ ์ •๋ฆฌ] ์Šคํ”„๋ง MVC ์„ค์ •(2)  (0) 2024.02.21
HTTP ํ”„๋กœํ† ์ฝœ  (0) 2023.08.14