๋ฒ์ ๊ด๋ฆฌ
๋จ์ํ๊ฒ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ํญ๋ชฉ์ ์ ์ดํ๋ ์ฉ๋๊ฐ ์๋๋ผ
REST API์ ์ค๊ณ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ ๋๋ ๋ฒ์ ์ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋ค.
์ฌ์ฉ์์๊ฒ๋ ์ด๋ ํ API ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋์ง ๋ช ์ํด์ผ ํ๋ค.
์ข
๋ฅ
1) URI Versioning : Twitter
2) Request Parameter Versioning : Amazon
3) (Custom) Headers Versioning(MIME) : Microsoft
4) Media type Versioning(content negotiation, accept header) : Github
- ์ผ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ ๊ฐ๋ฅ : URI, Request Parameter
- ์ผ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ ๋ถ๊ฐ : (Custom) Headers Versioning, Media type Versioning
์ ์ ์ฌํญ
- URI Pollution : ๋๋ฌด ์ง์ ๋ถํ๊ฑฐ๋ ๊ณผ๋ํ๊ฒ ์ ๋ณด๋ฅผ ํ๊ธฐํ๋ ๊ฒ์ ์ง์
- Misuse of HTTP headers : ์๋ชป๋ ํค๋๊ฐ ์ฃผ์
- Caching : ์ ์ ํ ์บ์ ์ญ์ ํด์ ์ ๋๋ก ๋ ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ํจ
- Can we execute the request on browser?
- API Documentation
REST API ๋ฒ์ ๊ด๋ฆฌ
๊ธฐ๋ณธ ์ค์
// ๋ฐํ๋ฐ์ User๋ฅผ UserV2๋ก ๋ณํ
UserV2 userV2 = new UserV2();
// ๋ ์ธ์คํด์ค ๊ฐ์ ๊ณตํต๋ ํ๋๊ฐ ์์ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ copyํจ
BeanUtils.copyProperties(user, userV2); // id, name, joinDate, password, ssn
userV2.setGrade("VIP");
URL์ ์ด์ฉํ ๋ฒ์ ๊ด๋ฆฌ
url์ ๋ฒ์ ์ ํ์ํจ์ผ๋ก์จ ๋ฒ์ ์ ํ์ํ ์ ์๋ค.
๋ฒ์ ๊ด๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ค ์ฝ๋ ๋ฟ๋ง ์๋๋ผ ์ ๊ณตํ๋ ค๋ ์๋น์ค์ ๋ฆฌ์์ค์ ๋ํด์๋ ๊ด๋ฆฌํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
@GetMapping("/v1/users/{id}")
public MappingJacksonValue retrieveUserV1(@PathVariable int id) { ... }
Request Parameter๋ฅผ ์ด์ฉํ ๋ฒ์ ๊ด๋ฆฌ
params = " " ์ฌ์ฉ
// ๋ฐ์ดํฐ ๋ค์ ๋ฒ์ ์ ๋ํ ์ ๋ณด๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฌ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ URI ๋ค์ "/"๊ฐ ๋ถ๋๋ค
@GetMapping(value = "/users/{id}/", params = "version=1")
http://localhost:8088/admin/users/1/?version=1 ๋ฐฉ์์ผ๋ก ํธ์ถ
Header๋ฅผ ์ด์ฉํ ๋ฒ์ ๊ด๋ฆฌ
@GetMapping(value = "/users/{id}", headers = "X-API-VERSION=2")
MIME ํ์ ์ ์ด์ฉํ ๋ฒ์ ๊ด๋ฆฌ
MIME ํ์ → Multi-Purpose Internet Mail Extension(ํ์ผ ๋ณํ)
์ด๋ฉ์ผ๊ณผ ํจ๊ป ์ ์ก๋๋ ๋ฉ์ผ๋ฅผ ํ ์คํธ ๋ฌธ์๋ก ๋ณํํด์ ์ด๋ฉ์ผ ์๋ฒ์ ์ ๋ฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
// ์ ๊ณตํ๊ณ ์ ํ๋ MIME ํ์
์ง์
// ๊ธฐ์กด์ ์๋ ์๋ก์ด ๊ฐ -> application
// ๋ฒ์ ์ด๋ฆ : appv1
// ์ ๋ฌ ์ํค์กฐ์ ํ๋ ํ์
: json
@GetMapping(value = "/users/{id}", produces = "application/vnd.company.appv1+json")
'๐ฟ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot/RESTful] Swagger ์ค์ (+๋ฒ์ ์ค๋ฅ) (0) | 2022.02.18 |
---|---|
[Spring Boot/RESTful] REST API 3๋จ๊ณ๋ฅผ ์ํ HATEOAS ์ค์ (0) | 2022.02.18 |
[Spring boot/RESTful] Response Filtering (0) | 2022.02.18 |
[Spring Boot/RESTful] Response ๋ฐ์ดํฐ ํ์ ๋ฐํ(XML format) (0) | 2022.02.18 |
[Spring Boot/RESTful] Validation API์ Internationalization (0) | 2022.02.18 |
๋๊ธ