Jieunny์˜ ๋ธ”๋กœ๊ทธ

S2) Unit 8. [HTTP/๋„คํŠธ์›Œํฌ] REST API ๋ณธ๋ฌธ

CodeStates/learning contents

S2) Unit 8. [HTTP/๋„คํŠธ์›Œํฌ] REST API

Jieunny 2023. 1. 31. 18:00

๐Ÿ“ฃ  REST(Representational State Transfer) API

โœ”๏ธ ์›น์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์ž์›์„ HTTP URI๋กœ ํ‘œํ˜„ํ•˜๊ณ , HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹ -> ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ณ  ์ž˜ ์ž‘์„ฑ๋œ ๋ฉ”๋‰ดํŒ

โžฐ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—๋„ ๋ฐ์ดํ„ฐ์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๊ณ , ์‘๋‹ต์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ '๋ฉ”๋‰ดํŒ'์ด ํ•„์š”ํ•˜๋‹ค.

โžฐ ๋กœ์ด ํ•„๋”ฉ์ด๋ž€ ๋ฐ•์‚ฌ ํ•™์œ„ ๋…ผ๋ฌธ์—์„œ ์ตœ์ดˆ๋กœ ์†Œ๊ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์›น ์„ค๊ณ„์˜ ์šฐ์ˆ˜์„ฑ์— ๋น„ํ•ด ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ์•ˆํƒ€๊นŒ์›Œ ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ์จ REST๋ฅผ ๋ฐœํ‘œํ–ˆ๋‹ค.

 

๐Ÿ“ฃ  REST API ๋””์ž์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ”๏ธ ๋ฆฌ์ฐจ๋“œ์Šจ์˜ REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ

โžฐ ์‹ค์ œ๋กœ 3๋‹จ๊ณ„๊นŒ์ง€ ์ง€ํ‚ค๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— 2๋‹จ๊ณ„๊นŒ์ง€๋งŒ ์ ์šฉํ•ด๋„ ์ข‹์€ API ๋””์ž์ธ -> HTTP API ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

โžฐ ๋กœ์ด ํ•„๋”ฉ์€ 3๋‹จ๊ณ„๊นŒ์ง€ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ API๋Š” REST API๊ฐ€ ์•„๋‹Œ HTTP API๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅ.

 

0๏ธโƒฃ REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 0๋‹จ๊ณ„

โœ”๏ธ ๋‹จ์ˆœํžˆ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•ด๋„ ๋œ๋‹ค.

โœ”๏ธ REST API ๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋Š”, REST API ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋‹จ๊ณ„

โžฐ ์œ„์ฒ˜๋Ÿผ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•ด๋„ ๋œ๋‹ค.

 

1๏ธโƒฃ REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 1๋‹จ๊ณ„

โœ”๏ธ ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค์™€์˜ ํ†ต์‹ ์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

โœ”๏ธ ๋ชจ๋“  ์ž์›์€ ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค์— ๋งž๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฉฐ ์š”์ฒญํ•˜๊ณ  ๋ฐ›๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

โž• ์—”๋“œํฌ์ธํŠธ๋ž€?

๋”๋ณด๊ธฐ

โžฐ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ฑ„๋„์˜ ํ•œ์ชฝ ๋์— ํ•ด๋‹นํ•˜๋Š” URI (์ตœ์ข… ๋ชฉ์ ์ง€)

โžฐ API๋กœ ์š”์ฒญ์„ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ, ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ์‹œ์ž‘์ 

โžฐ ์ผ๋ฐ˜์ ์œผ๋กœ root-endpoint๋Š” ๋„๋ฉ”์ธ ์ฃผ์†Œ์˜ ๋ฃจํŠธ( / )๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

โžฐ 0๋‹จ๊ณ„์—์„œ๋Š” ์š”์ฒญ์—์„œ์˜ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ชจ๋‘ /appointment๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

โžฐ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„ ํ™•์ธ์ด๋ผ๋Š” ์š”์ฒญ์˜ ์‘๋‹ต์œผ๋กœ ๋ฐ›๊ฒŒ ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋Š” ํ—ˆ์ค€ ์ด๋ผ๋Š” ์˜์‚ฌ์˜ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋Œ€์ด๋‹ค.

โžฐ ๊ทธ๋ž˜์„œ ์š”์ฒญ ์‹œ /doctors/ํ—ˆ์ค€ ์ด๋ผ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

โžฐ ๋˜ํ•œ ํŠน์ • ์‹œ๊ฐ„์— ์˜ˆ์•ฝ์„ ํ•˜๋ฉด slots ๋ฆฌ์†Œ์Šค์˜ 123์ด๋ผ๋Š” id๋ฅผ ๊ฐ€์ง„ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์‹œ๊ฐ„์— ์˜ˆ์•ฝ ์š”์ฒญ์—์„œ๋Š” /slots/123 ์œผ๋กœ ์‹ค์ œ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์—”๋“œํฌ์ธํŠธ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

โžฐ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š”์ง€ ํ˜น์€ ์–ด๋–ค ์‘๋‹ต์ด ์ œ๊ณต๋˜๋Š”์ง€์— ๋”ฐ๋ผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

โžฐ ์š”์ฒญ์— ๋”ฐ๋ฅธ ์‘๋‹ต์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ •๋ณด + ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์„ฑ๊ณต/ ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

โžฐ 9์‹œ์— ์˜ˆ์•ฝ์„ ํ•˜์˜€์œผ๋‚˜, ์ด๋ฏธ ํ•ด๋‹น ์‹œ๊ฐ„์ด ๋งˆ๊ฐ๋˜์–ด ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

 

2๏ธโƒฃ REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 2๋‹จ๊ณ„

โœ”๏ธ CRUD์— ๋งž๊ฒŒ ์ ์ ˆํ•œ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

โžฐ  0, 1๋‹จ๊ณ„ ์—์„œ๋Š” ๋ชจ๋“  ์š”์ฒญ์„ CRUD์™€ ์ƒ๊ด€์—†์ด POST ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

โžฐ  2๋‹จ๊ณ„ ์—์„œ๋Š” ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์กฐํšŒ(READ), ํŠน์ • ์‹œ๊ฐ„์— ์˜ˆ์•ฝ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ƒ์„ฑ(CREATE)์™€ ๊ฐ™๋‹ค.

โžฐ  ๋•Œ๋ฌธ์— ์กฐํšŒ๋Š” GET, ์ƒ์„ฑ์€ POST ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

โžฐ  GET ๋ฉ”์„œ๋“œ๋Š” body๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— query parameter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

โžฐ  POST ์š”์ฒญ์˜ ์‘๋‹ต์€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์‘๋‹ต ์ฝ”๋“œ๋Š” 201 Created๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Location ํ—ค๋”์— ์ž‘์„ฑ๋œ URI๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿšจ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ทœ์น™

โžฐ GET ๋ฉ”์„œ๋“œ : ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค์ง€ ์•Š๋Š” ์š”์ฒญ์— ์‚ฌ์šฉ

โžฐ POST ๋ฉ”์„œ๋“œ : ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ

โžฐ PUT ๋ฉ”์„œ๋“œ : ์š”์ฒญ๋งˆ๋‹ค ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜(๋ฉฑ๋“ฑํ•˜๋‹ค) -> PUT๊ณผ POST ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉ

โžฐ PATCH ๋ฉ”์„œ๋“œ : ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉ -> PATCH์™€ PUT ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉ

 

3๏ธโƒฃ REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 3๋‹จ๊ณ„

โœ”๏ธ HATEOAS(Hypermedia As The Engine Of Application State) ๋ผ๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ์ปจํŠธ๋กค๋ฅผ ์ ์šฉํ•œ๋‹ค.

โœ”๏ธ ์š”์ฒญ์€ 2๋‹จ๊ณ„์™€ ๋™์ผํ•˜์ง€๋งŒ, ์‘๋‹ต์—๋Š” ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ํฌํ•จํ•œ ๋งํฌ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

โžฐ ์‘๋‹ต์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๋งํฌ ์š”์†Œ๋Š” ์‘๋‹ต์„ ๋ฐ›๋Š” ๋‹ค์Œ์— ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์•ก์…˜๋“ค์„ ์œ„ํ•ด ๋งŽ์€ ํ•˜์ดํผ๋ฏธ๋””์–ด ์ปจํŠธ๋กค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

โž• ํ•˜์ดํผ๋ฏธ๋””์–ด ์ปจํŠธ๋กค์ด๋ž€?

๋”๋ณด๊ธฐ

โžฐ ์ •์˜ : ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ

โžฐ REST API ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์ ์œผ๋กœ ์„œ๋ฒ„์™€ ๋™์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ

โžฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์–ด๋– ํ•œ ์š”์ฒญ์„ ํ•  ๋•Œ, ์š”์ฒญ์— ํ•„์š”ํ•œ URI๋ฅผ ์‘๋‹ต์— ํฌํ•จ์‹œ์ผœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์‹œ๊ฐ„์„ ํ™•์ธํ•œ ํ›„์—๋Š” ๊ทธ ์‹œ๊ฐ„๋Œ€์— ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

โžฐ ํŠน์ • ์‹œ๊ฐ„์— ์˜ˆ์•ฝ์„ ์™„๋ฃŒํ•˜๊ณ  ๋‚˜์„œ๋Š” ๊ทธ ์˜ˆ์•ฝ์„ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งํฌ๋ฅผ ์ž‘์„ฑํ•ด ๋„ฃ๋Š”๋‹ค.

โžฐ ์‘๋‹ต ๋‚ด์— ์ƒˆ๋กœ์šด ๋งํฌ๋ฅผ ๋„ฃ์–ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด 3๋‹จ๊ณ„์˜ ํ•ต์‹ฌ

 

๐Ÿ“ฃ  Open API

โœ”๏ธ ์ •๋ถ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณต๊ณต๋ฐ์ดํ„ฐ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ถ€๋Š” Open API์˜ ํ˜•ํƒœ๋กœ ๊ณต๊ณต๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

โžฐ ๊ธ€์ž ๊ทธ๋Œ€๋กœ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์—ด๋ ค์žˆ๋Š” API์ง€๋งŒ, API๋งˆ๋‹ค ์ •ํ•ด์ง„ ์ด์šฉ ์ˆ˜์น™์ด ์žˆ๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ œํ•œ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

โžฐ ex ) Open Weather Map ์—์„œ ์ œํ•œ์ ์ด๋‚˜๋งˆ ๋ฌด๋ฃŒ๋กœ ๋‚ ์”จ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. -> ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•ํƒœ๋กœ ์‘๋‹ตํ•œ๋‹ค.

 

๐Ÿ“ฃ  API Key

โœ”๏ธ API๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” API Key๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

โžฐ ์„œ๋ฒ„์˜ ๋ฌธ์„ ์—ฌ๋Š” ์—ด์‡ ๋กœ, ์„œ๋ฒ„ ์šด์šฉ์—๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž…์žฅ์—์„œ ๋ˆ„๊ตฌ๋‚˜์—๊ฒŒ ์•„๋ฌด๋Ÿฐ ์กฐ๊ฑด ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์˜๋ฌด๋Š” ์—†๋‹ค.

โžฐ API Key๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋กœ๊ทธ์ธํ•œ ์ด์šฉ์ž์—๊ฒŒ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ API Key์˜ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ API Key๋ฅผ ๊ฐ™์ด ์ „๋‹ฌํ•ด์•ผ ์›ํ•˜๋Š” ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.