ν‹°μŠ€ν† λ¦¬ λ·°

λ°˜μ‘ν˜•

🧬 NestJS API Versioning – μ•ˆμ •μ μΈ μ„œλΉ„μŠ€ ν™•μž₯을 μœ„ν•œ 버저닝 μ „λž΅


NestJSλŠ” API 버전 관리(versioning) κΈ°λŠ₯을 κ³΅μ‹μ μœΌλ‘œ μ§€μ›ν•˜μ—¬,
μ„œλΉ„μŠ€ 쀑단 없이 μƒˆλ‘œμš΄ API 버전을 λ„μž…ν•˜κ±°λ‚˜, κ΅¬λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„ μœ μ§€ν•  수 μžˆλ„λ‘ λ•μŠ΅λ‹ˆλ‹€.
이번 글은 NestJS 곡식 λ¬Έμ„œ Versioning을 λ°”νƒ•μœΌλ‘œ
URL, 헀더, λ―Έλ””μ–΄ νƒ€μž…, μ»€μŠ€ν…€ μ „λž΅μ„ ν†΅ν•œ API 버저닝 μ „λž΅μ„ 싀무 μ€‘μ‹¬μœΌλ‘œ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ “λ²„μ „κ΄€λ¦¬λŠ” μ„±μž₯ν•˜λŠ” μ„œλΉ„μŠ€μ—μ„œ ν•„μˆ˜μž…λ‹ˆλ‹€. V1 → V2둜 APIλ₯Ό μ§„ν™”μ‹œν‚€λ©΄μ„œλ„ ꡬ μ‚¬μš©μžμ—κ²Œ ν˜Όλž€μ„ μ£Όμ§€ λ§ˆμ„Έμš”!”


βœ… 1. μ „μ—­ 버전 μ „λž΅ ν™œμ„±ν™”

// main.ts
import { VersioningType } from '@nestjs/common';

const app = await NestFactory.create(AppModule);

app.enableVersioning({
  type: VersioningType.URI, // or HEADER, MEDIA_TYPE, CUSTOM
});

πŸ”’ 2. URI 방식 – κ°€μž₯ λͺ…ν™•ν•˜κ³  널리 μ‚¬μš©λ¨

 

@Controller({ path: 'cats', version: '1' })
export class CatsControllerV1 {
  @Get()
  findAll() {
    return 'This is version 1';
  }
}

@Controller({ path: 'cats', version: '2' })
export class CatsControllerV2 {
  @Get()
  findAll() {
    return 'This is version 2';
  }
}

μš”μ²­ μ˜ˆμ‹œ

GET /v1/cats
GET /v2/cats

β˜‘οΈ RESTfulν•œ μ„œλΉ„μŠ€μ—μ„œλŠ” κ°€μž₯ 직관적이고 λ¬Έμ„œν™”λ„ 쉬움


🧠 3. Header 방식 – ν΄λΌμ΄μ–ΈνŠΈμ— λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘

app.enableVersioning({
  type: VersioningType.HEADER,
  header: 'x-api-version',
});
@Controller({ path: 'cats', version: '1' })

μš”μ²­ μ˜ˆμ‹œ

GET /cats
Headers: { x-api-version: 1 }

β˜‘οΈ μ›Ή μ•±, λͺ¨λ°”일 μ•±μ—μ„œ ν—€λ”λ‘œ μ „μ†‘ν•˜λŠ” 경우 μœ λ¦¬ν•¨
❗ API ν…ŒμŠ€νŠΈ/λ¬Έμ„œν™”λŠ” λ³΅μž‘ν•΄μ§ˆ 수 있음


<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-XXXXXX"
     data-ad-slot="YYYYYY"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>

πŸ§ͺ 4. Media Type 방식 (Accept 헀더 μ‚¬μš©)

app.enableVersioning({
  type: VersioningType.MEDIA_TYPE,
});
@Controller({ path: 'cats', version: '1' })

μš”μ²­ μ˜ˆμ‹œ

GET /cats
Headers: Accept: application/vnd.api+json;version=1

β˜‘οΈ GraphQL, REST HAL, JSON API λ“±μ—μ„œ μ‚¬μš©
❗ κ΅¬ν˜„ λ‚œμ΄λ„μ™€ ν…ŒμŠ€νŠΈ λ³΅μž‘λ„λŠ” μƒλŒ€μ μœΌλ‘œ λ†’μŒ


🧩 5. Custom μ „λž΅λ„ 지원됨

app.enableVersioning({
  type: VersioningType.CUSTOM,
  extractor: (request: Request) => {
    return request.headers['custom-version'] as string;
  },
});

β˜‘οΈ μš”μ²­μ˜ cookies, query, headers, params λ“± μ–΄λ””μ„œλ“  버전 μΆ”μΆœ κ°€λŠ₯


βœ… 6. λ©”μ„œλ“œ λ ˆλ²¨μ—μ„œ 버전 섀정도 κ°€λŠ₯

@Controller('cats')
export class CatsController {
  @Get()
  @Version('1')
  getV1() {
    return 'v1';
  }

  @Get()
  @Version('2')
  getV2() {
    return 'v2';
  }
}

β˜‘οΈ ν•˜λ‚˜μ˜ 컨트둀러 λ‚΄μ—μ„œ 닀쀑 버전을 κ³΅μ‘΄μ‹œν‚¬ 수 μžˆλŠ” 방식


🧠 싀무 μ „λž΅ μš”μ•½

버전 μ „λž΅ μ„€λͺ… μž₯점 단점

URI /v1/cats, /v2/cats 직관적, λ¬Έμ„œν™” 쉬움 경둜 λ³€κ²½μœΌλ‘œ λΌμš°νŒ… 증가
HEADER x-api-version URL 일관성 μœ μ§€ ν…ŒμŠ€νŠΈ/λ¬Έμ„œν™” λ²ˆκ±°λ‘œμ›€
MEDIA_TYPE Accept: ...;version=1 포맷 기반 API에 유리 λ‚œμ΄λ„ λ†’μŒ
CUSTOM μΏ ν‚€, 쿼리 λ“± μ»€μŠ€ν…€ μœ μ—°μ„± 졜고 μœ μ§€λ³΄μˆ˜ 볡작

πŸ“Œ 싀무 팁

  • 버전 증가 μ‹œ λͺ…ν™•ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ λ¬Έμ„œ 제곡 ν•„μˆ˜
  • Swagger 연동 μ‹œ version별 κ·Έλ£Ήν™”λ₯Ό 톡해 λ¬Έμ„œν™” ꢌμž₯
  • VersioningType.URI + @Version() 쑰합은 ν™•μž₯μ„±κ³Ό 관리에 맀우 유리

 

NestJS API Versioning,NestJS 버전 관리,NestJS REST API 버전,NestJS Header 기반 버전,NestJS Custom Version,NestJS Media Type 버전,NestJS URI 버저닝,NestJS Versioning μ „λž΅,NestJS Swagger 버전 λ¬Έμ„œν™”,NestJS 싀무 API ꡬ쑰


 

β€» 이 ν¬μŠ€νŒ…μ€ 쿠팑 νŒŒνŠΈλ„ˆμŠ€ ν™œλ™μ˜ μΌν™˜μœΌλ‘œ, 이에 λ”°λ₯Έ μΌμ •μ•‘μ˜ 수수료λ₯Ό μ œκ³΅λ°›μŠ΅λ‹ˆλ‹€.
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/06   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
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
κΈ€ 보관함
λ°˜μ‘ν˜•