migration · git:20260826.34a9b20 · 2026-08-26 · sha256 06583649b43703bb
migration git:20260826.34a9b20A
Immutable. This exact content is served forever at /api/v1/blob/06583649b43703bb.
---
name: migration
description: 언어/프레임워크 버전 업그레이드 및 코드 마이그레이션 전략
compatibility: omp
---
# Migration Skill
언어, 프레임워크, 라이브러리 버전 업그레이드를 안전하게 수행하는 스킬입니다.
## 마이그레이션 프로세스
### 1단계: 영향 분석
```bash
# Go 모듈 의존성 확인
go list -m -u all # 업데이트 가능한 모듈 목록
go mod graph # 의존성 그래프
# 브레이킹 체인지 확인
# 릴리스 노트, CHANGELOG, migration guide 확인
```
분석 항목:
- 제거된 API (removed/deprecated)
- 시그니처 변경 (parameter/return type)
- 동작 변경 (behavior change)
- 새 필수 설정 (required config)
### 2단계: 호환성 테스트
```bash
# 현재 테스트 전체 통과 확인 (기준선)
go test -race ./...
# 버전 업그레이드
go get -u github.com/pkg@v2.0.0
go mod tidy
# 컴파일 에러 확인
go build ./...
# 테스트 재실행
go test -race ./...
```
### 3단계: 점진적 마이그레이션
**소규모 변경 (1-2개 API 변경):**
- 직접 수정 후 커밋
**중규모 변경 (5-10개 파일):**
- 호환 레이어 작성 → 사용처 변경 → 호환 레이어 제거
- 각 단계별 커밋
**대규모 변경 (메이저 버전):**
- Branch by Abstraction 패턴 적용
- 피처 플래그로 점진적 전환
### 4단계: 검증
```bash
go test -race ./...
go vet ./...
golangci-lint run
```
## Go 버전 업그레이드
### go.mod 업데이트
```bash
# Go 버전 변경
go mod edit -go=1.23
# 새 기능 활용 가능 여부 확인
go build ./...
go test ./...
```
### 주요 버전별 변경 사항 확인
- 새 표준 라이브러리 함수
- 삭제/변경된 동작
- 새 린트 규칙
## 의존성 업그레이드 전략
### 안전한 순서
```
1. 패치 버전 업그레이드 (1.2.3 → 1.2.4) — 버그 수정
2. 마이너 버전 업그레이드 (1.2.x → 1.3.0) — 하위 호환 기능 추가
3. 메이저 버전 업그레이드 (v1 → v2) — 브레이킹 체인지 가능
```
### Dependabot / Renovate 활용
```yaml
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: gomod
directory: /
schedule:
interval: weekly
reviewers:
- team/backend
```
## 브레이킹 체인지 대응 패턴
### Adapter Pattern
```go
// 구 API를 새 API로 래핑
type LegacyAdapter struct {
newClient *NewClient
}
func (a *LegacyAdapter) OldMethod(args OldArgs) OldResult {
newArgs := convertArgs(args)
newResult := a.newClient.NewMethod(newArgs)
return convertResult(newResult)
}
```
### Feature Flag
```go
func handler(w http.ResponseWriter, r *http.Request) {
if config.UseNewAPI {
newHandler(w, r)
} else {
oldHandler(w, r)
}
}
```
### Parallel Run (Shadow Traffic)
```go
func handler(w http.ResponseWriter, r *http.Request) {
oldResult := oldHandler(r)
// 백그라운드에서 새 구현 실행 (비교용)
go func() {
newResult := newHandler(r)
compareResults(oldResult, newResult)
}()
respond(w, oldResult) // 구 결과 반환
}
```
## 마이그레이션 체크리스트
- [ ] 릴리스 노트/마이그레이션 가이드 확인
- [ ] 영향받는 파일 목록 작성
- [ ] 기준선 테스트 통과 확인
- [ ] 점진적 마이그레이션 (한 번에 전체 변경 금지)
- [ ] 각 단계 후 테스트 실행
- [ ] 롤백 계획 수립
- [ ] 호환 레이어 정리 (마이그레이션 완료 후)