Web/HTTP

HTTP ๋ฉ”์„œ๋“œ์™€ ํ™œ์šฉ

 

๐Ÿ“’ ์ข‹์€ URI ์„ค๊ณ„๋Š” ๋ญ˜๊นŒ?

๐Ÿ“Œ ๋ฆฌ์†Œ์Šค ์‹๋ณ„

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฆฌ์†Œ์Šค ์‹๋ณ„. ํšŒ์› ์ •๋ณด ๊ด€๋ฆฌ API๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ๋ญ๊ฐ€ ์žˆ๋”๋ผ...

ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ, ํšŒ์› ์กฐํšŒ, ํšŒ์› ๋“ฑ๋ก, ํšŒ์› ์ˆ˜์ •, ํšŒ์› ์‚ญ์ œ?

 

๐Ÿ“๋ฆฌ์†Œ์Šค๋ž€?

"ํšŒ์›"์ด๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ ๋ฐ”๋กœ ๋ฆฌ์†Œ์Šค!

 

๐Ÿ“๋ฆฌ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•˜๋‚˜?

ํšŒ์›์„ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ  ํšŒ์› ์ž์ฒด๋งŒ ๋ฆฌ์†Œ์Šค๋กœ ์‹๋ณ„ํ•ด์„œ ํšŒ์› ๋ฆฌ์†Œ์Šค๋ฅผ URI์— ๋งคํ•‘

 

๐Ÿ“Œ๋ฆฌ์†Œ์Šค์™€ ํ–‰์œ„ ๋ถ„๋ฆฌ

* URI๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„!

* ๋ฆฌ์†Œ์Šค์™€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ํ–‰์œ„๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•จ.

์˜ˆ์‹œ๋กœ ๋“ค์—ˆ๋˜ ํšŒ์› ์ •๋ณด ๊ด€๋ฆฌ API์˜ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค๋Š” ํšŒ์›์ด๊ณ  ํ–‰์œ„๋Š” ์กฐํšŒ, ๋“ฑ๋ก, ์‚ญ์ œ, ๋ณ€๊ฒฝ์ด๋‹ค.

์ฆ‰ ๋ฆฌ์†Œ์Šค๋Š” ๋ช…์‚ฌ, ํ–‰์œ„๋Š” ๋™์‚ฌ

 

๊ทธ๋Ÿผ ํ–‰์œ„(๋ฉ”์„œ๋“œ)๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•˜์ง€? ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์ด โ˜…HTTP ๋ฉ”์„œ๋“œโ˜…

 

 

๐Ÿ“’ HTTP ๋ฉ”์„œ๋“œ

๐Ÿ“Œ GET: ๋ฆฌ์†Œ์Šค ์กฐํšŒ

* ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋Š” query๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ

 

๐Ÿ“Œ POST: ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์ฃผ๋กœ ๋“ฑ๋ก์— ์‚ฌ์šฉ

* ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•ด๋‹ฌ๋ผ๊ณ  ์ „๋‹ฌ

* ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ. ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

* ์ฃผ๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋กœ ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก, ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ(๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์ด๋‚˜ ๋ณ€๊ฒฝ์„ ๋„˜์–ด ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ)์— ์‚ฌ์šฉ.

๋‹จ, POST์˜ ๊ฒฐ๊ณผ๋กœ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.  URI์— ๋™์‚ฌ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Œ. (:์ปจํŠธ๋กค URI ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ๋‹ฌ ์‹œ์ž‘์˜ ๊ฒฝ์šฐ  POST/orders/{orderId}/start-delivery)

-> ์ด ๋ฆฌ์†Œ์Šค URI์— POST ์š”์ฒญ์ด ์˜ค๋ฉด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๋ฆฌ์†Œ์Šค๋งˆ๋‹ค ๋”ฐ๋กœ ์ •ํ•ด์•ผ ํ•จ (์ •ํ•ด์ง„ ๊ฒƒ์ด ์—†์Œ)

-> ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์• ๋งคํ•˜๋ฉด POST

 

๐Ÿ“Œ PUT: ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ฒด, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ. ์žˆ์œผ๋ฉด ๋ฎ์–ด์“ฐ๊ธฐ

* ํด๋”์— ํŒŒ์ผ ๋ณต์‚ฌํ•˜๋Š” ๋กœ์ง๊ณผ ๊ฐ™์Œ.

* ๋ฆฌ์†Œ์Šค๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ์™„์ „ํžˆ ๋Œ€์ฒด, ์—†์œผ๋ฉด ์ƒ์„ฑ

* !์ฃผ์˜! ๊ธฐ์กด ๋‚ด์šฉ์„ ์™„์ „ํžˆ ๊ฐˆ์•„์น˜์šฐ๋Š” ๊ฒƒ. ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ค์›€. -> PATCH

* POST์™€์˜ ์ฐจ์ด์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„. POST๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ์€ ํ•˜์ง€๋งŒ ๋ช‡๋ฒˆ์— ๋„ฃ๋Š”์ง€ ์œ„์น˜๋Š” ๋ชจ๋ฆ„. ํ•˜์ง€๋งŒ PUT์€ ์ •ํ™•ํžˆ 100๋ฒˆ์— ์ง‘์–ด๋„ฃ์„๊ฑฐ์•ผ!๋ผ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์•Œ๊ณ  URI ์ง€์ •.

 

๐Ÿ“Œ PATCH: ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ

* ๋ฆฌ์†Œ์Šค๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์€ ๋ฆฌ์†Œ์Šค๋งŒ PATCH๋กœ ๋ณด๋‚ด์ฃผ๋ฉด ๋จ.

* PATCH๊ฐ€ ์ง€์›์ด ์•ˆ๋˜๋Š” ์„œ๋ฒ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ. (๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ ๋ ํ…Œ์ง€๋งŒ)

๐Ÿ“Œ DELETE: ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

* ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

 

 

๐Ÿ“’ HTTP ๋ฉ”์„œ๋“œ์˜ ์†์„ฑ

๐Ÿ“Œ ์•ˆ์ „ (Safe Methods)

*  ํ˜ธ์ถœํ•ด๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ. ๋กœ๊ทธ๊ฐ€ ์Œ“์ด๊ณ  ์–ด์ฉŒ๊ตฌ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ.

๐Ÿ“Œ๋ฉฑ๋“ฑ(Idempotent Methods) 

* f(f(x))=f(x)

* ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ์˜ค๋งŒ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๊ฒฐ๊ณผ๊ฐ€ ๋˜‘๊ฐ™์Œ.

* ๋ฉฑ๋“ฑ ๋ฉ”์„œ๋“œ: GET, PUT, DELETE (POST๋Š” ๋ฉฑ๋“ฑ์•„๋‹˜! ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ™์€ ๊ฒฐ์ œ๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.)

* ์žฌ์š”์ฒญ ์ค‘๊ฐ„์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ธํ•ด ์ค‘๊ฐ„์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ.

๐Ÿ“Œ์บ์‹œ ๊ฐ€๋Šฅ(Cacheable Medthods)

* ์‘๋‹ต ๊ฒฐ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹œํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”๊ฐ€?

* ์บ์‹œ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ: GET, HEAD, POST, PATCH

* ์‹ค์ œ๋กœ๋Š” GET๋งŒ ์บ์‹œ๋กœ ์‚ฌ์šฉ

 

 

๐Ÿ“’ HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ

๐Ÿ“Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์€ ํฌ๊ฒŒ 2๊ฐ€์ง€์ธ๋ฐ,

 

๐Ÿ“ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(์ฟผ๋ฆฌ ์ŠคํŠธ๋ง)๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

* ์ฐธ๊ณ ๋กœ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ž€ key-value ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ ธ์„œ '?'๋กœ ์‹œ์ž‘ํ•˜๋Š” '?q=hello&hl=ko'๊ฐ™์€๊ฒƒ

* GET ๋ฉ”์„œ๋“œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ

* ์ฃผ๋กœ ์ •๋ ฌ ํ•„ํ„ฐ (=๊ฒ€์ƒ‰์–ด)

 

๐Ÿ“ ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

* POST, PUT, PATCH ๋ฉ”์„œ๋“œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ

* ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก, ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ

 

๐Ÿ“ ์ •์  ๋ฐ์ดํ„ฐ ์กฐํšŒ

* ์ด๋ฏธ์ง€, ์ •์  ํ…์ŠคํŠธ ๋ฌธ์„œ ๋“ฑ์˜ ์กฐํšŒ๋Š” GET ์‚ฌ์šฉ

* ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ๋‹จ์ˆœ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋งŒ์œผ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ

 

๐Ÿ“ ๋™์  ๋ฐ์ดํ„ฐ ์กฐํšŒ

*  ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ key-value๊ฐ’์„ ์ด์šฉํ•ด ์ •๋ ฌ ํ•„ํ„ฐํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ

* ์ฃผ๋กœ ๊ฒ€์ƒ‰, ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์—์„œ ์ •๋ ฌ ํ•„ํ„ฐ(๊ฒ€์ƒ‰์–ด)

* ์กฐํšŒ ์กฐ๊ฑด์„ ์ค„์—ฌ์ฃผ๋Š” ํ•„ํ„ฐ, ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์ •๋ ฌ ์กฐ๊ฑด์— ์ฃผ๋กœ ์‚ฌ์šฉ

* ์กฐํšŒ๋Š” GET ์‚ฌ์šฉ, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

 

๐Ÿ“ HTML Form์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

* ์ด๋Ÿฐ HTML Form์—์„œ submitํ•˜๋ฉด

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ HTTP ๋ฉ”์„ธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์„œ body์— ๋„ฃ์–ด์คŒ.

* Content-Type: application/x-www-form-urlencoded ์‚ฌ์šฉ

* ํผ์˜ ๋‚ด์šฉ์„ ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์ „์†ก(key=value, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹)

* ์ „์†ก ๋ฐ์ดํ„ฐ๋ฅผ url encoding ์ฒ˜๋ฆฌ (์˜ˆ๋ฅผ ๋“ค์–ด, abc๊น€ -> abc%EA%B9%80)

* GET ๋ฉ”์„œ๋“œ๋„ ๊ฐ€๋Šฅํ•จ. (๋‹จ, ์กฐํšŒ์—๋งŒ ์‚ฌ์šฉ! ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ.)

* GET์ด๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ URL๊ฒฝ๋กœ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , POST๋ฉด ๋ฉ”์„ธ์ง€ body์— ๋„ฃ์–ด์คŒ.

* ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ๋‚˜ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์—ฌ๋Ÿฌ ํŒŒ์ผ๊ณผ ํผ์˜ ๋‚ด์šฉ์„ ํ•จ๊ป˜ ์ „์†กํ•  ๋•Œ๋Š” enctype="multipart/form-data"

* ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ

 

๐Ÿ“ HTTP API๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

* HTML Form์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”, ์ง์ ‘ ์†์ˆ˜ API๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•. Content-Type์€ json์œผ๋กœ.

* ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ

* ์„œ๋ฒ„ to ์„œ๋ฒ„, ์•ฑ ํด๋ผ์ด์–ธํŠธ, ์›น ํด๋ผ์ด์–ธํŠธ(Ajax, React)์™€ API ํ†ต์‹ 

* POST, PUT, PATCH: ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก

* GET: ์กฐํšŒํ•  ๋•Œ! ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

*  Content-Type: application/json <-์‚ฌ์‹ค์ƒ ํ‘œ์ค€