โ ๐ฅ์ ์ด๋ค ํ์์ผ๋ก URL์ ์์ฒญํ ๊ฑด์ง ์ ํ
โ ๐ฅ์ API URL์ ์์ฑํ๊ณ ๐ฆ์ Body๋ก ๋ณด๋ผ ๊ฐ์ ์์ฑํ ํ ๐ง์ ๋๋ฅธ๋ค
โฝ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ด๋ฃจ์ด์ง๋ ์์ฒญ(Request)๊ณผ ์๋ต(Response) ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ์
โฝ ์๋ฒ์ ์ฃผ์ด์ง ๋ฆฌ์์ค์ ์ํํ๊ธธ ์ํ๋ ํ๋, ์๋ฒ๊ฐ ์ํํด์ผ ํ ๋์์ ์ง์ ํ๋ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ
๐ ์ฃผ์ ๋ฉ์๋
GET
:ย ๋ฆฌ์์ค ์กฐํ
POST
: ย ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
PUT
:ย ๋ฆฌ์์ค๋ฅผ ๋์ฒด(๋ฎ์ด์ฐ๊ธฐ), ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ
PATCH
:ย ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ (PUT์ด ์ ์ฒด ๋ณ๊ฒฝ, PATCH๋ ์ผ๋ถ ๋ณ๊ฒฝ)
DELETE
:ย ๋ฆฌ์์ค ์ญ์
๐ ๊ธฐํ ๋ฉ์๋
HEAD
:ย GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ(body ๋ถ๋ถ)์ ์ ์ธํ๊ณ , ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํ
OPTIONS
:ย ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์
(๋ฉ์๋)์ ์ค๋ช
(์ฃผ๋ก CORS์์ ์ฌ์ฉ)
CONNECT
:ย ๋์ ์์์ผ๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์
TRACE
:ย ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ
์คํธ๋ฅผ ์ํ
โพ ๋ฆฌ์์ค ์กฐํ ๋ฉ์๋ (Read)
โพ ๋ง์ผ ํ์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ ์ฟผ๋ฆฌ์คํธ๋ง๋ฅผ ํตํด์ ์ ๋ฌ
GET /members/100?username=inpa&height=200
โพ ์ฟผ๋ฆฌ์คํธ๋ง ์ธ์ ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง, ์๋ฒ์์ ๋ฐ๋ก ๊ตฌ์ฑํด์ผ ๋๊ธฐ ๋๋ฌธ์ ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์์ ๊ถ์ฅํ์ง ์์
โพ ์กฐํํ ๋ POST๋ ์ฌ์ฉํ ์ ์์ง๋ง, GET ๋ฉ์๋๋ ์บ์ฑ์ด ๊ฐ๋ฅํ๊ธฐ์ย GET์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
โพ ์ ๋ฌํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ/์์ฑ ์์ฒญ ๋ฉ์๋ (Create)
โพ ๋ฉ์์ง ๋ฐ๋(body)๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ ์ ๋ฌํ๋ฉด ์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์
๋ฐ์ดํธ
โพ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ก ์ฃผ๋ก ์ ๊ท ๋ฆฌ์์ค ๋ฑ๋ก, ํ๋ก์ธ์ค ์ฒ๋ฆฌ์ ์ฌ์ฉ
โพ ๋ง์ผ ๋ฐ์ดํฐ๋ฅผ GET ํ๋๋ฐ ์์ด, JSON์ผ๋ก ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ผ ํ๋ ์ ๋งคํ ๊ฒฝ์ฐ POST๋ฅผ ์ฌ์ฉ
โพ ๋ฆฌ์์ค๋ฅผ ๋์ฒด(์์ )ํ๋ ๋ฉ์๋ (Update)
โพ ๋ง์ผ ์์ฒญ ๋ฉ์ธ์ง์ ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ๋ฎ์ด์ฐ๊ณ , ์์ผ๋ฉด ์๋ก ์์ฑํ๋ค.
/members/100 ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ฉด ๊ธฐ์กด์ ๊ฒ์ ์์ ๋์ฒด ํ๋ค.
/members/100 ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋์ฒด ํ ๊ฒ ์์ผ๋๊น ์๋ก ์์ฑํ๋ค.
โพ ๋ฐ์ดํฐ๋ฅผ ๋์ฒดํด์ผ ํ๋, ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ ๊ตฌ์ฒด์ ์ธ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ง์ ํด ๋ณด๋ด์ฃผ์ด์ผ ํ๋ค.
POST /members : ๋ฉค๋ฒ ์๋ก ์ถ๊ฐ
PUT /members/100 : 100๋ฒ์งธ ๋ฉค๋ฒ ์์
โ ์ผ๋ถ ๋ฆฌ์์ค๋ง ๋ณ๊ฒฝํ๊ธธ ์ํ๋ค๋ฉด? PATCH ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์!
โพ ๋ฆฌ์์ค ์ผ๋ถ ๋ถ๋ถ์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋ (Update)
โพ ๋ง์ผ PATCH๋ฅผ ์ง์ํ์ง ์๋ ์๋ฒ์์๋ ๋์ ์ POST๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
โพ ๋ฆฌ์์ค ์ ๊ฑฐํ๋ ๋ฉ์๋ (Delete)
โพ ์ํ์ฝ๋๋ ๋๋ถ๋ถ 200์ ์ฌ์ฉํ๊ณ ์ํฉ์ ๋ฐ๋ผ 204๋ฅผ ์ฌ์ฉํ๋ค.
โพ GET๊ณผ ๋์ผํ์ง๋งย ์๋ฒ์์ Body๋ฅผ Return ํ์ง ์์
โพ ์๋ต์ ์ํ ์ฝ๋๋ง ํ์ธํ ๋์ ๊ฐ์ด Resource๋ฅผ ๋ฐ์ง ์๊ณ ์ค์ง ์ฐพ๊ธฐ๋ง ์ํ ๋ ์ฌ์ฉ (์ผ์ข
์ ๊ฒ์ฌ ์ฉ๋)
โพ ์๋ฒ์ ์๋ต ํค๋๋ฅผ ๋ด์ผ๋ก์จ Resource๊ฐ ์์ ๋์๋์ง ํ์ธ ๊ฐ๋ฅ
โพ ์ด ๋ฉ์๋๋ ์ผ์ข
์ ๊ฒ์ฌ์ฉ
โพ ์๋ฒ์ ๋๋ฌ ํ์ ๋์ ์ต์ข
ํจํท์ ์์ฒญ ํจํท ๋ด์ฉ์ ์๋ต ๋ฐ์ ์ ์๋ค.
โพ ์์ฒญ์ ์ต์ข
์์ ์๋ ๋ฐ๋์ย ์ก์ ์์๊ฒ 200(OK) ์๋ต์ ๋ด์ฉ(Body)๋ก ์์ ํ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์กํด์ผ ํ๋ค.
โพ ์ต์ด Client์ ์์ฒญ์๋ Body๊ฐ ํฌํจ๋ ์ ์๋ค.
โพ ์๋น ์์ฒญ(Preflight)์ ์ฌ์ฉ๋๋ HTTP ๋ฉ์๋
โพ ์๋น ์์ฒญ์ด๋ ๋ณธ ์์ฒญ์ ํ๊ธฐ ์ ์ ์์ ํ์ง ๋ฏธ๋ฆฌ ๊ฒ์ฌํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค
โพ ์๋ฒ์ ์ง์ ๊ฐ๋ฅํ HTTP ๋ฉ์๋์ ์ถ์ฒ๋ฅผ ์๋ต ๋ฐ์ CORS ์ ์ฑ
์ ๊ฒ์ฌํ๊ธฐ ์ํ ์์ฒญ์ด๋ค.
Content-Type: application/x-www-form-urlencoded
โพ Form์ ๋ด์ฉ์ HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด์ ์ ์ก(key=value, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์)
โพ ์ ์ก ๋ฐ์ดํฐ๋ฅผ url encoding ์ฒ๋ฆฌ
โพ ์) abc๊น โ abc%EA%B9%80
Content-Type: multipart/form-data
โพ ํ์ผ ์
๋ก๋ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก ์ ์ฌ์ฉ
โพ ๋ค๋ฅธ ์ข
๋ฅ์ ์ฌ๋ฌ ํ์ผ๊ณผ Form์ ๋ด์ฉ ํจ๊ป ์ ์ก ๊ฐ๋ฅ
Content-Type: application/json
โพ TEXT, XML, JSON ๋ฐ์ดํฐ ์ ์ก ์ ์ฌ์ฉ
โฝ REST API์์ REST๋ Representational State Transfer์ ์ฝ์๋ก ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ ์ํคํ ์ฒ์ ํ ํ์์ด๋ค
โฝ ์์์ ์ด๋ฆ (์์์ ํํ) ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ (์ ๋ณด)๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค
โฝ ์๋ ์์ด๋ ์น (WWW) ๊ณผ ๊ฐ์ ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ ์ ์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํคํ ์ฒ์ ํ ํ์
โฝ REST๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์น์ ๊ธฐ์กด ๊ธฐ์ ๊ณผ HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ ์ฒ ์คํ์ผ์ด๋ค
โพ ์์(RESOURCE) - URI
โพ ํ์(Verb) - HTTP METHOD
โพ ํํ(Representations)
1) Uniform (์ ๋ํผ ์ธํฐํ์ด์ค)
โพ Uniform Interface๋ Http ํ์ค์๋ง ๋ฐ๋ฅธ๋ค๋ฉด ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, URI๋ก ์ง์ ํ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ํคํ
์ณ ์คํ์ผ์ ๋งํ๋ค
โพ URI๋ก ์ง์ ํ Resource์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ค
โพ ์ฆ, ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข
์๋์ง ์๋๋ค
2) Stateless (๋ฌด์ํ์ฑ)
โพ REST๋ HTTP์ ํน์ฑ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฌด์ํ์ฑ ์ฑ๊ฒฉ์ ๊ฐ๋๋ค -> ์์
์ ์ํ ์ํ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์๋๋ค
โพ ์ธ์
์ ๋ณด๋ ์ฟ ํค์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ API ์๋ฒ๋ ๋ค์ด์ค๋ ์์ฒญ๋ง์ ๋จ์ํ ์ฒ๋ฆฌํ๋ฉด ๋๋ค. ๋๋ฌธ์ ์๋น์ค์ ์์ ๋๊ฐ ๋์์ง๊ณ ์๋ฒ์์ ๋ถํ์ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์ง ์์์ผ๋ก์จ ๊ตฌํ์ด ๋จ์ํด์ง๋ค
3) Cacheable (์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ)
โพ HTTP๋ผ๋ ๊ธฐ์กด ์นํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
โพ ๋ฐ๋ผ์ HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ด ์ ์ฉ ๊ฐ๋ฅํ๋ค
โพ ์บ์ ์ฌ์ฉ์ ํตํด ์๋ต์๊ฐ์ด ๋นจ๋ผ์ง๊ณ REST Server ํธ๋์ญ์
์ด ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์๋ต์๊ฐ, ์ฑ๋ฅ, ์๋ฒ์ ์์ ์ด์ฉ๋ฅ ์ ํฅ์ ์ํฌ ์ ์๋ค
4) Self-descriptiveness (์์ฒด ํํ ๊ตฌ์กฐ)
โพ REST API ๋ฉ์์ง๋ง ๋ณด๊ณ ๋ ๊ทธ ์์ฒญ์ด ์ด๋ค ํ์๋ฅผ ํ๋์ง ์ ์ ์๋ค
5) Client - Server ๊ตฌ์กฐ
โพ ํด๋ผ์ด์ธํธ๋ ์ ์ ์ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ฅผ, ์๋ฒ๋ REST API๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๊ฐ์ ์ญํ์ด ํ์คํ๊ฒ ๊ตฌ๋ถ๋๊ณ ์ผ๊ด์ ์ธ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ๋์ด ์๋ํ ์ ์๊ฒ ํ๋ค
โพ REST Server
: API๋ฅผ ์ ๊ณตํ๊ณ ๋น์ง๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ์ ์ฑ
์์ง๋ค
โพ Client
: ์ฌ์ฉ์ ์ธ์ฆ์ด๋ context (์ธ์
, ๋ก๊ทธ์ธ ์ ๋ณด) ๋ฑ์ ์ง์ ๊ด๋ฆฌํ๊ณ ์ฑ
์์ง๋ค
โพ ์๋ก ๊ฐ ์์กด์ฑ์ด ์ค์ด๋ ๋ค
6) Layered System (๊ณ์ธตํ)
โพ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ํ๋ก์ ์๋ฒ, ์ํธํ ๊ณ์ธต ๋ฑ ์ค๊ฐ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ด ์์ ๋๊ฐ ๋๋ค
โ URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค.
GET /members/delete/1
-> REST๋ฅผ ์ ๋๋ก ์ ์ฉํ์ง ์์ URI
URI๋ ์์์ ํํํ๋๋ฐ ์ค์ ์ ๋์ด์ผ ํ๋ค. delete์ ๊ฐ์ ํ์์ ๋ํ ํํ์ด ๋ค์ด๊ฐ์๋ ์๋๋ค.
โ ์์์ ๋ํ ํ์๋ HTTP Method(GET, POST, PUT, DELETE ๋ฑ)๋ก ํํํ๋ค.
DELETE /members/1
-> ์๋ชป๋ URI๋ฅผ HTTP Method๋ฅผ ํตํด ์์ ํด ๋ณด๋ฉด ์์ ๊ฐ์ด ์์ ํ ์ ์๋ค
1) ์ฌ๋์ ๊ตฌ๋ถ์(/)๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ
http://restapi.example.com/houses/apartments
http://restapi.example.com/animals/mammals/whales
2) URI ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ๋์(/)๋ฅผ ํฌํจํ์ง ์๋๋ค
http://restapi.example.com/houses/apartments/ (โ)
http://restapi.example.com/houses/apartments (โญ)
3) ํ์ดํ(-)์ URI ๊ฐ๋ ์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉ
4) ๋ฐ์ค(_)์ URI์ ์ฌ์ฉํ์ง ์๋๋ค
-> ๋ฐ์ค ๋์ ํ์ดํ(-)์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค
5) URI ๊ฒฝ๋ก์๋ ์๋ฌธ์๊ฐ ์ ํฉํ๋ค
-> ๋์๋ฌธ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฆฌ์์ค๋ก ์ธ์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค
6) ํ์ผ ํ์ฅ์๋ URI์ ํฌํจ์ํค์ง ์๋๋ค
http://restapi.example.com/members/soccer/345/photo.jpg (โ)
-> REST API์์๋ ๋ฉ์์ง ๋ฐ๋ ๋ด์ฉ์ ํฌ๋งท์ ๋ํ๋ด๊ธฐ ์ํ ํ์ผ ํ์ฅ์๋ฅผ URI ์์ ํฌํจ์ํค์ง ์๋๋ค
-> ๋์ Accept Header๋ฅผ ์ฌ์ฉํ๋ค
GET / members/soccer/345/photo HTTP/1.1
Host: restapi.example.com
Accept: image/jpg
7) ๋ฆฌ์์ค ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ
/๋ฆฌ์์ค๋ช
/๋ฆฌ์์ค ID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
ex) GET : /users/{userid}/devices (์ผ๋ฐ์ ์ผ๋ก ์์ ์ ๊ด๊ณ๋ฅผ ํํํ ๋)
๋ง์ฝ์ ๊ด๊ณ๋ช ์ด ๋ณต์กํ๋ค๋ฉด ์ด๋ฅผ ์๋ธ ๋ฆฌ์์ค์ ๋ช ์์ ์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค
//์ฌ์ฉ์๊ฐ โ์ข์ํ๋โ ๋๋ฐ์ด์ค ๋ชฉ๋ก์ ํํํด์ผ ํ ๊ฒฝ์ฐ
GET : /users/{userid}/likes/devices (๊ด๊ณ๋ช
์ด ์ ๋งคํ๊ฑฐ๋ ๊ตฌ์ฒด์ ํํ์ด ํ์ํ ๋)
โฝ RESTful์ด๋, HTTP์ URI ๊ธฐ๋ฐ์ผ๋ก ์์์ ์ ๊ทผํ ์ ์๋๋ก ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ ์ธํฐํ์ด์ค์ด๋ค
โฝ REST API๋ฅผ ์ ๊ณตํ๋ ์น ์๋น์ค๋ฅผ 'RESTful'ํ๋ค๊ณ ํ ์ ์๋ค
โฝ RESTful API๋, REST์ ์ค๊ณ ๊ท์น์ ์ ์ง์ผ์ ์ค๊ณ๋ API์ด๋ค
โฝ @RestController ์ด๋
ธํ
์ด์
์ @Controller์ @ResponseBody๊ฐ ํฉ์ณ์ง ํํ๋ก, REST API๋ฅผ ๊ฐ๋ฐํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค
โฝ ์ด ์ด๋
ธํ
์ด์
์ ์ปจํธ๋กค๋ฌ ํด๋์ค์ ์ ์ฉํ๋ฉด, ๋ชจ๋ ์์ฒญ ๋งคํ ๋ฉ์๋์์ ๋ฐํ๋๋ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก JSON ํํ์ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ก ์ฒ๋ฆฌ๋๋ค
โฝ ๋ฐ๋ผ์ ๊ฐ ๋ฉ์๋์ @ResponseBody๋ฅผ ๋ณ๋๋ก ์ถ๊ฐํ ํ์๊ฐ ์๊ฒ ๋๋ค
๐ ํ์ Entity
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
โ @Entity
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ๊ณผ ์ผ๋์ผ๋ก ๋งค์นญ๋๋ ๊ฐ์ฒด ๋จ์์ด๋ฉฐ, Entity ๊ฐ์ฒด์ ์ธ์คํด์ค ํ๋๊ฐ ํ
์ด๋ธ์์ ํ๋์ ๋ ์ฝ๋ ๊ฐ์ ์๋ฏธํ๊ฒ ๋๋ค
โ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ ์ผํ ํค ๊ฐ์ ๊ฐ์ง๋๋ฐ ์ด๊ฒ์ ํ
์ด๋ธ ์์ Primary Key์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ @Id
๋ก ํ๊ธฐ๋๋ค
DTO(Data Transfer Object, ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด)๋ ํ๋ก์ธ์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฐ์ฒด
๐ ํ์ ๋ฑ๋ก API
1) Entity๋ฅผ Request Body์ ์ง์ ๋งคํ
@RestController
@RequiredArgsConstructor
public class MemberApiController {
private final MemberService memberService;
@PostMapping("/api/v1/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@Data
static class CreateMemberResponse {
private Long id;
public CreateMemberResponse(Long id) {
this.id = id;
}
}
}
โฝ ์ค๋ฌด์์๋ ํ์ Entity๋ฅผ ์ํ API๊ฐ ๋ค์ํ๊ฒ ๋ง๋ค์ด์ง๋๋ฐ, ํ Entity์ ๊ฐ๊ฐ์ API๋ฅผ ์ํ ๋ชจ๋ ์์ฒญ ์๊ตฌ์ฌํญ์ ๋ด๊ธฐ๋ ์ด๋ ต๋ค
โฝ Entity๊ฐ ๋ณ๊ฒฝ๋๋ฉด API ์คํ์ด ๋ณํ๋ค
-> API ์์ฒญ ์คํ์ ๋ง์ถ์ด ๋ณ๋์ DTO๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค
2) Entity ๋์ ์ DTO๋ฅผ RequestBody์ ๋งคํ
@RestController
@RequiredArgsConstructor
public class MemberApiController {
private final MemberService memberService;
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
Member member = new Member();
member.setName(request.name);
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@Data
static class CreateMemberRequest {
@NotEmpty
private String name;
}
@Data
static class CreateMemberResponse {
private Long id;
public CreateMemberResponse(Long id) {
this.id = id;
}
}
}
โฝ ์์ฒญ ๊ฐ์ผ๋ก Member ์ํฐํฐ ๋์ ์ ๋ณ๋์ DTO๋ฅผ ๋ฐ๋๋ค
โฝ CreateMemberRequest๋ฅผ Member Entity ๋์ ์ RequestBody์ ๋งคํํ๋ค
โฝ Entity๊ฐ ๋ณํด๋ API ์คํ์ด ๋ณํ์ง ์๋๋ค
โฝ JSON(JavaScript Object Notation)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ/์ ์ก ํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ ํ์
โฝ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํต์ ์์ ์ฃผ๋ก ๋ง์ด ์ฌ์ฉ๋จ
โฝ ๊ฐ๋จํ ํ์์ ๊ฐ๋ ๋ฌธ์์ด(๋ฐ์ดํฐ ๊ตํ์ ์ฃผ๋ก ์ฌ์ฉ)
โฝ Key, Value ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง
โฝ ๋ฌธ์์ด, ์ซ์, ๋ฐฐ์ด, ๋ถ๋ฆฌ์ธ ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํฌํจํ ์ ์์
1) JSON ๋ฐ์ดํฐ๋ ์ด๋ฆ๊ณผ ๊ฐ์ ์, key : value ํ์์ผ๋ก ๊ตฌ์ฑ, ์ค๊ดํธ({})๋ก ๋๋ฌ์์ ํํ
{ key : value }
ex) {"name": "์๋นต"}
2) JSON ๋ฐ์ดํฐ๋ ์ผํ(,)๋ก ๋์ด
{
"name": "์๋นต",
"family": "์ฐ์์ฝ๊ธฐ",
"age": 1,
"weight": 2.14
}
1) ์ซ์(number)
โฝ ์ซ์๋ ์ ์ ๋๋ ๋ถ๋์์์ฌ์ผ ํจ. ํฐ ๋ฐ์ดํ("")๋ก ์ ๋ฌถ์
{ "year" : 2024 }
2) ๋ฌธ์์ด(string)
โฝ ํฐ๋ฐ์ดํ("")๋ก ๋ฌถ์ด์ค๋ค
{ "name" : "kaeun" }
3) ๋ถ๋ฆฌ์ธ(boolean)
โฝ ์ฐธ : true, ๊ฑฐ์ง : false
{ "manager" : true }
4) ๊ฐ์ฒด(object)
โฝ ๊ฐ์ฒด๋ JSON ๊ฐ์ฒด์ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ์ผ ํจ
{ "code" : {
"HTML":"๊ธฐ๋ณธํ",
"CSS":"๋์์ธ",
"JS":"๋์๊ฐ๋ฅ"
}
}
5) ๋ฐฐ์ด(array)
โฝ ๋ฐฐ์ด(array)์ ๋๊ดํธ([])๋ก ๋๋ฌ์์ ํํ. ๋ํ, JSON ๋ฐฐ์ด์ ์ผํ(,)๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ JSON ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์ ์๋ค
{ "number" : ["์ผ", "์ด", "์ผ"] }
6) null
โฝ null : ๊ณต๊ฐ๋ง ์์ ๋ฟ, ์๋ฌด๊ฒ๋ ์๋ ์ํ, 0๊ณผ๋ ๋ค๋ฅธ ๊ฐ๋
{ "point" : null }
7) JSON Array
โฝ ์ฌ๋ฌ๊ฐ์ JSON Object๋ค์ด ๋ชจ์ธ ๊ฒ์ด JSON Array๋ก ๋๊ดํธ๋ก ๋๋ฌ์ธ์ธ ๋ถ๋ถ
[{"id": 0, "name": "์๋นต"}, //0๋ฒ index
{"id": 1, "name": "๋จํฅ๋นต"}, //1๋ฒ index
{"id": 2, "name": "์๋ผ๋นต"}] //2๋ฒ index
๐ ์ค์ ! ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ2 - API ๊ฐ๋ฐ๊ณผ ์ฑ๋ฅ ์ต์ ํ
๐ HTTP ๋ฉ์๋ ์ข
๋ฅ & ์์ฒญ ํ๋ฆ ๐ฏ ์ด์ ๋ฆฌ
๐ REST API ๊ตฌ์ฑ/ํน์ง ์ด ์ ๋ฆฌ
๐ RESTful API ์ด๋
๐ JSON์ด๋? - JSON ๊ตฌ์กฐ, JSON ๋ฐ์ดํฐ ํ์
, JSON Array