[RestApi] Versioning 버전 관리 방법

2024. 3. 19. 23:35프로그래밍(Backend)/Spring Boot

1. URI versioning

http://localhost:8080 /v1/person

http://localhost:8080 /v2/person

@GetMapping("/v1/person")
public PersonV1 getFirstVersionOfPerson() {
    return new PersonV1("Bob Charlie");
}

@GetMapping("/v2/person")
public PersonV2 getSecondVersionOfPerson() {
    return new PersonV2(new Name("Bob", "Charlie"));
}


2. Request Parmeter versioning

http://localhost:8080/person?version=1

http://localhost:8080/person?version=2

@GetMapping(path = "/person", params = "version=1")
public PersonV1 getFirstVersionOfPersonRequestParameter() {
    return new PersonV1("Bob Charlie");
}

@GetMapping(path = "/person", params = "version=2")
public PersonV2 getSecondVersionOfPersonRequestParameter() {
    return new PersonV2(new Name("Bob", "Charlie"));
}


3. Header versioning

URL은 같고 header만 다르다.

URL, header : X-API-VERSION=1

URL, header : X-API-VERSION=2

@GetMapping(path = "/person/header", headers = "X-API-VERSION=1")
public PersonV1 getFirstVersionOfPersonRequestHeader() {
    return new PersonV1("Bob Charlie");
}

@GetMapping(path = "/person/header", headers = "X-API-VERSION=2")
public PersonV2 getSecondVersionOfPersonRequestHeader() {
    return new PersonV2(new Name("Bob", "Charlie"));
}


4. Media type versioning

URL은 같고 produces만 다르다.

URL, application/vnd.company.app-v1+json

URL, application/vnd.company.app-v2+json

@GetMapping(path = "/person/accept", produces = "application/vnd.company.app-v1+json")
public PersonV1 getFirstVersionOfPersonRequestAccept() {
    return new PersonV1("Bob Charlie");
}

@GetMapping(path = "/person/accept", produces = "application/vnd.company.app-v2+json")
public PersonV2 getSecondVersionOfPersonRequestAccept() {
    return new PersonV2(new Name("Bob", "Charlie"));
}

 

버전 관리엔 완벽한 답은 없고 사용하고 싶은 버전 관리 방법을 선택하되 한 조직에선 같은 방식을 사용하는 것이 좋다.