๐Ÿ’ก 4์›” 3์งธ์ฃผ Weekly paper_REST API

yeonjeongยท2025๋…„ 4์›” 7์ผ

๐Ÿ’กREST

1. ์˜๋ฏธ

  • REspresentational Status Transfer
  • ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธ
  • HTTp URI๋ฅผ ํ†ตํ•ด์„œ ์ž์›(Resource)๋ฅผ ๋ช…์‹œํ•˜๊ณ , HTTP Method๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ

2. ๊ตฌ์„ฑ์š”์†Œ

1) Resource

: ์„œ๋ฒ„๋Š” Uniqueํ•œ ID๋ฅผ ๊ฐ€์ง€๋Š” Resource๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋Ÿฌํ•œ Resource์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ด๋Ÿฌํ•œ Resource๋Š” URL์— ํ•ด๋‹นํ•œ๋‹ค.

2) ํ–‰์œ„(Verb)

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ Method๋ฅผ ์‚ฌ์šฉ
  • HTTP ํ”„๋กœํ† ์ฝœ์€ GET/POST/PUT/DELETE์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต

    3) ํ‘œํ˜„(Representation of Resource)

    : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ˜•ํƒœ๋กœ json, xml, text, rss ๋“ฑ์ด ์žˆ๋‹ค. ์ตœ๊ทผ์—๋Š” Key, Value๋ฅผ ํ™œ์šฉํ•˜๋Š” json์„ ์ฃผ๋กœ ์‚ฌ์šฉ

3. ํŠน์ง•

1) Server-Client(์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ)

  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž์›์ด ์žˆ๋Š” ์„œ๋ฒ„์— ์ž์›์„ ์š”์ฒญํ•˜๋Š” ๊ตฌ์กฐ

  • REST Server: API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ

  • Client : ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ context(์„ธ์…˜, ๋กœ๊ทธ์ธ ์ •๋ณด) ๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌ

    2) Stateless(๋ฌด์ƒํƒœ)

  • HTTP ํ”„๋กœํ† ์ฝœ์€ Stateless Protocol์ด๋ฏ€๋กœ REST ์—ญ์‹œ ๋ฌด์ƒํƒœ์„ฑ์„ ๊ฐ–์Œ

  • Client์˜ context๋ฅผ Server์— ์ €์žฅํ•˜์ง€ ์•Š์Œ -> ์„ธ์…˜/์ฟ ํ‚ค์™€ ๊ฐ™์€ context ์ •๋ณด๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์„œ ๊ตฌํ˜„์ด ๋‹จ์ˆœ

  • Server๋Š” ๊ฐ๊ฐ์˜ ์š”์ฒญ์„ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ฒ˜๋ฆฌ -> ์ด์ „์˜ ์š”์ฒญ์ด ๋‹ค์Œ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ์— ์—ฐ๊ด€๋˜์–ด์„œ๋Š” ์•ˆ๋จ

  • Server์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ์ผ๊ด€์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ  ๋ถ€๋‹ด์ด ์ค„์–ด๋“ค๋ฉฐ, ์„œ๋น„์Šค์˜ ์ž์œ ๋„๊ฐ€ ๋†’์•„์ง

    3) Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ)

  • ์›น ํ‘œ์ค€ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ ์šฉ ๊ฐ€๋Šฅ

  • Last-Modified ํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•˜๋ฉด ์บ์‹ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  • ์บ์‹œ ์‚ฌ์šฉ์„ ํ†ตํ•ด ์‘๋‹ต์‹œ๊ฐ„์ด ๋นจ๋ผ์ง€๊ณ  REST Server ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์‘๋‹ต์‹œ๊ฐ„, ์„ฑ๋Šฅ, ์„œ๋ฒ„์˜ ์ž์› ์ด์šฉ๋ฅ  ํ–ฅ์ƒ ๊ฐ€๋Šฅ

    4) Layeres System(๊ณ„์ธตํ™”)

  • Cilent ๋Š” RESt Server๋งŒ ํ˜ธ์ถœ -> REST Server๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

  • API Server๋Š” ์ˆœ์ˆ˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ์•ž๋‹จ์— ๋ณด์•ˆ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™”, ์‚ฌ์šฉ์ž ์ธ์ฆ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ ๋ถ€์—ฌ + ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, ๊ณต์œ  ์บ์‹œ๋“ฑ์„ ํ†ตํ•ด์„œ ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ์„ ํ–ฅ์ƒ ๊ฐ€๋Šฅ

  • RROXY, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„ ๋งค์ฒด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ : ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์—…๋ฌด ํ˜น์€ ์š”์ฒญ(Load)๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋กœ ๋‚˜๋ˆ„์–ด (Balancing) ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • PROXY('๋Œ€์‹ '์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง): ์ค‘๊ณ„ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ -> ๋ณด์•ˆ ์ƒ์˜ ๋ฌธ์ œ๋กœ ์ง์ ‘ ํ†ต์‹  ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์ค‘๊ณ„ํ•ด์ฃผ๋Š” ์„œ๋ฒ„๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ผ๊ณ  ๋ถ€๋ฆ„
    • ๊ฒŒ์ดํŠธ์›จ์ด : ํ•œ ๋„คํŠธ์›Œํฌ(segment)์—์„œ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ์ง€์ . ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•จ

    5) Code-On-Demand(optional)

  • Server๋กœ๋ถ€ํ„ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ›์•„์„œ Cilent ์—์„œ ์‹คํ–‰

    6) Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)

  • URI๋กœ ์ง€์ •ํ•œ Resource์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰

  • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ํŠน์ • ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š์Œ

4. ์„ค๊ณ„ ๊ทœ์น™

1) URI๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ
2) ์Šฌ๋ž˜์‹œ(/)๋กœ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„
3) URI์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ๋ถ™์ด์ง€ ์•Š์Œ
4) URI๋Š” ์†Œ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ
5) ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉ
6) ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋กœ URI๋ฅผ ์ •์˜ํ•˜๋ฉด ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ ์ž˜๋ชป ์ ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง

RESTful

  • REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด
  • ์ดํ•ด์™€ ์‚ฌ์šฉ์ด ์‰ฌ์šด REST API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ

๐Ÿ’ก๋ฌด์ƒํƒœ์„ฑ(Stateless)

: ์„œ๋ฒ„์™€ ํด๋ผ์–ธํŠธ ๊ฐ„์˜ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ
-> ๊ฐ ์š”์ฒญ์€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„ ์ด์ „ ์š”์ฒญ์˜ ์ƒํƒœ์— ์˜์กด โŒ

์‚ฌ์šฉ์˜ ํ•„์š”์„ฑ

1) ์„œ๋ฒ„์˜ ํ™•์žฅ์„ฑ์„ ๋†’์ž„

์„œ๋ฒ„๋Š” ๊ฐ ์š”์ฒญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

2) ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹จ์ˆœํ™”

ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผํ•˜๋ฉฐ, ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ

3) ์„œ๋ฒ„์˜ ๋ณต์žก์„ฑ ์™„ํ™”

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”์„ฑ ์—†์–ด์ง

4) ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅ

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์ด ๋…๋ฆฝ์ 

์œ ์ง€ ๋ฐฉ๋ฒ•

1) ๊ฐ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด ํฌํ•จ

ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จ

2) ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ

์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ ์š”์ฒญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ

3) ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹  ๋‹จ์ˆœํ™”

ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผํ•˜๋ฉฐ, ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ

๐Ÿ’ก CORS

  • ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (Cross-Origin Resource Sharing)
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž์‹ ์˜ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ด๋–ค ์ถœ์ฒ˜(๋„๋ฉ”์ธ, ์Šคํ‚ด ํ˜น์€ ํฌํŠธ)๋กœ๋ถ€ํ„ฐ ์ž์›์„ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋„๋ก ์„œ๋ฒ„๊ฐ€ ํ—ˆ๊ฐ€ํ•ด์ฃผ๋Š” HTTP ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜
    - ๋„๋ฉ”์ธ(Hostname): naver.com
    - ์ถœ์ฒ˜(Origin): https://www.naver.com

    Example.
    https://domain-a.com ์—์„œ ์ œ๊ณต๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œJavaScript ์ฝ”๋“œ๊ฐ€ fetch()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ http://domain-b.com/data.json์— ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ

CORS ์—๋Ÿฌ ๋Œ€์‘

1. ์„œ๋ฒ„์—์„œ Access-Control-Allow-Origin ํ—ค๋” ์„ค์ • -> ์ˆ˜๋ฝํ•  ์ถœ์ฒ˜ ๋ช…์‹œ์  ์ง€์ • ๊ฐ€๋Šฅ

'Access-Control-Allow-Origin': <origin> | * // ์ถœ์ฒ˜์ƒ๊ด€ ์—†์ด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ฐ€๋Šฅ
'Access-Control-Allow-Origin': <origin> | https://naver.com // ๋„ค์ด๋ฒ„๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

2. ํ”„๋ฝ์‹œ ์„œ๋ฒ„ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•œ ์ถœ์ฒ˜์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์„œ CORS ์—๋Ÿฌ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

์ถœ์ฒ˜
https://velog.io/@gomuzom/RESTful-Api
https://f-lab.kr/insight/understanding-restful-api-20240617
https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/CORS
https://docs.tosspayments.com/resources/glossary/cors#%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-access-control-allow-origin-%EC%9D%91%EB%8B%B5-%ED%97%A4%EB%8D%94-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0

profile
Backend ๊ฐœ๋ฐœ์ž๋กœ ๊ฑฐ๋“ญ๋‚˜๋Š” ๊ทธ ๋‚ ๊นŒ์ง€ !

0๊ฐœ์˜ ๋Œ“๊ธ€