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);
    }
    }
  1. 버젼을 url에 인코딩하면 enum인 ApiVersion으로 변환하여 핸들러 메소드에 주입. localhost:8080/api/v2/hi 로 쓸수 있다.

  2. header에 담은 api 버전 처리

<클라우드 네이티브 자바 6장 참고>