Rest Api v1 or v2
실제 서비스를 운영 및 개발을 하다 보면 api 버젼이 바뀌는 경우가 있다.
- 앱 버젼이 업그레이드되면서 같은 동작을 하는 2개의 api가 필요한 경우(사용자는 앱 업데이트를 항상 하지 않는다…..ㅠ)
서비스 package를 userservice.v1, userservice.v2를 만들어 사용이 가능
VersionRestController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@RestController
@RequestMapping("/api")
public class VersionedRestController {
//@formatter:off
public static final String V1_MEDIA_TYPE_VALUE
= "application/vnd.bootiful.demo-v1+json";
public static final String V2_MEDIA_TYPE_VALUE
= "application/vnd.bootiful.demo-v2+json";
//@formatter:on
private enum ApiVersion {
v1, v2
}
public static class Greeting {
private String how;
private String version;
public Greeting(String how, ApiVersion version) {
this.how = how;
this.version = version.toString();
}
public String getHow() {
return how;
}
public String getVersion() {
return version;
}
}
@GetMapping(value = "/{version}/hi", produces = APPLICATION_JSON_VALUE)
Greeting greetWithPathVariable(@PathVariable ApiVersion version) {
return greet(version, "path-variable");
}
@GetMapping(value = "/hi", produces = APPLICATION_JSON_VALUE)
Greeting greetWithHeader(@RequestHeader("X-API-Version") ApiVersion version) {
return this.greet(version, "header");
}
private Greeting greet(ApiVersion version, String how) {
return new Greeting(how, version);
}
}
버젼을 url에 인코딩하면 enum인 ApiVersion으로 변환하여 핸들러 메소드에 주입. localhost:8080/api/v2/hi 로 쓸수 있다.
header에 담은 api 버전 처리
<클라우드 네이티브 자바 6장 참고>