[Spring boot] ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ HTTP API ๊ตฌํ˜„

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ IntelliJ IDEA๋ฅผ ์ด์šฉํ•˜์—ฌ Spring boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ธฐ์กด์˜ Spring์— ๋น„ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์ ˆ์ฐจ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ , ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •๋„ ๊นŒ๋‹ค๋กญ์ง€ ์•Š์€ ๋ชจ์Šต์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๊ทธ์— ์ด์–ด์„œ ๊ฐ„๋‹จํ•œ HTTP API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Hello World

๊ฐ€์žฅ ๋จผ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ข‹๊ฒ ์ฃ ? REST API์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋ฐ›์ง€ ์•Š๊ณ , ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฉ”์†Œ๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” GET ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด Hello World๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

package xyz.neonkid.blogexample

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

/**
 * Created by Neon K.I.D on 4/21/20
 * Blog : https://blog.neonkid.xyz
 * Github : https://github.com/NEONKID
 */
@RestController
class MainController {
    @GetMapping
    fun HelloWorld() = "Hello World"
}

MainController๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ,  ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค, Shift + F10 ๋‹จ์ถ•ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ ์ค‘์ธ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ๋ฅผ ์กฐ๊ธˆ ์‚ดํŽด๋ณด๋ฉด, Tomcat์ด ์ดˆ๊ธฐํ™” ๋˜์–ด, 8080 ํฌํŠธ ์ฃผ์†Œ๋กœ Tomcat ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” Tomcat์ด ๋ฐ”๋กœ Embedded Tomcat์ธ๋ฐ, ๋น„๋ก ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ WAS์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„์ ์ด ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ, ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋Š” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ .

 

Test

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

์ €๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Curl
  • Postman

curl์€ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ํ…Œ์ŠคํŠธ, ์‹ฌ๋„์žˆ๊ฒŒ๋Š” CLI ํ™˜๊ฒฝ์—์„œ ๋‚ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํžˆ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„ ํ™˜๊ฒฝ์€ GUI๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๊ณ , CLI๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žฆ๊ธฐ ๋–„๋ฌธ์— ์˜คํžˆ๋ ค ์ด ๋„๊ตฌ์— ์ต์ˆ™ํ•ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” Postman์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Postman์„ ์‹คํ–‰ํ•˜๋ฉด, ์ œ๋ชฉ ์—†๋Š” ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ URL๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ๋“ฑ์„ ์ž…๋ ฅํ•˜๊ณ  Send ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น URL๋กœ Postman์ด ์ ‘์†์„ ์‹œ๋„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Hello World๋ฅผ ํ•œ ๋ฒˆ ํ…Œ์ŠคํŠธํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” GetMapping์œผ๋กœ ๋ฉ”์ธ ์—”๋“œ ํฌ์ธํŠธ์— Hello World๋ฅผ ์ฐ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— http://localhost:8080 ์ฃผ์†Œ๋งŒ ๋ฐ”๋กœ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์ •์ƒ์ ์œผ๋กœ Hello World ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Code Analysis

package xyz.neonkid.blogexample

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

/**
 * Created by Neon K.I.D on 4/21/20
 * Blog : https://blog.neonkid.xyz
 * Github : https://github.com/NEONKID
 */
@RestController
class MainController {
    @GetMapping
    fun HelloWorld() = "Hello World"
}

์ž ๊น ์—ฌ๊ธฐ์„œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

  • RestController: ๊ธฐ์กด์˜ @Controller, @ResponseBody๋ฅผ ํ•ฉ์ณ๋†“์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. 
  • GetMapping: GET ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ฐ›๋Š” ๋งคํ•‘ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, value ๊ฐ’์„ ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์—ฌ๊ธฐ์„œ RestController๋Š” ์•„๋งˆ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์–ด๋…ธํ…Œ์ด์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ResponseBody๋ฅผ ํ•ฉ์ณ๋†“์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ Controller๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์ฒ˜๋Ÿผ ์ˆ˜๋™์œผ๋กœ ResponseBody๋ฅผ ์ •ํ•˜์ง€ ์•Š๊ณ , ๋ฐ˜ํ™˜ ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ํŽธํ•ฉ๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • PostMapping: POST ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ฐ›๋Š” ๋งคํ•‘ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, param, produce, consume ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
  • PutMapping: PUT ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ฐ›๋Š” ๋งคํ•‘ ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • RequestMapping: ์œ„์˜ Mapping ๋ฐฉ์‹์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์˜ ์˜ค๋ฆฌ์ง€๋‚  ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • PathVariable: URI์— ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • RequestBody: ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Body ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments