๋ชฉ์ฐจ

REST๋? ๐
REST๋ "Representational State Transfer"์ ์ฝ์์ด๊ณ ์ง์ญํ๋ฉด ๋ํ์ํ ์ ์ก์ด๋ค.
ํ๋์ URI๋ ๊ณ ์ ํ ๋ฆฌ์์ค๋ฅผ ๋ํํ๋๋ก ์ค๊ณ๋๋ค๋ ๊ฐ๋ ์ธ๋ฐ ์์งํ ์์ง ์ ํํ ์ดํดํ์ง๋ ๋ชปํ๋ค.
์น์ ๋ชจ๋ ๋ฆฌ์์ค์ ๊ณ ์ ํ URI๋ก ์๋ฏธ๋ถ์ฌ ํ ๋ค HTTP Method๋ฅผ ํตํด ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํต์ ํ๋ ๋ฐฉ์์ด๋ผ๊ณ ์ดํด ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํํ๋ ๊ฐ์ด ์์ํ ๋ฐ์ดํฐ๋ผ๋ ์
ํด๋ผ์ด์ธํธ๊ฐ URI๋ง ๋ด๋ ์ด๊ฒ ๋ฌด์จ ์์ ์ ์๋ฏธํ๋์ง ์ ์ ์๋๋ก ์ค๊ณํด์ผ ํ๋ค.
ex)localhost:8080/user๊ฐ URI์ด๊ณ POST์ผ๋ก ์๋ฒ์ ์ ์กํ๋ค๊ณ ํ๋ฉด ์ฌ์ฉ์ ๋ฑ๋ก์ด๋ผ๊ณ ์ ์ถํ ์ ์๋ค.
REST ๋ฐฉ์์์๋ HTTP Method๊ฐ CRUD๋ฅผ ์๋ฏธํ๋ค. ๊ทธ๋์ ์ URI์์ ๊ตณ์ด /user ๋ค์ insert ์ด๋ฐ ์ฃผ์๋ฅผ ๋ ๋ถ์ผ ํ์๊ฐ ์๋ค.
C(create): POST
R(Read): GET
U(Update): Put
D(Delete): Delete
๋ ๋ฐฑ์๋ ํ๋ก ํธ์๋๊ฐ ๊ตฌ๋ถ๋๋ค.
์ฆ REST API ๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ ํ์๊ณผ ๊ท์น๋ง ์ ์ ํด์ ์ฝ์๋ ๋ฐ์ดํฐ๋ง ํด๋ผ์ด์ธํธ๋ก ๋ฐํํด์ฃผ๋ฉด ๋๋ค.
์ด์ ์คํ๋ง์์ REST API ๊ฐ๋ฐํ๋ ๊ฒ ๊ด๋ จํด์ ์ ๋ฆฌํ๋ค. ์๊ฐ ์ ๋๋ฌด ๊น๊ฒ ์ ๋ฆฌ๋ ๋ชปํ๋ค.
๊ณต๋ถํ ๊ฒ ๋๋ฌด ๋ง๋คใ ใ
@RestController ๐
๊ฐ๋จํ ์ ๋ฆฌํ๋ค.
@Controller์ @ResponseBody๋ฅผ ํฉ์น ์ด๋ ธํ ์ด์ ์ ์๋ฏธํ๋ค.
์ฆ @RestController ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์์ํ ๋ฐ์ดํฐ๋ง ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ค.
REST ๋ฐฉ์์์ ํด๋ผ์ด์ธํธ๋ HTTP BODY์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์(์ฃผ๋ก JSON ํฌ๋งท) ์๋ฒ๋ก ๋ณด๋ด๊ณ
์๋ฒ์์๋ ์ด๋ฅผ JAVA๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํด์(๋ด๋ถ์ ์ผ๋ก HttpMessageConverter๊ฐ ์ฒ๋ฆฌ) ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ ์ด @RequestBody์(ํด๋ผ์ด์ธํธ์์ JSONํ์์ผ๋ก ๋ณด๋ด๋ฉด ์๋ฒ์์๋ ๋ฐ๋์ ์ด๋ ๊ฒ ๋ฐ์์ผ ํจ, ์๋๋ฉด ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ์๋จ)
์ฝ์ง์ ์ข ํ๋ ์ด์ ๊ฐ ์ปจํธ๋กค๋ฌ์์ @ModelAttribute MemberVO memberVO๋ก ๋ฐ๊ณ ํด๋ผ์ด์ธํธ์์๋ JSONํ์์ผ๋ก ๋ณด๋๋๋ parameter๊ฐ์ด null๋ก ์ธํ ์ด ๋์์๋ค.
๋ ์ฐพ์๋ณด๋ @ModelAttribute๋ฅผ ํตํด HTTP BODY๊ฐ์ ๋ฐ์ผ๋ ค๋ฉด Content-Type์ application/json์ด ์๋ multipart/form-dataํํ๋ก ์ ์กํด์ผ๋ง ํ๋ค๊ณ ํ๋ค.
ํด๋ผ์ด์ธํธ์์ JSON์ผ๋ก ๋ณด๋ด๋ ๊ฑด ๋ฐ๋์ @RequestBody๋ก ๋ฐ์์ผ ๋๋ค.(์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด ํ์์ ๋ง์ถฐ์ค์ผ ํ๋ค.)
๊ทธ๋ฆฌ๊ณ ๋ณด๋ผ ๋๋ @ResponseBody๋ก ๋ณด๋ด์ผ ๋๋ค.
์๋ฒ์์ ๋น์ง๋์ค ๋ก์ง ์ํ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ๋ ์ญ์ HTTP BODY ํ์์ ๋ง์ถฐ์ ๋ฐํํด์ค์ผ ํ๋๋ฐ
์ด ๋ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์ ์ด @ResponseBody์ด๋ค.
์ฆ, @RestController๊ฐ ๋ถ์ ์ปจํธ๋กค๋ฌ๋ @ResponseBodyํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
์คํ๋ง์์ parameter๊ฐ ๋ฐ์ธ๋ฉ ๋ฐฉ๋ฒ ๐
@RequestParam
์๋ฒ์์ parameter๋ฅผ ๋ฐ์ ๋ ๊ฐ์ฒด๋ก ๋ฐ๋๊ฒ ์๋๋ผ ์ ๋ง ๋จ์ผ์ parameter๊ฐ๋ง ๋ฐ์ ๋ ์ฌ์ฉ๋จ, ๋ํ ํ์ parameter๊ฐ๋ ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ด ๋ฐ๋๋ค.(@RequestParam ์๋ต๋ ๊ฐ๋ฅํจ)
์๋ฒ์ ํด๋ผ์ด์ธํธ์ parameter 1:1๋งคํ
ex) localhost:8080/user?id=test
์์ฒ๋ผ ํด๋ผ์ด์ธํธ์์ Get๋ฐฉ์์ผ๋ก id๋ฅผ ์๋ฒ๋ก ๋๊ธธ ๋ ์๋ฒ์์๋ ์๋์ฒ๋ผ ๋ฐ์ผ๋ฉด ๋๋ค.
์๋๋ localhost:8080/test/requestParam?id=test๋ก ํธ์ถํ๋ฉด ResponseEntity๋ก status 200๊ณผ parameter๊ฐ์ผ๋ก ๋ฐ์ id๋ฅผ ๋ฐํํ๋ ์ฝ๋์ด๋ค.

์๋๋ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ ํ ๊ฒฐ๊ณผ์ด๋ค. ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก id๋ฅผ lsy๋ก ์๋ฒ๋ก ๋์ก๊ณ ์์๋๋ก ์ํ์ฝ๋๋ 200์ด ๋ฐํ๋์์ผ๋ฉฐ Response๋ฅผ ๋ณด๋ฉด requestParam : id๊ฐ ๋ด๊ฒจ์ ธ ์๋ค.
@RestContrller๋ ๋ฐํ๊ฐ์ HTTP BODY๋ก ๋ฐํํ๋๋ก ์ค๊ณ๋์ด ์๋ค.

์ด๋ ๊ฒ ๊ทธ๋ฅ ๋จ๊ฑด์ parameter๊ฐ์ ์ฃผ๊ณ ๋ฐ์ ๋๋ @RequestParam์ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ ์ฌ๋ฌ๊ฑด์ ์ฃผ๊ณ ๋ฐ์ ๋๋ ์๋์ฒ๋ผ @RequestParam์ ์ฌ๋ฌ๋ฒ ์์ฑํด์ผ ๋๋ ๋ถํธํจ์ด ๋ฐ์ํ๋ค.
์ด๋ ๊ฒ ์ฌ๋ฌ๊ฑด์ parameter๊ฐ์ ๋ฐ์ ๋๋ @RequestParam์ ์์ฑํ๋ ๊ฑด ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค.

@ModelAttribute
์์ฒ๋ผ ์ฌ๋ฌ๊ฐ์ parameter๊ฐ์ ๋ฐ์ ๋ ์ฌ์ฉ๋๋ฉฐ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ์ ๋ ์ฌ์ฉํ๋ค.(dto, vo ๋ฑ)
dto๋ vo๋ฅผ ์๋์ฒ๋ผ ์์ฑํด ๋๊ณ ์ด์ ๋ง์ถฐ์ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ ๋ ์ฌ์ฉ๋จ
๋ฐ์ดํฐ ๋ฐ๋ ๊ฐ์ฒด์ Setter๊ฐ ๋ฐ๋์ ์ค์ ๋์ด ์์ด์ผ ํจ

์๋๋ localhost:8080/model?id=id&name=name์ผ๋ก ํธ์ถํ๋ฉด MainVO์ ๋ฐํํ๋ ์ฝ๋์ด๋ค.

์๋๋ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธํ ๊ฒฐ๊ณผ์ด๋ค.
์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก id์ name์ ์๋ฒ๋ก ๋์ก๊ณ MainVO์ ๋งคํ๋์ด ๋ฐ์ดํฐ๊ฐ ์ ๋ฐํ๋์๋ค.

๋ง์ผ ์๋ฒ์ VO์ ์๋ ๊ฐ์ ์ถ๊ฐ๋ก ๋์ง๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๐
VO์๋ ํ์ฌ id์ name๋ง ๋ฐ์ ์ ์๋๋ก ๋์ด ์๋ค.
VO์ ์๋ email์ ์ถ๊ฐํด์ ์ ์กํด๋ดค๋ค. ์๋์ฒ๋ผ email๊ฐ์ ๋ฐํ๋์ง ์๋๋ค.

@RequestBody
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ ์กํ๋ ๋ฐ์ดํฐ ํ์์ด form-data๊ฐ ์๋๋ผ HTTP BODY์ JSONํ์์ผ๋ก ๋ณด๋ด๋ ๋ฐฉ์์ด๋ผ๋ฉด ๋ฐ๋์ ์๋ฒ์์๋ @RequestBody๋ก ๋ฐ์์ผ ์ ๋๋ก ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ์ด ๋๋ค.
์๋์ฝ๋๋ localhost:8080/test/json์ผ๋ก post๋ฐฉ์์ผ๋ก ํธ์ถ(JSONํ์)ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ @RestponseBodyํ์์ผ๋ก ๋ฐํํ๋ ์ฝ๋์ด๋ค.

JSON ํ ์คํธ ํ๊ธฐ ์ํด์ postman์ผ๋ก ๋ด ๋ก์ปฌํธ์คํธ๋ก ์ ์ก์ ํด์ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
์ ์์ ์ผ๋ก ๊ฐ์ด ๋ฐํ๋์๋ค.

ํด๋ผ์ด์ธํธ์์ POST๋ฐฉ์์ผ๋ก JSONํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ HTTPBODY์ ๋ด์์ ์ ์กํ๋ ์ด ๊ฒฝ์ฐ์
์๋ฒ์์ @RequestBody๊ฐ ์๋๋ผ @ModelAttribute๋ก ๋ฐ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น?

postman์์ ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด JSONํ์์ผ๋ก ๋ณด๋ธ id์name์ด ์๋ฒ์์ ๋ฐ์ธ๋ฉ์ด ์ ๋๋ก ์๋์ด null๊ฐ์ด ๋ฐํ๋์๋ค.

์๋ฒ์์ @ModelAttribute๋ก ๋ฐ๋ ๊ฒฝ์ฐ๋ ์๋์ฒ๋ผ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ์ ์กํ์์ form-data๋ก ๋ณ๊ฒฝํด์ผ ๋ฐ์ธ๋ฉ์ด ์ ๋๋ก ๋๋ค.

@PathVariable
url์ ์ผ๋ถ๋ฅผ parameter๊ฐ์ผ๋ก ๋ฐ์ ๋ ์ฌ์ฉ๋จ(์ฃผ๋ก idx์ ๊ฐ์ด ๋ณ์์ฒ๋ผ ํ์ฉ๋๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋จ)
localhost:9090/user/{idx}
์ด๋ฐ์์ผ๋ก ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ ์กํ๋ฉด ์๋ฒ์์๋ ํด๋น idx๋ฅผ ๋ณ์์ฒ๋ผ ํ์ฉํ ์ ์๋ค.
@PathVariable("idx") String idx ์ด๋ ๊ฒ ํ๊ณ @RequestMapping("/{idx}") ์ด๋ฐ์์ผ๋ก ๋ฐ์์ ์ถ์ถํ ์ ์๋ค.
์๋์ฝ๋๋ url์ idx๋ฅผ parameter๊ฐ์ผ๋ก ๋์ ธ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๋ค ๋ฐํํ๋ ์์ ์ฝ๋์ด๋ค.
localhost:8080/user/{idx}์์ idx๋ฅผ parameter๊ฐ์ผ๋ก ์ถ์ถํด์ MainService์ selectMemberByIdx์ ์ ๋ฌ

๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด ์๋์ฒ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ค.
{idx}๊ฐ์ผ๋ก 9999๋ฅผ ์ ๋ฌํ๊ณ 9999์ ํด๋น๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋์๋ค.

๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์์ฑํ๋๊ฑฐ๋ผ ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค.
ํ๋ฆฐ ๋ด์ฉ์ด ์์ ๊ฒฝ์ฐ ๋๊ธ๋ก ํผ๋๋ฐฑ ๋ถํ ๋๋ฆฝ๋๋ค. ๐

๋๊ธ