Programming

REST API, RESTful ์ •์˜

appendonly 2024. 2. 5.

 

[์ฐธ์กฐ ๋ฌธํ—Œ]

https://mannhowie.com/rest-api

https://medium.com/

 

๐Ÿ’ก๊ฐœ์š”

REST๋Š” Representational State Transfer, API๋Š” Application Programming Interface์˜ ์•ฝ์–ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์›น์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ํ†ต์‹  ๋ฐ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.

 

REST API๋Š” ์›น ์„œ๋น„์Šค๋“ค์ด ์–ด๋–ป๊ฒŒ ํ†ต์‹ ํ•ด์•ผ ํ• ์ง€๋ฅผ ์ •์˜ํ•œ ์„ค๊ณ„ ๊ทœ์น™์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์—”๋“œํฌ์ธํŠธ, ๋ฆฌ์†Œ์Šค, HTTP ๋ฉ”์†Œ๋“œ, ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ˜•์‹๊ณผ ์ƒํƒœ ์ฝ”๋“œ ๋“ฑ์˜ ์ •๋ณด๋“ค์„ ์ด์šฉํ•œ๋‹ค. ์ž์›์„ JSON, XML ๋“ฑ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Representational์ด๋ผ๋Š” ์ˆ˜์‹์–ด๊ฐ€ ๋ถ™๋Š”๋‹ค.

 

API๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์ • ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•œ๋‹ค.

 

REST API๋Š” ํ™•์žฅ์„ฑ ๋ฐ ์œ ์—ฐ์„ฑ์„ ์ง€๋‹Œ ์›น ์„œ๋น„์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™๋“ค์„ ์ •์˜ํ•œ ์„ค๊ณ„ ๋ฐฉ์‹(architectural style)์ด๋‹ค.

 

RESTful ์›น ์„œ๋น„์Šค๋Š” HTTP ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜์œผ๋กœ, HTTP ๋ฉ”์†Œ๋“œ๋“ค๋กœ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ CRUD ์—ฐ์‚ฐ๋“ค์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๐Ÿ’กREST ํŠน์ง•

 

 

 

REST์˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋ฌด์ƒํƒœ(Stateless): ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ ์€ ๋ฌด์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์š”์ฒญ๋งˆ๋‹ค ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ๋˜ํ•œ, ์„œ๋ฒ„๋Š” ์š”์ฒญ ๊ฐ„ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. Client-Server: ์ด ๋‘˜์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์ž˜ ์„ค๊ณ„๋œ API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค.

3. Cacheability: ์„œ๋ฒ„์˜ ์‘๋‹ต์€ ์บ์‹ฑ ๊ฐ€๋Šฅํ•ด์•ผ ๋™์ผ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ด์ „ ์‘๋‹ต์„ ์žฌํ™œ์šฉํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ธ๋‹ค.

4. ๊ณ„์ธตํ™”๋œ ์‹œ์Šคํ…œ: REST๋Š” ๊ณ„์ธตํ™”๋œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ํ†ต์‹  ์ค‘๊ฐ„ ๋งค๊ฐœ์ฒด๋กœ ํ”„๋ก์‹œ๋‚˜ ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ, ๋ณด์•ˆ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

5. ์ผ๊ด€๋œ(Uniform) ์ธํ„ฐํŽ˜์ด์Šค: ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, URI๋กœ ์‹๋ณ„๋ผ์•ผ ํ•œ๋‹ค. HTTP ๋ฉ”์†Œ๋“œ๋กœ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ CRUD ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์€ JSON์ด๋‚˜ XML ๊ฐ™์€ ์ผ๊ด€๋œ ํ˜•์‹์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

 

๐Ÿ’กRESTful API๋ž€

API๊ฐ€ RESTfulํ•˜๋ ค๋ฉด, HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์šฉ๋„์— ๋งž๊ฒŒ, URI๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ช…์‹œํ•˜๋ฉฐ, ์ฝ˜ํ…์ธ  ํ˜‘์ƒ์„ ์ง€์›ํ•˜๊ณ , ์ ์ ˆํ•œ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

API๊ฐ€ RESTFULํ•˜๋ฉด, API๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ์ง๊ด€์ ์ด๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

 

๊ฐœ๋ฐœํ•œ API๋Š” ๋ฒ„์ „๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ชจ๋‘ ์ง€์› ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ˆ์ „ API๋กœ ์š”์ฒญํ•ด๋„ ์ œ๊ธฐ๋Šฅ์„ ํ•ด์•ผ ํ•œ๋‹ค. ๋ณดํ†ต, URI ์ƒ์— "api/v1/users"์ฒ˜๋Ÿผ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์„œ ๊ตฌ๋ถ„ํ•œ๋‹ค.

 

API๋ฅผ ๋ฌธ์„œํ™”ํ•ด์•ผ ๊ฐœ๋ฐœ์ž๋“ค์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค. API ์—”๋“œํฌ์ธํŠธ, ํŒŒ๋ผ๋ฏธํ„ฐ, ์‘๋‹ต ํ˜•์‹ ๋“ฑ์ด ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. Swagger ๋“ฑ์˜ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋ฌธ์„œํ™”๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’กREST API ๋ณด์•ˆ

 

 

REST API๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณด์•ˆ์ ์ธ ์ธก๋ฉด๋„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. REST API์˜ ๋ณด์•ˆ์€ ๋‹ค์Œ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Authentication(์ธ์ฆ)

REST API๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์ „, ์‚ฌ์šฉ์ž์˜ credentials(username๊ณผ password)๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. OAuth2, JWT๋‚˜ Basic Authentication์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Authorization

๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์—ญํ• ๊ณผ ๊ถŒํ•œ์„ ํ†ตํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. RBAC๋‚˜ ABAC๋ฅผ ํ†ตํ•ด API๋กœ ์„ธ๋ฐ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Encryption

REST API ๋ณด์•ˆ์˜ ํ•ต์‹ฌ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋น„์ธ๊ฐ€ ์ ‘๊ทผ์„ ๋ง‰๋Š”๋‹ค. HTTPS ํ”„๋กœํ† ์ฝœ๋กœ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ๋ฐ ์—”๋“œํฌ์ธํŠธ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’กREST API ์‚ฌ๋ก€

๋Œ€ํ‘œ์ ์ธ REST API์ธ Twitter REST API๋กœ tweets, users, direct messages ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ์จ, ๊ฐœ๋ฐœ์ž๋“ค์€ Twitter์˜ ๋Œ€๊ทœ๋ชจ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‘๋‹ต๊ณผ ์š”์ฒญ์€ json ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค.

 

๐Ÿ’ก์ข‹์€ REST API๋ž€

์ข‹์€ REST API๋Š” ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด์•ผ ํ•œ๋‹ค.

1. ์ง๊ด€์ ์ธ URL, ๋ฆฌ์†Œ์Šค, ๋ฉ”์†Œ๋“œ์˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

2. HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

3. ์บ์‹ฑ ๊ธฐ๋ฒ• ํ™œ์šฉ - ์บ์‹ฑ์„ ํ†ตํ•ด ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ , ์‘๋‹ต ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ETag๋‚˜ Last-Modified์™€ ๊ฐ™์€ HTTP ํ—ค๋”๋“ค๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

4. ์š”์ฒญ, ์‘๋‹ต ๋“ฑ์˜ ๋ช…ํ™•ํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์‹œ

5. Versioning์„ ํ†ตํ•œ API ์œ ์ง€๋ณด์ˆ˜

6. ์•”ํ˜ธํ™” ๋ฐ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉํ•œ ์ธ์ฆ ๋ฐ ์ธ๊ฐ€

7. ์—๋Ÿฌ ํ•ธ๋“ค๋ง์œผ๋กœ, ์„œ๋ฒ„ ๊ณ ์žฅ์„ ๋ง‰๊ณ  ์—๋Ÿฌ ์›์ธ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ๋กœ๊น… ๋ฐ ๋ถ„์„

 

๐Ÿ’ก๊ฒฐ๋ก 

์ •๋ฆฌํ•˜๋ฉด, REST API์˜ ํ•ต์‹ฌ ์š”์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์›น ์„œ๋น„์Šค๋“ค์ด ์–ด๋–ป๊ฒŒ ํ†ต์‹ ํ• ์ง€๋ฅผ ์ •์˜ํ•œ ์„ค๊ณ„ ๊ทœ์น™์˜ ๋ชจ์Œ
  • ๋ฌด์ƒํƒœ์„ฑ, ๋‹จ์ผํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค, URI๋ฅผ ํ†ตํ•œ ๋ฆฌ์†Œ์Šค ์‹๋ณ„
  • HTTP ๋ฉ”์†Œ๋“œ๋กœ CRUD ์—ฐ์‚ฐ ์ˆ˜ํ–‰
  • ์—”๋“œํฌ์ธํŠธ, ๋ฆฌ์†Œ์Šค, ๋ฉ”์†Œ๋“œ, ์‘๋‹ต ๋ฐ ์š”์ฒญ ํ˜•์‹๊ณผ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ HTTP ๋ฉ”์„ธ์ง€
  • ์ธ์ฆ, ์ธ๊ฐ€, ์•”ํ˜ธํ™” ๋ฐ API Key๋ฅผ ํ†ตํ•œ REST API ๋ณด์•ˆ ์„ค์ •

 

๋Œ“๊ธ€