REST API
๐ REST API
๐ REST
REST ๋
REST ( Representational State Transfer ) ์ ์ฝ์๋ก ํ๋์ URI๋ ํ๋์ ๊ณ ์ ํ ๋ฆฌ์์ค ( Resource ) ๋ฅผ ๋ํํ๋๋ก ์ค๊ณ๋๋ค๋ ๊ฐ๋
์ ์ ์ก๋ฐฉ์์ ๊ฒฐํฉํด์ ์ํ๋ ์์
์ ์ง์ ํ๋ค.
์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ
์ฒ๋ก์ REST๊ฐ ๊ฐ๋ฐ๋์๋ค.
HTTP URI๋ฅผ ํตํด ์ ์ดํ ์์ ( Resource )์ ๋ช
์ํ๊ณ , HTTP Method ( GET, POST, PUT, DELETE ) ์ ํตํด ํด๋น ์์ ( Resources ) ์ ๋ํ CRUD Operation์ ์ ์ฉํ๋ ๋ฐฉ์์ ์ํคํ
์ฒ๋ค.
CRUD Operation
- Create : ๋ฐ์ดํฐ ์์ฑ ( POST )
- Read : ๋ฐ์ดํฐ ์กฐํ ( GET)
- Update : ๋ฐ์ดํฐ ์์ ( PUT )
- Delete : ๋ฐ์ดํฐ ์ญ์ ( DELETE )
REST ๊ตฌ์ฑ
-
์์ ( Resource )
- URI, Server์ ์กด์ฌ
-
ํ์ : HTTP Method
- 4๊ฐ์ง method ( GET, POST, PUT, DELETE )
-
ํํ ( Representations )
- Client๊ฐ ์์์ ์ํ์ ๋ํ ์กฐ์์ ์์ฒญํ๋ฉด Server๋ ์ด์ ์ ์ ํ ์๋ต์ ๋ณด๋ธ๋ค.
- JSON, XML, TEXT, RSS ๋ฑ ์ฌ๋ฌ ํํ์ ์๋ต์ผ๋ก ๋ํ ๋ผ ์ ์๋ค.
- JSON์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค.
์ ํํ๋ HTTP URI๋ก ๋ฆฌ์์ค๋ฅผ ์ ์ํ๊ณ HTTP Method๋ก ๋ฆฌ์์ค์ ๋ํ ํ์๋ฅผ ์ ์ํ๋ค.
๋ฆฌ์์ค๋ JSON, XML ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ธ์ด๋ก ํํํ ์ ์๋ค. ( ์ ์ฝ์ด ์๋ค )
REST ๊ณผ ๊ธฐ์กด Service ( web ) ๋น๊ต
- ๊ธฐ์กด Service
- ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ ํ ๊ฐ๊ณต๋ data๋ฅผ ์ด์ฉํ์ฌ ํน์ ํ๋ซํผ์ ์ ํฉํ ํํ์ View๋ก ๋ง๋ค์ด์ ๋ฐํ
- REST Service
- data ์ฒ๋ฆฌ๋ง ํ๋ค๊ฑฐ๋, ์ฒ๋ฆฌ ํ ๋ฐํ๋ data๊ฐ ์๋ค๋ฉด JSON ์ด๋ XML ํ์์ผ๋ก ์ ๋ฌ. View์ ๋ํด์๋ ์ ๊ฒฝ์ ์ธ ํ์๊ฐ ์๋ค
- ์ด๋ฌํ ์ด์ ๋ก OPEN API์์ ๋ง์ด ์ฌ์ฉ
REST ํน์ง
- ๊ธฐ์กด์ ์ ์ก๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ ์๋ฒ๋ ์์ฒญ์ผ๋ก ๋ฐ์ ๋ฆฌ์์ค์ ๋ํด ์์ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ๊ธฐ์กด์ GET/POST ์ธ์ PUT, DELETE ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค์ ๋ํ CRUD ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
- HTTP URI๋ฅผ ํตํด ์ ์ดํ ์์ ( Resource )์ ๋ช ์ํ๊ณ , HTTP Method ( GET, POST, PUT, DELETE ) ์ ํตํด ํด๋น ์์ ( Resources )์ ์ ์ดํ๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ์ํคํ ์ฒ ์ด๋ค.
- ๋ชจ๋ฐ์ผ, PC, ์ดํ๋ฆฌ์ผ์ด์ ๋ฑ ํ๋ซํผ์ ์ ์ฝ์ ๋์ง ์๋๋ค.
- View ์ ์ ๊ฒฝ์ฐ์ง ์๋๋ค, ๋ฐ์ดํฐ๋ง ์ ๋ฌํ๋ค.
- JSON ํฌ๋ฉง์ ์ ์ผ ๋ง์ด ์ฌ์ฉํ๋ค.
- ๋น๋๊ธฐ์ฒ๋ฆฌ์ ์ฌ์ฉํ๋ค.
- Server - Client ๊ตฌ์กฐ์ด๋ค.
- Stateless : ์ํ๋ฅผ ์ ์งํ์ง ์๋๋ค( ์ํ์ ๋ณด ๊ธฐ์ต X ), ๋ค์ด์จ ์์ฒญ์ ์ฒ๋ฆฌ๋ง ํด์ฃผ๋ฉด ๋๋ค.
- Cacheable : ์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Layered System : ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ถ๋ฆฌ๋์ด ์์ด ์ค๊ฐ์ ํ๋ก์์๋ฒ, ์ํธํ ๊ณ์ธต ๋ฑ ์ค๊ฐ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- Uniform Interface : ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข ์๋์ง ์๋๋ค. ( HTTP ํ์ค์๋ง ๋ฐ๋ฅธ๋ค๋ฉด )
REST ์ค๊ณ ๋ชฉํ
- ์ปดํฌ๋ํธ๋ค๊ฐ์ ์ ์ฐํ ์ํธ ์ฐ๋์ฑ ํ๋ณด ( ๋ ํจ์จ์ ์ผ๋ก ์ํ )
- ๋ฒ์ฉ ์ธํฐํ์ด์ค ( ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง๋ง ๊ณ ๋ คํ๋ฉด ๋๋ค. )
- ๊ฐ ์ปดํฌ๋ํธ๋ค์ ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ
- ์ง์ฐ ๊ฐ์, ๋ณด์๊ฐํ, ๋ ๊ฑฐ์ ์์คํ ์ ์ธ์บก์๋ ์ด์ ( ๋ฐ์ดํฐ์ ํค๋๊ฐ ์ถ๊ฐ๋๋ ๊ณผ์ ) ํ๋ ์ค๊ฐ ์ปดํฌ๋ํธ๋ก์ ์ญํ
REST ์ฅ์
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ ํ๋ค.
- HTTP ํ๋กํ ์ฝ์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก REST API ์ฌ์ฉ์ ์ํ ๋ณ๋์ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์๋ค.
- HTTP ํ๋กํ ์ฝ์ ํ์ค์ ์ต๋ํ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ํจ๊ป ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ํ๋ค.
- HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ํ๋ ๋ฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
- ์ฌ๋ฌ ๊ฐ์ง ์๋น์ค ๋์์ธ์์ ์๊ธธ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ต์ํํ๋ค.
REST ๋จ์
- ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ 4๊ฐ ๋ฐ์ ์๋ค.
- ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ ํธํ์ด ์ ์๋๋ค.
- ์ ๋ฌธ์ฑ์ด ์๊ตฌ๋๋ค.
- ํ์ค ์์ฒด๊ฐ ์์ด์ ์ ์๊ฐ ํ์ํ๋ค. ( ๋ค๋ค ์ด๋ ๊ฒ ์ฐ๋๋ผ ~ ๋ผ๋ ์๋ฌต์ ์ธ ํ์ค๋ง ์ ํด์ ธ ์๋ค. )
- HTTP์ ์๋นํ ์์กด์ ์ด๋ค.
๐ REST API
REST API ๋
REST API๋ REST์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ API ( Application Programming Interface ) ๋ฅผ ์๋ฏธํ๋ค.
API๋ ์ปดํจํฐ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ์ฐ๊ฒฐ์ด๋ค. ๋ค๋ฅธ ์ข
๋ฅ์ ์ํํธ์จ์ด์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค.
REST API ์ค๊ณ ์์
- ํ์ดํ (-) ์ ์ฌ์ฉ ๊ฐ๋ฅ ํ์ง๋ง ์ธ๋๋ฐ (_)๋ ์ฌ์ฉํ์ง ์๋๋ค.
- bad : http://jsdevlog.com/test_blog
- good : http://jsdevlog.com/test-blog
- ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋๋ฌธ์ ์ฌ์ฉ์ ํ์ง ์๋๋ค. ( ๋์๋ฌธ์ ๊ตฌ๋ถ )
- good : http://jsdevlog.com/test
- URI ๋ง์ง๋ง์ ์ฌ๋์(/)๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- bad : http://jsdevlog.com/test/
- good : http://jsdevlog.com/test
- ์ฌ๋์(/) ๋ก ๊ณ์ธต๊ด๊ณ๋ฅผ ๋ํ๋ธ๋ค.
- good : http://jsdevlog.com/study/java
- ํ์ฅ์๊ฐ ํฌํจ๋ ํ์ผ์ด๋ฆ์ ์ง์ ํฌํจ์ํค์ง ์๋๋ค.
- bad : http://jsdevlog.com/picture.jpg
- good : http://jsdevlog.com/picture
- URI๋ ๋ช
์ฌ๋ฅผ ์ฌ์ฉํ๋ค.
- bad : http://jsdevlog.com/testing
- good : http://jsdevlog.com/test
REST API ์ ๊ธฐ์กด ์น ์ ๊ทผ ๋ฐฉ์๊ณผ ์ฐจ์ด์
์์ | ๊ธฐ์กด ๋ฐฉ์ ๋ฉ์๋ | ๊ธฐ์กด ๋ฐฉ์ | REST ๋ฐฉ์ ๋ฉ์๋ | REST ๋ฐฉ์ | ์ค๋ช |
Create ( Insert ) | POST | /write.do?id=js | POST | /blog/js | ๊ธ์ฐ๊ธฐ |
Read ( Select ) | GET | /view.do?id=js&articleno=10 | GET | /blog/js/10 | ๊ธ์ฝ๊ธฐ |
Update ( Update ) | POST | /modify.do?id=js | PUT | /blog/js | ๊ธ์์ |
Delete ( Delete ) | GET | /delete.do?id=js&articleno=10 | DELETE | /blog/js/10 | ๊ธ์ญ์ |
๊ธฐ์กด ๋ธ๋ก๊ทธ๋ค์ GET๊ณผ POST ๋ง์ผ๋ก ์์์ ๋ํ CRUD๋ฅผ ์ฒ๋ฆฌํ๊ณ , URI๋ ์ก์
์ ๋ํ๋๋ค.
REST๋ก ๋ณ๊ฒฝํ ๊ฒฝ์ฐ 4๊ฐ์ง method ( GET, POST, PUT, DELETE )๋ฅผ ๋ชจ๋ ์ฌ์ฉํ์ฌ CRUD๋ฅผ ์ฒ๋ฆฌํ๊ณ URI๋ ์ ์ดํ๋ ค๋ ์์์ ๋ํ๋ธ๋ค.
REST API ์ค์
- Jackson library
- jackson-databind ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ JSON ํฌ๋ฉง์ ๋ฌธ์์ด๋ก ๋ณํ์์ผ ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ๋ค.
- jackson-dataformat-xml ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ xml๋ก ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ๋ค.
- pom.xml ์ library ์ถ๊ฐ
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind-version}</version>
</dependency>
- JSON library
- java์์ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฐ์ดํฐํ์ ๋ณดํต JSONObject์ด๋ค.
- ์ด๊ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ library๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json-version}</version>
</dependency>
REST API ๊ด๋ จ Annotation
Annotation | Description |
@RestController | Controller๊ฐ REST ๋ฐฉ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฒ์์ ๋ช
์ ๋ชจ๋ ๋ฉ์๋๊ฐ @ResponseBody๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ์ค์ ํด์ฃผ์ด @ResponseBody๋ฅผ ์๋ตํด์ค๋ค. |
@ResponseBody | JSP ๊ฐ์ ๋ทฐ๋ก ์ ๋ฌ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์ ๋ฌ ๊ธฐ์กด ์น์ return { name : "js" } ๋ผ ํ๋ฉด viewResolver ์ ์ํด ์์ /WEB-INF/views/....js ๊ฐ ๋ฐํ๋๋ค. ๊ทธ๋ฌ๋ jsp๋ฅผ ๋ณด๋ด๋ ค๋ ์๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ @ResponseBody ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ณด๋ผ ์ ์๋ค. |
@PathVariable | URL ๊ฒฝ๋ก์ ์๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ถ์ถ |
@CrossOrigin | Ajax์ ํฌ๋ก์ค ๋๋ฉ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ์ค์ ํ URI๋ง ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค. -> ๋ณด์ ๋ฌธ์ @CrossOrigin("*") ์ HTTP ํ์ค ํ๋กํ ์ฝ์ด๋ฉด ๋ค ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ |
@RequestBody |
JSON ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํ์
์ผ๋ก ๋ฐ์ธ๋ฉ parameter ๊ฐ ์๋ JSON์ผ๋ก ๋ฐ์์์ ๋ DTO์ parameter๋ก ๋งคํ์์ผ์ฃผ๋ ์ญํ |
๐ RESTFUL
RESTFUL ์ด๋
RESTFUL ์ด๋ REST์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ
์ ์๋ฏธํ๋ค.
ํ์ง๋ง REST๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ชจ๋๊ฐ RESTFUL ํ ๊ฒ์ ์๋๋ค.
REST API์ ์ค๊ณ ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์งํจ ์์คํ
์ RESTFULํ๋ค ๋งํ ์ ์์ผ๋ฉฐ
๋ชจ๋ CRUD ๊ธฐ๋ฅ์ POST๋ก ์ฒ๋ฆฌํ๋ API ํน์ URI ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์งํค์ง ๋ชปํ๋ค๋ฉด REST API๋ฅผ ์ฌ์ฉํ๋ค ํ๋๋ผ๋ RESTFUL ํ๋ค๊ณ ๋งํ ์ ์๋ค.
๐ ์ฐธ์กฐ
https://velog.io/@somday/RESTful-API-%EC%9D%B4%EB%9E%80
https://khj93.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-API%EB%9E%80-REST-RESTful%EC%9D%B4%EB%9E%80