[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 ํํ๋ก ๋ช ์ํ ๋ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.