[Spring boot] REST API์˜ ๊ธฐ์ดˆ์™€ ์„ค๊ณ„

๋ฐ˜์‘ํ˜•

Spring boot๊ฐ€ ๊ธฐ์กด์˜ Spring์— ๋น„ํ•ด ๋‹ค์–‘ํ•œ ์„ค์ •๋“ค์„ ์ž๋™ํ™” ์‹œ์ผœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ์ค„์ด๊ณ , ์ž„๋ฒ ๋””๋“œ ํ†ฐ์บฃ์„ ํƒ‘์žฌํ•˜์—ฌ ๋” ์‰ฌ์šด ๊ฐœ๋ฐœ๋“ค์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Spring boot๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•ด๋ณด๋Š” ์ฒซ ๋‹จ์ถ”์ธ REST API์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

What is REST API ?

REST API๋ž€, REST(Representational State Transfer)์˜ ์•ฝ์ž๋กœ '๋Œ€ํ‘œ์ ์ธ ์ƒํƒœ ์ „๋‹ฌ'์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์›น๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ†ต์‹  ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ณธ๋ž˜ ์›น์€ ์ „์†ก ๋ฐฉ์‹์œผ๋กœ HTTP ํ”„๋กœํ† ์ฝœ์„, ์‹๋ณ„ ๋ฐฉ๋ฒ•์œผ๋กœ URI๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ํ˜ผ๋™ํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์€ URL๊ณผ URI๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. URI๋Š” ์ธํ„ฐ๋„ท์—์„œ ํŠน์ • ์ž์›์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Ÿ๊ฐ’์ด๊ณ , URL์€ ์ธํ„ฐ๋„ท์—์„œ ํŠน์ • ์ž์›์ด๋‚˜ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Ÿ๊ฐ’์ž…๋‹ˆ๋‹ค.

HTTP๋Š” ์›น์—์„œ GET, POST, PUT, DELETE ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ”„๋กœํ† ์ฝœ๋กœ REST๋Š” HTTP์™€ URI์˜ ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์žฅ์ ์„ ๊ณ„์Šนํ•œ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์–‘ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€์‘ํ•ด ๋•Œ๋กœ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ, ๋•Œ๋กœ๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST๊ฐ€ ๊ฐœ๋ฐœ๋œ ๋ชฉ์ ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ์š”์†Œ ์ƒํ˜ธ์ž‘์šฉ์˜ ๊ทœ๋ชจ ํ™•์žฅ์„ฑ
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฒ”์šฉ์„ฑ
  • ๊ตฌ์„ฑ์š”์†Œ์˜ ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ
  • ์ค‘๊ฐ„์  ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ด์šฉํ•œ ์‘๋‹ต ์ง€์—ฐ ๊ฐ์†Œ, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ์บก์Šํ™”

 

REST API ์ œ์•ฝ ์กฐ๊ฑด

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

์•„๋ž˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ž˜ ์ง€ํ‚จ API๋ฅผ RESTfulํ•œ API๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ˜•ํƒœ (Client-Server model)
  • ๋ฌด์ƒํƒœ์„ฑ (Stateless)
  • ์บ์‹œ ๊ธฐ๋Šฅ (Cacheable)
  • ๊ณ„์ธตํ™” ์‹œ์Šคํ…œ (Layered system)
  • ์ฝ”๋“œ ์˜จ ๋””๋งจ๋“œ (Code on demand)
  • ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ (Uniform interface)

ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ํ˜•ํƒœ์˜ ์›์น™์€ ๊ด€์‹ฌ์‚ฌ์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ๋ฅผ ๋งํ•˜๋ฉฐ, ์ด๋ฅผ ์ง€ํ‚ด์œผ๋กœ์จ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์„ ๋ถ„๋ช…ํžˆ ํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹จ์ˆœํ™” ๋˜๊ณ  ํ™•์žฅ์„ฑ์ด ํ–ฅ์ƒ๋˜์–ด, ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

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

์บ์‹œ ๊ธฐ๋Šฅ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์บ์‹ฑํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. HTTP์˜ ๊ธฐ๋Šฅ ์ค‘ ์บ์‹œ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณ„์ธตํ™” ์‹œ์Šคํ…œ ์›์น™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์ค‘๊ณ„ ์„œ๋ฒ„(Proxy, Gateway)๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ๊ณต์œ  ์บ์‹œ ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ํ™•์žฅ์„ฑ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜จ ๋””๋งจ๋“œ์˜ ์›์น™์€ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•  ํ•„์ˆ˜ ์›์น™์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์›์น™์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ Java Applet, Javascript ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„ ๊ธฐ๋Šฅ์„ ์ผ์‹œ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ ์›์น™์€ URI๋ฅผ ๊ฐ€๋Šฅํ•œ ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค์— ๊ท ์ผํ•˜๊ณ , ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ์›์น™์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ํ™•์žฅ์ด ์‰ฝ๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ๊ฐ Entity ๋ณ„๋กœ ์ž์›์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•, ํ˜น์€ HATEOAS๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด์•ผ๊ธฐ ํ•˜๋Š”๋ฐ, HATEOAS๋ž€, ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•˜๋Š” ํ˜•์‹์„ ๋‹จ์ˆœํžˆ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋งŒ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ URI๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค๋Š” ์›์น™์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์ค‘์—์„œ๋„ ์ œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด, ์ž๊ธฐ ์„œ์ˆ ์ ์ธ ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๊ธฐ ์„œ์ˆ ์ ์ธ ์„ค๊ณ„๋ž€, ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ ์›์น™์„ ์ค€์ˆ˜ํ•จ๊ณผ ๋™์‹œ์— ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ •๋ณด, ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ HyperLink๋กœ ๋‹ด๋Š” ๊ฒƒ๊นŒ์ง€๊ฐ€ ์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ์ข‹์€ ์„ค๊ณ„๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒ ์ฃ .

 

REST API ์„ค๊ณ„

์ž ๊ทธ๋Ÿผ ์ด์ œ ์ง์ ‘ REST API๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋ฌด์ž‘์ • REST API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ‚ค๋ณด๋“œ๋ฅผ ๋‘๋“ค๊ธฐ๊ธฐ ๋ณด๋‹จ, ๋จผ์ € ์ ์ ˆํ•œ ์„ค๊ณ„๋ฅผ ๊ฐ–์ถ˜ ํ›„์— ์ฝ”๋”ฉ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค.

REST API๋Š” HTTP์˜ ๋ฉ”์†Œ๋“œ, URI๋กœ ์ด๋ฃจ์–ด์ง„ API ์„œ๋ฒ„์ด๋ฏ€๋กœ, ํ•„์š”ํ•œ ๊ฒƒ์€ ์š”์ฒญ๊ณผ ์‘๋‹ต ์ด๋ ‡๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๊ณ , ์–ด๋– ํ•œ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(ํŒŒ๋ผ๋ฏธํ„ฐ)์™€ ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋ธ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž์›(Resource): URI
  • ํ–‰์œ„(Action): HTTP Method
  • ํ‘œํ˜„(Representations): HTTP Message Body

๋งŒ์•ฝ ๊ธฐ์กด์˜ HTTP API๋ฅผ ์„ค๊ณ„ํ•ด๋ณด์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด, ์ด๋Ÿฌํ•œ ์„ค๊ณ„ ์ž‘์—…์ด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ, ์ฒ˜์Œ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•ด๋ณด์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด, ์กฐ๊ธˆ ์ƒ์†Œํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๊ตฐ์š”. 

์˜ˆ๋ฅผ ๋“ค์–ด, ์‡ผํ•‘๋ชฐ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ํ•˜์˜€์„ ๋•Œ, ์–ด๋–ค ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ž์›์„ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด API๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://localhost:1412/api/items/1

์—ฌ๊ธฐ์„œ ๋งŒ๋“  ์œ„ ์ฃผ์†Œ๋ฅผ URI๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Œ? URL์ด๋ž‘ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ์š”? URL์€ ์–ด๋–ค ์ž์› ์˜ˆ๋ฅผ ๋“ค๋ฉด, tistory.pdf ์ฒ˜๋Ÿผ ์–ด๋–ค ํŒŒ์ผ์ด๋‚˜ ์ž์›์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋ผ๋ฉด, URI๋Š” ๋ฌธ์ž์—ด์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” HTTP์— ๋Œ€ํ•œ ํ–‰์œ„์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฏธ HTTP Method๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ URI์— ์ ๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ํ˜ผ๋™์„ ์ค„ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€์š”.

๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋‹จ์ˆ˜๋ณด๋‹ค๋Š” ๋ณต์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, API๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ์–ด๋– ํ•œ ์ž์›์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ๋ณดํ†ต DB ๋“ฑ์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๊ณ , ๊ทธ๋“ค์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปฌ๋ ‰์…˜์ด๋ผ๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์คŒ์ด ๋˜๊ณ , ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๋ฉด, ๊ทธ๋“ค ๋ฐ‘์œผ๋กœ ๋‹จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ„๋‹ค๋ฉด, ๋”์šฑ ๊น”๋”ํ•œ API๊ฐ€ ๋˜๊ฒ ์ฃ .

# ์ƒํ’ˆ์„ ๊ฐ€์ ธ์˜ค๋Š”(GET) API

GET http://localhost:1412/api/items
content-type: application/json

๊ทธ๋Ÿฌ๋‚˜ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๋ช…์‚ฌ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ…Œ๋ฉด, ์ฃผ๋ฌธ ํ˜„ํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” orders ๋“ฑ์˜ ๋ช…์‚ฌ๋Š” ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, SQL ์ฟผ๋ฆฌ๋ฌธ์—์„œ order๋Š” ์ •๋ ฌ์˜ ํ‚ค์›Œ๋“œ๋กœ์จ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ํ˜ผ๋™์„ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ SQL ์งˆ์˜๋ฌธ์— ์กด์žฌํ•˜๋Š” ํ‚ค์›Œ๋“œ ๋“ฑ์˜ ์‚ฌ์šฉ์€ ์ž์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ–‰์œ„์— ๋Œ€ํ•œ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค. REST API ์„œ๋ฒ„ ๊ฐœ๋ฐœ์‹œ์— ์ž์›์— ๋Œ€ํ•ด์„œ๋Š” ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ธ๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋™์‚ฌ๋ฅผ HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๊ณ , ๊ฐ€๋Šฅํ•œ ์—ฌ๊ธฐ์— ์žˆ๋Š” ํ–‰์œ„๋ฅผ ๊ฐ€์ง€๊ณ  API๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Resource GET(read) POST(create) PUT(update) DELETE(delete)
/items ์ƒํ’ˆ ๋ชฉ๋ก ๋ณด๊ธฐ ์ƒํ’ˆ ์ถ”๊ฐ€ - -
/items/{id} ID๊ฐ’ ์ƒํ’ˆ ๋ณด๊ธฐ - ID๊ฐ’์˜ ์ƒํ’ˆ ์ˆ˜์ • ID๊ฐ’์˜ ์ƒํ’ˆ ์‚ญ์ œ

์œ„ ์ž‘์—…์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์„ ์ด์šฉํ•ด์„œ ์ƒํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ณด๊ณ , ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ CRUD(Create, Read, Update, Delete)๋ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ CRUD๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•˜๋Š” ํ–‰์œ„๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ด๋ฅผ HTTP Method ์ฆ‰, REST API์—์„œ์˜ ํ–‰์œ„๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด, GET, POST, PUT, DELETE๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

๊ทธ๋Ÿผ ๋งŒ์•ฝ, ์ƒํ’ˆ ๋ชฉ๋ก ์ค‘, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’, ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? SQL๋กœ ๋ณด์ž๋ฉด, where, order by ๋“ฑ์˜ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด ๋˜๋Š”๋ฐ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ด ๋•Œ๋Š” JPA์—์„œ ์ œ๊ณตํ•˜๋Š” Pageable๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•์€ ์ฐจํ›„, JPA๋ฅผ ๋‹ค๋ฃจ๊ฒŒ ๋œ๋‹ค๋ฉด, ๋” ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ์ด Pageable์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์–ด๋–ค์‹์œผ๋กœ URI๊ฐ€ ๋‚˜์˜ค๋Š”์ง€๋งŒ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

# Pageable์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ

GET http://localhost:1412/api/items?page=0&size=10&sort=desc
content-type: application/json

page, size, sort ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Pageable ๊ฐ์ฒด์— ์กด์žฌํ•˜๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋“ค๋กœ, ์ด๋Ÿฌํ•œ ํ”„๋กœํผํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด, ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋ณดํ†ต ์›น ๊ฒŒ์‹œํŒ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ, ๊ฒŒ์‹œํŒ์˜ ๊ธ€์ด 100,000๊ฐœ๋ผ๋ฉด, ์ด๋Ÿฐ ๊ธฐ๋Šฅ์ด ์—†์„ ๋•Œ 100,000๊ฐœ๋ฅผ ๋ชจ๋‘ ๋ฐ›์•„, ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ฒŒ ๋˜์ฃ , ๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€๋ณ„๋กœ ์ด๋ฅผ ์ •ํ•ด์ง„ ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋„๋ก ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฅผ ๋™์ ์œผ๋กœ ๋‚˜๋ˆ„๋„๋ก ์ฒ˜๋ฆฌํ•˜๋ฉด, ๊ฒŒ์‹œ๊ธ€์„ ์ ์ ˆํ•˜๊ฒŒ ๋“ฑ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋ฉ๋‹ˆ๋‹ค.

POST ๋ฉ”์†Œ๋“œ๋Š” ์ƒˆ๋กœ์šด ์ƒํ’ˆ์„ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ƒ์„ฑํ•  ์ƒํ’ˆ์€ ์•„์ง ID ๊ฐ’ ๋“ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํ•œ items๋ผ๋Š” URI๋กœ ๋๋‚˜๋„๋ก ์„ค๊ณ„ํ•˜๊ณ , ๋Œ€์‹  POST ๋ฉ”์†Œ๋“œ๋ฅผ ์š”์ฒญํ•˜๋Š” ํ˜•ํƒœ๋กœ API๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ์ดํ›„์—๋Š” ID ๊ฐ’์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์ด๋‚˜ ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์€ ID๋ฅผ ๋ถ™์—ฌ์„œ ์„ค๊ณ„๋ฅผ ํ•˜๋ฉด ๋˜๊ฒ ์ฃ .

 

๊ธฐ์กด์˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DB๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ฅผ ์ฃผํ™ฉ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜์˜€๊ณ , ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ–ˆ์„ ๋•Œ๋ฅผ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฃผํ™ฉ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜์˜€์„ ๋•Œ๋Š” ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ์ ‘๊ทผํ–ˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๊ฐ€ ๋œ ๊ฒƒ์ด์ฃ .

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” REST API ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ๊ณต์„ ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œํ•จ์œผ๋กœ์จ, ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ํ–ฅ์ƒ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

Spring boot๋ฅผ ์ด์šฉํ•œ REST API ์„œ๋ฒ„ ๊ฐœ๋ฐœ

Spring boot๋ฅผ ์ด์šฉํ•˜์—ฌ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • MVC ํŒจํ„ด์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Spring boot data rest๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ „์—, ๋ฏธ๋ฆฌ ์ด ๋ฐฉ๋ฒ•์— ์ฐจ์ด๊ฐ€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์„ค๋ช…์„ ๋“œ๋ฆฌ์ž๋ฉด, MVC ํŒจํ„ด์€ Model View Controller๋กœ ์ด๋ฃจ์–ด์ง„ ํ˜•ํƒœ์˜ ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ REST API ์„œ๋ฒ„๋ฅผ ์„ค๊ณ„ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Spring boot๋กœ ๋ณธ๋‹ค๋ฉด, Controller, Service (DAO), Repository๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ์ดํ„ฐ์˜ ์šด๋ฐ˜ ์ฒ˜๋ฆฌ๋ฅผ ์„ธ๋ถ„ํ™” ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ๊ธฐ์กด์˜ Spring MVC์™€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜ํ™˜ ํ˜•์‹์ด ๊ธฐ์กด์˜ Spring MVC๋Š” HTML์ด์—ˆ๋‹ค๋ฉด REST API๋Š” XML์ด๋ƒ, JSON์ด๋ƒ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Spring boot data rest๋Š” Repository ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค๋ฉด DB์—์„œ CRUD๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. MVC ํŒจํ„ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ Controller, Service๊ฐ€ ์—†๊ณ , ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ๋‚ด๋ถ€์˜ CRUD ๋ฉ”์†Œ๋“œ์™€ ๋งคํ•‘ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, MVC์—์„œ๋Š” CRUD๋ฅผ ๋ชจ๋‘ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์ฃผ๊ณ , ์ด๋ฅผ Service์™€ Controller๋กœ ๋ถ™์ด๋Š” ๊ฑธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜์—ฌ, Spring boot data rest์—์„œ Controller, Service๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” MVC ํŒจํ„ด์„ ์ด์šฉํ•œ REST API ์„œ๋ฒ„ ๊ฐœ๋ฐœ๊ณผ Spring boot data rest๋ฅผ ์ด์šฉํ•œ REST API ์„œ๋ฒ„ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments