[๋„์ „ ๊ธฐ์ˆ !] REST API

2021. 8. 26. 08:00ใ†์ด๋ก  ์ •๋ฆฌ/Web

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘ ์ž…๋‹ˆ๋‹ค.

๋ณธ ๋‚ด์šฉ์€ ์ฃผ๋‹ˆํ•˜๋ž‘์ด Web ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๋„์ „ํ–ˆ๋˜ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋Š” ๊ณณ ์ž…๋‹ˆ๋‹ค!

์ด ๊ธ€์€ ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ ํ–ˆ๋˜ Back End ๊ฟˆ๋‚˜๋ฌด Crew๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒƒ์ด์—์š”.

์ฃผ๋‹ˆํ•˜๋ž‘๋„ Back End ๊ฐœ๋ฐœ์„ ๋งก์•˜์—ˆ๋‹ต๋‹ˆ๋‹ค!

์ด๋ฒˆ ์šฐ๋„๋… (์šฐ๋ฆฌ๋„ ๋…์„œ!) ํ”„๋กœ์ ํŠธ์—์„œ๋Š” RESTfulํ•œ API๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋Ÿฐ API๋กœ ๊ดœ์ฐฎ์€๊ฐ€

( https://www.youtube.com/watch?v=RP_f5dMoHFc )๋ผ๋Š” ์„ธ๋ฏธ๋‚˜ ์˜์ƒ์„ ๋ณด๋ฉฐ REST์˜ ์ถœํ˜„ ๊ณ„๊ธฐ์™€ REST์—์„œ ์ •์˜ํ•œ ์ œ์•ฝ ์กฐ๊ฑด๋“ค์„ ์•Œ์•„๋ณด์•˜๊ณ , ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ผœ API๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

 

๐Ÿ“ RESTfulํ•œ API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ ์ž ํ•œ ์ด์œ  ?

๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ธ REST๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์Šคํƒ€์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Client-Serve
  2. Stateless
  3. Cache
  4. Uniform Interface
  5. Layered System
  6. Code-on-Demand (optional)

HTTP ํ”„๋กœํ† ์ฝœ๋งŒ ์ž˜ ๋”ฐ๋ผ๋„ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์Šคํƒ€์ผ๋“ค์„ ๋‹ค ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, Uniform Interface์€ ๋Œ€๋ถ€๋ถ„ ์ž˜ ์ง€์ผœ์ง€์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ ์ด ์Šคํƒ€์ผ์ด ์ง€์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด RESTfulํ•œ API๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. REST๊ฐ€ ๋ชฉ์ ํ•˜๋Š” ๋ฐ”๋Š” ๋…๋ฆฝ์ ์ธ ์ง„ํ™” *์ด๊ณ , ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Unifrom Interface๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ์  ์ง„ํ™” * - ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ง„ํ™”ํ•œ๋‹ค. - ์„œ๋ฒ„์˜ ๊ธฐ๋Šฅ์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ REST API๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ๋“ค์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ž˜ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Uniform Interface ์ค‘์—์„œ๋„ ๋Œ€๋ถ€๋ถ„ ์ž˜ ์ง€์ผœ์ง€์ง€ ์•Š๊ณ  ์žˆ๋Š” ์ œ์•ฝ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜์ธ Hypermedia as the engine of application state(HATEOAS)์„ ์ง€์ผœ REST API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ’ช๐ŸปRESTfulํ•œ API ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๋…ธ๋ ฅ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋Š” Hyperlink๋ฅผ ์ด์šฉํ•ด ์ „์ด๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด HATEOAS ์ œ์•ฝ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. Hyperlink์— ์ž์›์˜ ์œ„์น˜(reference)์™€ ์ž์›์˜ ๊ด€๊ณ„(relation)๋ฅผ ๋ช…์‹œํ•ด์คŒ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณ„๋„์˜ ์‚ฌ์ „ ์ •๋ณด ์—†์ด๋„ ์ด ๋งํฌ๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅธ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋…๋ฆฝ์  ์ง„ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด Spring HATEOAS๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Spring HATEOAS์—์„œ๋Š” Link๋ผ๋Š” ํด๋ž˜์Šค๋กœ ๋‹ค๋ฅธ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ ํ•˜์ดํผ๋ฏธ๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž์›์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด RepresentationModel ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” EntityModel ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RepresentationModel ํด๋ž˜์Šค๋Š” Link ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ  EntityModel ํด๋ž˜์Šค์—์„œ๋Š” ํ•ด๋‹น ๋งํฌ๋ฅผ ๊ฐ€์ง„ ์ž์› ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”๋ฐ Spring HATEOAS์—์„œ๋Š” ์ด EntityModel์„ ์ด์šฉํ•˜์—ฌ ์‘๋‹ต์— ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์บก์Šํ™”ํ•˜๊ณ  ๋งํฌ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ˜„์žฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์„ ๋ช…์‹œํ•˜๋Š” RESTful ํ•œ ์‘๋‹ต์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ EntityModel์„ ์ด์šฉํ•˜์—ฌ ์‘๋‹ต์— ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์บก์Šํ™”ํ•˜๋Š” ๊ณผ์ •์„ ๋งค๋ฒˆ ์ผ์ผ์ด ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ์š”?

์ด๋ ‡๊ฒŒ ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ์ด๋ฅผ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋กœ ๋นผ๋‚ด๋Š” ๊ฒƒ๋„ ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ Spring HATEOAS์—์„œ ์ œ๊ณตํ•˜๋Š” RepressentationModelAssembler ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” toModel, toCollectionModel ๋ฉ”์„œ๋“œ๋งŒ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ์ฒด๋ฅผ RepresentationModel๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์ด๊ณ , ์•ž์„œ ์‚ฌ์šฉํ–ˆ๋˜ EntityModel์ด ์ด RepresentationModel์„ ์ƒ์†๋ฐ›๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

๐Ÿ‘๐Ÿป ๊ฒฐ๋ก 

REST API์— ๋Œ€ํ•ด์„œ ๋งŽ์ด ๋“ค์–ด๋ณด๊ธด ํ–ˆ์ง€๋งŒ ์ •์ž‘ REST API๊ฐ€ ๋ฌด์—‡์ธ์ง€, RESTfulํ•˜๊ฒŒ API๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด ๋ญ๊ฐ€ ์ข‹์€์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅด๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— REST์˜ ์ถœํ˜„ ๊ณ„๊ธฐ์™€ ๋ช‡๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด๋“ค์„ ๊ณต๋ถ€ํ•ด๋ณด๋ฉด์„œ ๊ทธ๋ƒฅ API๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ง€์ผœ์•ผ ํ•  ๊ฒƒ๋„ ๋งŽ๊ณ , ์กฐ๊ธˆ์€ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋Š๊ปด์ง์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  REST API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์ด์œ ๋ฅผ ์กฐ๊ธˆ์€ ์ง์ž‘ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ REST๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์˜ ์žฅ๋‹จ์ ์„ ์ž˜ ๊ณ ๋ คํ•˜์—ฌ REST๋ฅผ ๋”ฐ๋ฅผ ๊ฒƒ์ธ์ง€๋Š” ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์„œ๋น„์Šค์˜ ๋ชฉ์ ์— ๋งž์ถฐ ํŒ๋‹จํ•˜์—ฌ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

 


 

์ฃผ๋‹ˆํ•˜๋ž‘์˜ ๊ธ€์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”? ๊ตฌ๋…๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋Œ“๊ธ€์€ ์ฃผ๋‹ˆํ•˜๋ž‘์—๊ฒŒ ๋งŽ์€ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค

728x90
๋ฐ˜์‘ํ˜•

'์ด๋ก  ์ •๋ฆฌ > Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Web] URL์˜ ์ดํ•ด  (0) 2022.04.05