[Spring boot] Spring Data Rest๋ฅผ ์ด์ฉํ REST API ๊ฐ๋ฐ 1
MVC ํจํด์ ์ด์ด์, ์ด๋ฒ์๋ Spring Data Rest๋ฅผ ์ด์ฉํ์ฌ REST API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
MVC ํจํด์์๋ Domain, Controller, Repository ์ด๋ ๊ฒ 3๊ฐ์ง๋ฅผ ์ด์ฉํ์๊ณ , ์ถ๊ฐ๋ก Service ํด๋์ค๋ฅผ ๊ตฌํํ๋ฉด ๋์ฑ ์ธ๋ถ์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ ์ ์์์ต๋๋ค.
Spring Data Rest๋ VC๋ฅผ ์๋ตํ๊ณ , ์ค์ง Domain๊ณผ Repository๋ง์ ๊ฐ์ง๊ณ ์์ฃผ ์ฝ๊ฒ REST API ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ํ ๋ฒ ์์ํด๋ณด๋๋ก ํ์ฃ .
๊ฐ๋ฐ ํ๊ฒฝ ์ค๋น
๊ธฐ์กด์ MVC ํจํด์ ์ฌ์ฉํ๋ ๋ํ๋์์์ ์ผ๋ถ ๋ณ๊ฒฝํ์ฌ, Rest Repositores ์ ํํด์ฃผ๋ฉด ๋ฉ๋๋ค.
Spring Data Rest์์๋ base-path๋ฅผ ์ง์ ํ์ฌ ๋ชจ๋ API ์์ฒญ์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด์ค ์ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ ๊ฐ Controller์์ ์ง์ api ํฌ์ธํธ๋ฅผ ์ก์์ฃผ์ง ์์๋ ๋๋ ํธ๋ฆฌํจ์ด ์์ต๋๋ค.
default-page-size๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ๋ก ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์์ฒญํ์ง ์์์ ๋, ์ ์ฉํ ๊ธฐ๋ณธ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ค์ ํ์๊ณ , max-page-size๋ฅผ ํตํด ์ต๋ ํ์ด์ง ๊ฐฏ์๋ฅผ ์ค์ ํ์์ต๋๋ค.
์ด ์ธ์๋ ๋ค์ํ ์ต์ ๋ค์ด ์กด์ฌํฉ๋๋ค.
์ด๋ฆ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
page-param-name | ํ์ด์ง๋ฅผ ์ ํํ๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ช ๋ณ๊ฒฝ | page |
limit-param-name | ํ์ด์ง ์์ดํ ์๋ฅผ ๋ํ๋ด๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ช ๋ณ๊ฒฝ | size |
sort-param-name | ํ์ด์ง ์ ๋ ฌ๊ฐ์ ๋ํ๋ด๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ช ๋ณ๊ฒฝ | sort |
default-media-type | ๋ฏธ๋์ด ํ์ ์ ๊ธฐ๋ณธ ๊ฐ ์ง์ | application/hal+json;charset=UTF-8 |
return-body-on-create | POST ๋ฉ์๋๋ฅผ ์ด์ฉํ ์๋ก์ด Entity ์์ฑ ์ดํ Response Body ๋ฐํ ์ฌ๋ถ ์ค์ | true |
return-body-on-update | PUT ๋ฉ์๋๋ฅผ ์ด์ฉํ Entity ์์ ์ดํ, Response Body ๋ฐํ ์ฌ๋ถ ์ค์ | true |
enable-enum-translation | 'rest-message' ๋ผ๋ property ํ์ผ์ ๋ง๋ค์ด์ ์ง์ ํ enum ๊ฐ์ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ ์ค์ ๊ฐ. ์ ํฉํ enum ๊ฐ (DEFAULT, ALL, VISIBILITY, ANNOTATED)๋ฅผ ํค๋ก ์ฌ์ฉ |
|
detection-strategy | Repository ๋
ธ์ถ ์ ๋ต์ ์ค์ ํ๋ property ๊ฐ Repository Strategy ์ธํฐํ์ด์ค ๋ด๋ถ์ ๊ตฌํ๋ enum ๊ฐ์ผ๋ก ์ค์ |
default |
detection-strategy ์ต์ ์ ๊ฒฝ์ฐ API๋ก ๋ง๋ค์ด์ค Repository๋ฅผ ์ฐพ๋ ์ ๋ต์ ๋๋ค. Default ์ค์ ์ ๊ฒฝ์ฐ, ๋ชจ๋ public repository๋ฅผ ๋์์ผ๋ก ํ๋, exported ์ต์ ์ด false์ธ ๊ฒฝ์ฐ๋ ์์ธ๋ก ๋๊ฒ ๋ฉ๋๋ค.
Repository ์ ๋ต์ ์ง์ํ๋ ์ ์ฅ์๋ ์๋์ ๋ฆฌ์คํธ์ ๊ฐ์ต๋๋ค.
- Spring Data JPA
- Spring Data MongoDB
- Spring Data Neo4j
- Spring Data GemFire
- Spring Data Cassandra
๊ทธ ์ค ์ฌ๊ธฐ์๋ Spring Data JPA๋ก ๋ค๋ฃจ๊ฒ ๋ ๊ฒ์ ๋๋ค.
REST API ๊ตฌํํ๊ธฐ
๊ฐ๋ฐ ์ค์ ์ด ๋ชจ๋ ๋๋ฌ๋ค๋ฉด, ๋ฐ๋ก REST API๋ฅผ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
MVC ํจํด ํฌ์คํธ์์ ์ฌ์ฉํ๋ ๋๋ฉ์ธ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ , ์์ ๊ฐ์ด ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
์ฌ๊ธฐ์ RepositoryRestResource ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐ๋ง ํด์ฃผ๋ฉด ๋ณ๋์ Controller, Service ์์ด ๋ฏธ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก ์ ์๋์ด ์๋ ๋ก์ง์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋์ด ๋์ฑ ์ฝ๊ฒ REST API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
Test
MVC ํจํด์์ ํ๋ ๊ฒ๊ณผ ๋๊ฐ์ด Curl ์ปค๋งจ๋๋ฅผ ์ด์ฉํด์ ํ ์คํธ๋ฅผ ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ curl http://localhost:8080/api/items
๊ธฐ์กด์ MVC ํจํด์์ ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ณด์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฌด๋ฐ ๋ด์ฉ์ด ์์ผ๋, content์์๋ target์ ํ์ ์ด ์ด๋ค ํจํค์ง์ ์ด๋ค ํด๋์ค์ธ์ง์ ๋ํ ์ ๋ณด๊ฐ ๋์ค๋๊ตฐ์.
$ curl -X POST -H "Content-Type: application/json" --data '{ "name": "apple", "price": 3000 }' http://localhost:8080/api/items | json_pp
์ํ ํ๋๋ฅผ ์์ฑํ๋, MVC ํจํด์์๋ ๋ชจ๋ธ ๊ฐ์ ๋ฐํํด์ค ๋ฐ๋ฉด, Data Rest์์๋ ๋ฐฉ๊ธ ์์ฑํ ๋ชจ๋ธ์ name๊ณผ price๋ฅผ ํ์ํด์ฃผ๊ณ , ์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๊ฒฝ์ฐ, ์์ URI๋ฅผ ์ด์ฉํ๋ผ๋ ์ง์นจ์ ๋ฐํ๊ฐ์ด ๋์ต๋๋ค. MVC ํจํด์ผ๋ก ๊ตฌํํ์ ๋๋ณด๋ค ๋ ์ค๋ช ์ด ์ข๊ณ , ๊น๋ํ ๋๋์ ๋๋ค.
์ํ ํ๋๋ฅผ ์ถ๊ฐํ ๋ค์ ๋ค์ ๋ชฉ๋ก์ ์กฐํํ๋ฉด, ํด๋์ค์ ์ ๋ณด๋ ์ฌ๋ผ์ง๊ณ content ๋ด์ ์๊น ๋ฐํ ๋ฐ์ ๋ด์ฉ์ด ๋ค์ด๊ฐ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฒ์๋ ์ํ 10๊ฐ๋ฅผ ๋ฑ๋กํ๊ณ , GET ๋ฉ์๋๋ฅผ ์ํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ for i in {1..10}; do curl -X POST -H "Content-Type: application/json" --data '{ "name": "apple", "price": 3000 }' http://localhost:8080/api/items | json_pp; done
Shell script๋ฅผ ์ด์ฉํด์ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด ์์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
10๊ฐ๋ฅผ ๋ฑ๋กํ๋ฉด 11๊ฐ๊ฐ ๋๋ฏ๋ก, ์ด์ links์์ ํ์ด์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ฃผ๊ฒ ๋ฉ๋๋ค. 10๊ฐ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์ ํ ๋, ์ด๋ค ํ์ด์ง์ URI๋ฅผ ํธ์ถํ๋ฉด ๋๋์ง๋ฅผ ์ค๋ช ํด์ฃผ๋ฉฐ ์ด๋ HATEOAS๋ฅผ ์์ฃผ ์์งํจ ์์์ ๋๋ค. ์ด๋ฌํ ์ ๋ณด๋ Key-value ํ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด์ ํด๋ผ์ด์ธํธ๊ฐ ํค๋ฅผ ์ฐธ์กฐํ๋๋ก ์ฝ๋๋ฅผ ์ค์ ํ๋ฉด ์๋ฒ์์ ์์ฒญ๋ ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ๋ฐ๋๋๋ผ๋ ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์์ด ๋งค์ฐ ์ข์ฃ .
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง Spring Data Rest๋ฅผ ์ด์ฉํ์ฌ REST API๋ฅผ ๋ง๋ค์ด๋ดค์ต๋๋ค. ์์ ๋ง์๋๋ ธ๋ค์ํผ Spring Data Rest๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด VC๋ฅผ ๊ตฌํํ์ง ์์๋ Repository์ Domain ๋ง์ผ๋ก๋ ์ฝ๊ฒ REST API๋ฅผ ๊ตฌํํ ์ ์์๋๋ฐ์.
๊ทธ๋ ์ง๋ง ๋ชจ๋ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฌํ ํํ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ๋ฅผ ์์น ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋์ Spring Data Rest์์๋ ๊ฐ๋ณ์ ์ผ๋ก Controller, Service๋ฅผ ๊ตฌํํ ์๋ ์๋๋ฐ์. ์ด ๋ถ๋ถ์ ๋ค์ ํฌ์คํธ์์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring boot] JDBC์ Spring JDBC ๊ทธ๋ฆฌ๊ณ MyBatis (0) | 2020.05.22 |
---|---|
[Spring boot] Spring Data Rest๋ฅผ ์ด์ฉํ REST API ๊ฐ๋ฐ 2 (1) | 2020.05.20 |
[Spring boot] MVC ํจํด์ ์ด์ฉํ REST API ๊ฐ๋ฐ (3) | 2020.05.19 |
[Spring boot] REST API์ ๊ธฐ์ด์ ์ค๊ณ (0) | 2020.05.19 |
[Spring boot] Spring boot test starter๋ฅผ ์ด์ฉํ ํ ์คํธ ์ฝ๋ ์์ฑ (0) | 2020.04.23 |