๊ฐ์ ์ถ์ฒ: 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
'๊ฐ์ธ ๊ณต๋ถ > 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 |