[Spring]REST API 버전 관리 방법

2025. 2. 26. 10:58·spring

 

🔍 API 버전 관리는 왜 필요할까?

API는 시간이 지나면서 새로운 기능이 추가되거나 기존 기능이 변경될 수 있습니다.
하지만 기존 API를 그대로 변경하면 기존 클라이언트가 예상치 못한 오류를 겪을 수 있기 때문에, API 버전 관리를 통해 안정적으로 서비스를 운영해야 합니다.

 

🚀 API 버전 관리를 통해 얻을 수 있는 장점:

  • 클라이언트가 원하는 버전을 선택할 수 있음
  • 기존 API를 유지하면서 새로운 기능을 추가할 수 있음
  • API의 변경을 점진적으로 적용 가능

📌 API 버전 관리 방법 4가지

1. URL 경로 기반 버전 관리

📢 방식:
버전을 URL 경로에 포함하여 API를 구분하는 방식 (/api/v1/, /api/v2/)

@RestController
@RequestMapping("/api")
public class UrlController {
    @GetMapping("v1/url")
    public String getUrlV1() {
        return "url v1";
    }

    @GetMapping("v2/url")
    public String getUrlV2() {
        return "url v2";
    }
}

 

📌 장점:
✅ 직관적이고 이해하기 쉬움
✅ API Gateway 및 캐싱 적용이 쉬움
✅ RESTful 설계 원칙과 잘 맞음

❌ 단점:
⚠️ URL이 길어질 수 있음
⚠️ 오래된 버전을 유지하면 API가 많아질 수 있음

 

🎥 동작확인

url v1
url v2


2. 요청 파라미터 기반 버전 관리 (?version=1)

📢 방식:
API 요청 시 ?version=1 또는 ?version=2와 같은 쿼리 파라미터를 사용

@RestController
@RequestMapping("/api/param")
public class ParamController {

    @GetMapping(params = "version=1")
    public String getParamV1() {
        return "param v1";
    }

    @GetMapping(params = "version=2")
    public String getParamV2() {
        return "param v2";
    }
}

 

📌 장점:
✅ URL이 동일하므로 깔끔함
✅ 클라이언트가 쉽게 버전을 선택할 수 있음

❌ 단점:
⚠️ API Gateway에서 캐싱 적용이 어려움
⚠️ 검색 엔진(SEO)에 불리함

 

🎥 동작확인

param v1
param v2


3. 헤더 기반 버전 관리 (X-API-VERSION)

📢 방식:
HTTP 요청 헤더를 이용하여 버전을 관리

@RestController
@RequestMapping("/api/header")
public class HeaderController {
    @GetMapping(headers = "X-API-VERSION=1")
    public String getHeaderV1() {
        return "header v1";
    }

    @GetMapping(headers = "X-API-VERSION=2")
    public String getHeaderV2() {
        return "header v2";
    }
}

 

📌 장점:
✅ URL이 변경되지 않아 깔끔함
✅ 클라이언트가 API 버전을 쉽게 변경할 수 있음

❌ 단점:
⚠️ 브라우저에서 직접 호출이 어려움
⚠️ API 문서화가 필수적

 

🎥 동작확인

header v1
header v2


4. 미디어 타입 기반 버전 관리 (Accept 헤더 사용)

📢 방식:
클라이언트가 Accept 헤더에 버전을 포함하여 요청

@RestController
@RequestMapping("/api/accept")
public class AcceptController {
    @GetMapping(produces = "application/vnd.company.app-v1+json")
    public String getAcceptV1() {
        return "accept v1";
    }

    @GetMapping(produces = "application/vnd.company.app-v2+json")
    public String getAcceptV2() {
        return "accept v2";
    }
}

 

📌 장점:
✅ RESTful 원칙을 따름
✅ API 응답 포맷을 쉽게 확장 가능

❌ 단점:
⚠️ API Gateway에서 미디어 타입 기반 라우팅이 필요함
⚠️ 클라이언트에서 별도의 설정이 필요함

 

🎥 동작확인

accept v1
accept v2


📊 실제로 많이 쓰는 API 버전 관리 방식은?

버전 관리 방식실무 활용도주요 사용 사례

URL 경로 기반 ⭐⭐⭐⭐⭐ RESTful API, 외부 공개 API
요청 파라미터 기반 ⭐⭐⭐ 일부 클라이언트 선택 가능 API
헤더 기반 ⭐⭐⭐⭐ 내부 API, 보안이 중요한 API
미디어 타입 기반 ⭐⭐ RESTful 원칙을 엄격하게 따를 때

✅ 결론:
실무에서는 URL 경로 기반 (/api/v1/) 방식이 가장 많이 사용됩니다.
내부 API에서는 헤더 기반 (X-API-VERSION) 방식도 고려할 수 있습니다.


🚀 마무리

API 버전 관리는 서비스 확장성을 위해 필수적인 요소입니다.
📌 실무에서 권장하는 API 버전 관리 방식:
✔ URL 기반 → 외부 API에 가장 적합
✔ 헤더 기반 → 내부 API 관리에 유리

'spring' 카테고리의 다른 글
  • [Spring]파일 업로드 하기
  • [Spring] 이벤트 시스템으로 느슨한 결합 구현하기
  • [Spring] 날짜/시간 처리하기 (@DateTimeFormat vs @JsonFormat)
  • [Spring] DTO 유효성 검사(Validation) : @Valid로 처리하기
당훈이
당훈이
당훈이 님의 블로그 입니다.
  • 당훈이
    당훈IT
    당훈이
  • 전체
    오늘
    어제
    • 분류 전체보기 (40)
      • spring (7)
      • vue.js (8)
      • docker (1)
      • javascript (1)
      • aws (21)
      • database (1)
        • oracle (1)
      • nuxt (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    nuxt vue
    aws route53
    EC2
    ec2 nodejs
    spring boot
    AWS
    nuxt usefetch
    ec2 domain
    vue3
    aws 스프링
    aws spring
    스프링 배포
    nuxt dedupe
    AWS ELB
    nodejs 배포
    aws dns
    ec2 route53
    ec2 spring 배포
    중복요청
    스프링
    elb
    AWS EC2
    nuxt cache
    route53
    스프링부트
    Spring
    배포
    aws domain
    nuxt fetch
    Vue
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
당훈이
[Spring]REST API 버전 관리 방법
상단으로

티스토리툴바