๐Ÿฅž BE
home

REST API

Date
2024/08/29
Category
Web
Tag
Basic
Detail

REST

REpresentational State Transfer
์›น ์„œ๋น„์Šค ๊ตฌ์ถ• ๋ฐ ๊ด€๋ฆฌ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ์Šคํƒ€์ผ๋กœ, ์ฃผ์š” ๋ชฉํ‘œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ํ†ตํ•ฉ ๋ฐ ์ž‘์—…์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

REST API์˜ ์ž‘๋™ ๋ฐฉ์‹

REST API๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
๊ฐ HTTP ์š”์ฒญ์€ ๋ฉ”์„œ๋“œ, URI(Uniform Resource Identifier), ํ—ค๋” ๋ฐ ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์„œ๋ฒ„๋Š” ๋ฉ”์„œ๋“œ์™€ URI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ƒํƒœ ์ฝ”๋“œ, ํ—ค๋” ๋ฐ ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์ด ํฌํ•จ๋œ HTTP ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
REST๋Š” GET, POST, PUT, DELETE ๋ฉ”์„œ๋“œ๋กœ ๊ฐ๊ฐ CRUD๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

REST ๊ธฐ๋ณธ ์›์น™

1.
ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ง‘์ค‘ํ•˜๊ณ , ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
2.
๋ฌด์ƒํƒœ์„ฑ (Stateless): ๊ฐ ์š”์ฒญ์€ ์ž์ฒด์ ์œผ๋กœ ์™„์ „ํ•ด์•ผ ํ•˜๋ฉฐ, ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  ์ •๋ณด๋Š” ์š”์ฒญ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ ์š”์ฒญ์—์„œ ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.
3.
์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ์„ฑ: ์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์บ์‹œ ๊ฐ€๋Šฅํ•œ ์‘๋‹ต์„ ์ €์žฅํ•˜๊ณ , ๊ฐ™์€ ์š”์ฒญ์— ๋Œ€ํ•ด ์„œ๋ฒ„์— ๋‹ค์‹œ ์š”์ฒญํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ํšจ์œจ์„ฑ๊ณผ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ๋‹ค.
4.
๊ณ„์ธตํ™” ์‹œ์Šคํ…œ (Layered System): ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ค‘๊ฐœ์ž(์˜ˆ: ํ”„๋ก์‹œ, ๊ฒŒ์ดํŠธ์›จ์ด)๋ฅผ ๋‘์–ด ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ์„ฑ ๋ฐ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ค‘๊ฐ„ ๋ ˆ์ด์–ด์˜ ์กด์žฌ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
5.
์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ (Uniform Interface): REST๋Š” ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ:
โ€ข
๋ฆฌ์†Œ์Šค ์‹๋ณ„: ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ๊ณ ์œ ํ•œ URI๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋œ๋‹ค.
โ€ข
๋ฆฌ์†Œ์Šค ํ‘œํ˜„: ๋ฆฌ์†Œ์Šค๋Š” XML, JSON ๋“ฑ์˜ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.
โ€ข
ํ‘œํ˜„์„ ํ†ตํ•œ ์ƒํƒœ ์ „๋‹ฌ: ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ํ†ตํ•ด ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค ์ƒํƒœ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

REST API ํ™œ์šฉ ์‹œ ๊ณผ์ œ

โ€ข
๋ฒ„์ „ ๊ด€๋ฆฌ:ย API๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
โ€ข
์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ:ย REST API๋ฅผ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ ์ธ์ฆ, OAuth ๋˜๋Š” JWT(JSON ์›น ํ† ํฐ)์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ํ‘œ์ค€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ API ๋ณด์•ˆ์„ ์œ„ํ•ด์„œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๊ณ  ์ ์ ˆํ•œ ๊ตฌํ˜„์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
โ€ข
๋น„์œจ ์ œํ•œ ๋ฐ ํ• ๋‹น๋Ÿ‰:ย ๋น„์œจ ์ œํ•œ ๋ฐ ํ• ๋‹น๋Ÿ‰์„ ์ ์šฉํ•˜๋ฉด API์˜ ๊ณผ๋„ํ•œ ์‚ฌ์šฉ์ด๋‚˜ ๋‚จ์šฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๊ณต์ •ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ์ ๋ฒ•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ๊ณผ ์—„๊ฒฉํ•จ์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋„๋ก ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค.
โ€ข
ํ˜ธํ™˜์„ฑ:ย ๊ธฐ์ˆ , ํ”Œ๋žซํผ ๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” REST API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ๋„๋ฆฌ ์ธ์ •๋˜๋Š” ํ‘œ์ค€๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋ฉด ํ˜ธํ™˜์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.
โ€ข
์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ฌธ์„œํ™”:ย ์„ฑ๊ณต์ ์ธ REST API๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํฌ๊ด„์ ์ธ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด๋‹ค. ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ฌธ์ œ ๋””๋ฒ„๊น… ๋ฐ ํ•ด๊ฒฐ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

URI, URL, URN

URL ๊ตฌ์„ฑ ์ดํ•ดํ•˜๊ธฐ

โ€ข
ํ”„๋กœํ† ์ฝœ : https
โ€ข
ํ˜ธ์ŠคํŠธ๋ช… : www.google.com
โ€ข
ํฌํŠธ๋ฒˆํ˜ธ : 443
โ€ข
ํŒจ์Šค : /search
โ€ข
์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ : q=hello&hl=ko

Scheme

โ€ข
์ฃผ๋กœ ํ”„๋กœํ† ์ฝœ(์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž์›์— ์ ‘๊ทผํ•  ๊ฒƒ์ธ๊ฐ€ ํ•˜๋Š” ์•ฝ์† ๊ทœ์น™)์‚ฌ์šฉ
โ€ข
์˜ˆ) http, https, ftp ๋“ฑ๋“ฑ
โ€ข
http๋Š” 80 ํฌํŠธ, https๋Š” 443 ํฌํŠธ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ, ํฌํŠธ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ

host

โ€ข
ํ˜ธ์ŠคํŠธ๋ช…(www.google.com)
โ€ข
๋„๋ฉ”์ธ๋ช… ๋˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

port

โ€ข
์ ‘์† ํฌํŠธ
โ€ข
์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๋žต ๊ฐ€๋Šฅ
โ€ข
์ƒ๋žต ์‹œ http๋Š” 80, https๋Š” 443 ํฌํŠธ ๋ฒˆํ˜ธ๋กœ ์„ค์ •๋œ๋‹ค.
โ€ข
ํ†ฐ์บฃ์€ 8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉ

path

โ€ข
๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ(path)
โ€ข
๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋จ
โ—ฆ
/home/file1.jpg
โ—ฆ
/members
โ—ฆ
/members/100
โ—ฆ
/items/iphone12

query

โ€ข
query parameter, query string ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆผ, ์›น์„œ๋ฒ„์— ์ œ๊ณตํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฌธ์ž ํ˜•ํƒœ
โ€ข
key=value ํ˜•ํƒœ
โ€ข
?๋กœ ์‹œ์ž‘๋˜๋ฉฐ, &๋กœ ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
โ€ข
ex) ?keyA=valueA&keyB=valueB

fragment

โ€ข
html ๋‚ด๋ถ€ ๋ถ๋งˆํฌ ๋“ฑ์— ์‚ฌ์šฉ
โ€ข
์›น๋ฌธ์„œ ํ•ด์‹œํƒœํฌ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ
โ€ข
์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ์ •๋ณด ์•„๋‹˜

Reference

๐ŸŒ URL ๊ตฌ์„ฑ ์š”์†Œ & ์š”์ฒญ ํ๋ฆ„ ์ •๋ฆฌ
URL ๊ตฌ์„ฑ ์ดํ•ดํ•˜๊ธฐ ํ”„๋กœํ† ์ฝœ : https ํ˜ธ์ŠคํŠธ๋ช… : www.google.com ํฌํŠธ๋ฒˆํ˜ธ : 443 ํŒจ์Šค : /search ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ : q=hello&hl=ko scheme ์ฃผ๋กœ ํ”„๋กœํ† ์ฝœ(์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž์›์— ์ ‘๊ทผํ•  ๊ฒƒ์ธ๊ฐ€ ํ•˜๋Š” ์•ฝ์† ๊ทœ์น™) ์‚ฌ์šฉ ์˜ˆ) http, https, ftp ๋“ฑ๋“ฑ http๋Š” 80 ํฌํŠธ, https๋Š” 443 ํฌํŠธ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ, ํฌํŠธ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ userinfo URL์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์„œ ์ธ์ฆ ์š”์ฆ˜์€ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ host ํ˜ธ์ŠคํŠธ๋ช…(www.google.com) ๋„๋ฉ”์ธ๋ช… ๋˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ port ์ ‘์† ํฌํŠธ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๋žต ๊ฐ€๋Šฅ ์ƒ๋žต ์‹œ http๋Š” 80, https๋Š” 443 ํฌํŠธ ๋ฒˆํ˜ธ๋กœ ์„ค์ •๋œ๋‹ค. ํ†ฐ์บฃ์€ 8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉ path ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ(pa..