배경 및 목표
대규모 기능 개발 시 코드를 누적하여 한번에 배포하는 방식이었습니다. 롤백 시 모든 코드를 되돌려야 하여 포인트 설정이 어려웠고, 전체를 복사 후 작업하여 중복 코드가 다량 발생했습니다.
목표
- 코드 배포와 기능 활성화를 분리해 배포 리스크를 최소화한다.
- 문제 발생 시 엔드포인트 전환만으로 즉시 롤백 가능하게 한다.
해결 방법과 해결 후보군
후보군 비교
| 방식 | 설명 | 한계 |
|---|---|---|
| 코드 누적 후 일괄 배포 | 기능 완성 후 한 번에 | 롤백 어려움, 중복 코드 누적 |
| 장기 feature 브랜치 | 브랜치에서 개발 유지 | 머지 충돌, 배포 지연 |
| API 버저닝 + 플래그 (채택) | 배포와 릴리스 분리 | 수시 배포, 엔드포인트 전환으로 즉시 롤백 |
1. 배포와 릴리스 분리
문제의 근본은 코드 배포와 기능 활성화가 묶여 있다는 점이었습니다. API 엔드포인트를 버전별로 분리(/api/v1, /api/v2)하고, 서비스 레이어에서 플래그 값으로 분기 처리하는 구조를 만들었습니다.
@Service
class ResourceService {
fun process(request: Request, isNewFeature: Boolean): Response {
return if (isNewFeature) {
processV2(request) // 신규 로직
} else {
processV1(request) // 기존 로직
}
}
}코드는 언제든 배포할 수 있지만, 기능은 플래그를 켜야만 활성화됩니다.
2. 점진적 배포 프로세스
sequenceDiagram participant Dev as 개발 participant Prod as 운영 Note over Dev,Prod: 정규 배포 전 Dev->>Prod: 수시 배포 (플래그 OFF) Note over Prod: 구버전 로직 동작 Note over Dev,Prod: 정규 배포 시점 Dev->>Prod: API 버전 전환 (플래그 ON) Note over Prod: 신규 로직 전환 Note over Dev,Prod: 문제 발생 시 Prod->>Prod: 엔드포인트 v1 복구 → 즉시 롤백
- 정규 배포 전: 플래그 OFF 상태로 수시 배포. 운영에 코드가 존재하지만 동작하지 않아 배포 리스크 최소화
- 정규 배포 시점: 클라이언트 호출을 v2로 전환하면 신규 로직 활성화
- 문제 발생 시: 엔드포인트만 v1으로 복구하면 즉시 롤백
결과
| 지표 | 결과 |
|---|---|
| 중복 코드 | 80% 제거 |
| 롤백 | 엔드포인트 전환으로 즉시 |
| 배포 방식 | 수시 배포 가능 |
모니터링
- 플래그 ON/OFF 전후 v1/v2 엔드포인트 호출 비율·에러율을 관측한다.
- 전환 직후 신규 로직의 에러율 급증 여부를 관측한다.