목차
개요
Monorepo 환경에서 개발을 하다 보면 많은 의존성 라이브러리를 관리해야 합니다. 이때, GitHub의 Dependabot을 사용하면 의존성 라이브러리의 업데이트를 자동으로 감지하고 PR을 생성할 수 있습니다.
하지만 Dependabot이 생성하는 PR이 많아지면 어떤 PR을 우선적으로 처리해야 하는지, 어떤 테스트를 수행해야 하는지 판단하기 어려워집니다.
이번 블로그 포스트에서는 Dependabot이 생성한 PR을 효율적으로 처리하기 위한 표준 운영 절차(SOP: Standard Operating Procedure) 에 대해서 알아보겠습니다.
PR 분류
기본 분류 기준
Dependabot PR을 처리하기 위해서는 먼저 해당 라이브러리의 리스크 수준을 파악해야 합니다. 다음 표를 참고하여 라이브러리의 리스크 수준을 분류할 수 있습니다.
| 기준 | 고위험(High Risk) | 중위험(Medium Risk) | 저위험(Low Risk) |
|---|---|---|---|
| 프로덕션(런타임) | O (런타임) | △ (일부 런타임 영향) | X (devDependency) |
| 영향 범위 | 모든 앱 | 특정 기능/앱 | 개발 환경만 |
| 문제 감지 | 수동 테스트 필요 | CI에서 일부 감지 가능 | CI에서 전부 감지 가능 |
| 사용자 영향 | 직접 | 간접 | 없음 |
버전별 리스크 조정
라이브러리의 카테고리와 업데이트될 버전의 유형에 따라 리스크를 조정할 수 있습니다.
| 라이브러리의 카테고리 | Major | Minor | Patch |
|---|---|---|---|
| 고위험(react 등) | 🔴 고 | 🟡 중 | 🟡 중 |
| 중위험 런타임(axios 등) | 🟡 중 | 🟡 중 | 🟢 저 |
| 중위험 CI 감지 가능(vite 등) | 🟡 중 | 🟢 저 | 🟢 저 |
| 저위험 런타임(lodash 등) | 🟡 중 | 🟢 저 | 🟢 저 |
| 저위험 개발 도구(@types 등) | 🟢 저 | 🟢 저 | 🟢 저 |
분류 플로우차트
기본 분류 기준과 버전별 리스크 조정을 사용하여 다음과 같이 플로우차트를 만들 수 있습니다. 이 플로우차를 사용하면 새로운 라이브러리를 추가하거나 Dependabot PR을 검토할 때, 쉽게 분류할 수 있습니다.
새로운 라이브러리 추가
│
▼
┌───────────────────────────────────┐
│ 1. 프로덕션 환경(런타임)에서 사용? │
└───────────────────────────────────┘
│
┌───┴───┐
│ │
Yes No → 저위험(개발 도구)
│
▼
┌───────────────────────────────────┐
│ 2. 모든 앱에 영향? │
└───────────────────────────────────┘
│
┌───┴───┐
│ │
Yes No → 영향 범위 확인
│ │
│ ▼
│ 특정 앱만 → 중위험(런타임)
│ 또는
│ 저위험(런타임)
▼
┌───────────────────────────────────┐
│ 3. CI에서 문제 감지 가능? │
└───────────────────────────────────┘
│
┌───┴───┐
│ │
Yes No → 고위험
│
▼
중위험(CI 감지 가능)
고위험(High Risk)
고위험 라이브러리는 다음과 같은 특징을 가집니다.
- 프로덕션(런타임)에 직접 영향
- 모든 앱에 영향
- 수동 테스트 필요
대상 라이브러리
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| react | Major | UI 프레임워크 코어 | 모든 앱에 영향 |
| react-dom | Major | React DOM 렌더러 | 모든 앱에 영향 |
| @reduxjs/toolkit | Major | 상태 관리 코어 | API 변경 시 모든 앱에 영향 |
| react-redux | Major | Redux 바인딩 | 모든 앱의 상태 관리에 영향 |
| react-router-dom | Major | 라우팅 시스템 | 모든 앱의 네비게이션에 영향 |
처리 방법
- CI 통과 확인(전체 테스트 실행)
- CHANGELOG, Breaking Changes 확인
- 마이그레이션 가이드 확인(해당하는 경우)
- 모든 앱 테스트와 팀 멤버 리뷰
중위험(Medium Risk)
중위험 라이브러리는 다음과 같은 특징을 가집니다.
- 프로덕션(런타임) 부분적 영향
- 빌드(CI)에서 감지 가능
대상 라이브러리
고위험 라이브러리의 Minor, Patch 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| react | Minor, Patch | UI 프레임워크 코어 | 모든 앱에 영향 |
| react-dom | Minor, Patch | React DOM 렌더러 | 모든 앱에 영향 |
| @reduxjs/toolkit | Minor, Patch | 상태 관리 코어 | API 변경 시 모든 앱에 영향 |
| react-redux | Minor, Patch | Redux 바인딩 | 모든 앱의 상태 관리에 영향 |
| react-router-dom | Minor, Patch | 라우팅 시스템 | 모든 앱의 네비게이션에 영향 |
CI 감지 가능(빌드/테스트/린트)의 Major 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| vite | Major | 빌드 도구 | 전체 앱 빌드 |
| typescript | Major | 타입 시스템 | 전체 앱 빌드 |
| @vitejs/plugin-react | Major | Vite React 플러그인 | 전체 앱 빌드 |
| turbo | Major | 모노레포 빌드 도구 | CI/CD |
| jest | Major | 테스트 프레임워크 | 전체 앱 테스트 |
| vitest | Major | 테스트 프레임워크 | 전체 앱 테스트 |
| @playwright/test | Major | E2E 테스트 | E2E 테스트 |
| eslint | Major | 린터 | 코드 품질 체크 |
| @typescript-eslint/* | Major | TypeScript ESLint | 코드 품질 체크 |
| storybook | Major | 컴포넌트 문서 | components 패키지 |
| @storybook/* | Major | Storybook 관련 | components 패키지 |
런타임 영향의 Major, Minor 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| axios | Major, Minor | HTTP 클라이언트 | 전체 앱의 API 호출 |
| i18next | Major, Minor | 다국어 지원 | 전체 앱의 다국어 지원 부분 |
| react-i18next | Major, Minor | React i18n 바인딩 | 전체 앱의 다국어 지원 부분 |
| konva | Major, Minor | Canvas 라이브러리 | 특정 앱만 |
| react-konva | Major, Minor | Konva React 바인딩 | 특정 앱만 |
| recharts | Major, Minor | 차트 라이브러리 | 특정 앱만 |
저위험 런타임 유틸리티의 Major 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| lodash | Major | 유틸리티 | 프로덕션에서 사용 |
| js-cookie | Major | Cookie 유틸리티 | 프로덕션에서 사용 |
| date-fns | Major | 날짜 유틸리티 | 프로덕션에서 사용 |
| clsx | Major | 클래스명 유틸리티 | 프로덕션에서 사용 |
| react-ga4 | Major | Google Analytics | 일부 앱만 |
| qrcode.react | Major | QR 코드 생성 | 특정 앱만 |
| react-hotkeys-hook | Major | 단축키 | 특정 앱만 |
| papaparse | Major | CSV 파싱 | components만 |
처리 방법
- CI 통과 확인(전체 테스트 실행 / 특정 앱 테스트 실행)
- CHANGELOG 확인
- 영향받는 앱 테스트와 팀 멤버 리뷰
yarn why <package> 명령으로 영향받는 앱을 확인할 수 있습니다.
저위험(Low Risk)
저위험 라이브러리는 다음과 같은 특징을 가집니다.
- 개발 도구
- CI에서 직접 감지
- 사용자에게 영향 없음
대상 라이브러리
CI 감지 가능(빌드/테스트/린트)의 Minor, Patch 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| vite | Minor, Patch | 빌드 도구 | 전체 앱 빌드 |
| typescript | Minor, Patch | 타입 시스템 | 전체 앱 빌드 |
| @vitejs/plugin-react | Minor, Patch | Vite React 플러그인 | 전체 앱 빌드 |
| turbo | Minor, Patch | 모노레포 빌드 도구 | CI/CD |
| jest | Minor, Patch | 테스트 프레임워크 | 전체 앱 테스트 |
| vitest | Minor, Patch | 테스트 프레임워크 | 전체 앱 테스트 |
| @playwright/test | Minor, Patch | E2E 테스트 | E2E 테스트 |
| eslint | Minor, Patch | 린터 | 코드 품질 체크 |
| @typescript-eslint/* | Minor, Patch | TypeScript ESLint | 코드 품질 체크 |
| storybook | Minor, Patch | 컴포넌트 문서 | components 패키지 |
| @storybook/* | Minor, Patch | Storybook 관련 | components 패키지 |
런타임 영향의 Patch 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| axios | Patch | HTTP 클라이언트 | 전체 앱의 API 호출 |
| i18next | Patch | 다국어 지원 | 전체 앱의 다국어 지원 부분 |
| react-i18next | Patch | React i18n 바인딩 | 전체 앱의 다국어 지원 부분 |
| konva | Patch | Canvas 라이브러리 | 특정 앱만 |
| react-konva | Patch | Konva React 바인딩 | 특정 앱만 |
| recharts | Patch | 차트 라이브러리 | 특정 앱만 |
순수 개발 도구(전체 버전)
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| @types/* | Major, Minor, Patch | 타입 정의 | 개발 환경만 |
| prettier | Major, Minor, Patch | 코드 포매터 | 개발 환경만 |
| stylelint | Major, Minor, Patch | 스타일 린터 | 개발 환경만 |
| eslint-config-* | Major, Minor, Patch | ESLint 설정 | 개발 환경만 |
| eslint-plugin-* | Major, Minor, Patch | ESLint 플러그인 | 개발 환경만 |
| @testing-library/* | Major, Minor, Patch | 테스트 유틸리티 | 테스트 환경만 |
| ts-jest | Major, Minor, Patch | Jest TypeScript 지원 | 테스트 환경만 |
| @vitest/ui | Major, Minor, Patch | Vitest UI | 테스트 환경만 |
| sass | Major, Minor, Patch | SCSS 컴파일러 | 빌드 환경만 |
| husky | Major, Minor, Patch | Git Hook | 개발 환경만 |
| lint-staged | Major, Minor, Patch | 스테이지 파일 린트 | 개발 환경만 |
| remark-* | Major, Minor, Patch | Markdown 린트 | 개발 환경만 |
| cspell | Major, Minor, Patch | 스펠 체크 | 개발 환경만 |
| chromatic | Major, Minor, Patch | 비주얼 테스트 | components만 |
저위험 런타임 유틸리티의 Minor, Patch 업데이트
| 라이브러리 | 버전 | 설명 | 영향 |
|---|---|---|---|
| lodash | Minor, Patch | 유틸리티 | 프로덕션에서 사용 |
| js-cookie | Minor, Patch | Cookie 유틸리티 | 프로덕션에서 사용 |
| date-fns | Minor, Patch | 날짜 유틸리티 | 프로덕션에서 사용 |
| clsx | Minor, Patch | 클래스명 유틸리티 | 프로덕션에서 사용 |
| react-ga4 | Minor, Patch | Google Analytics | 일부 앱만 |
| qrcode.react | Minor, Patch | QR 코드 생성 | 특정 앱만 |
| react-hotkeys-hook | Minor, Patch | 단축키 | 특정 앱만 |
| papaparse | Minor, Patch | CSV 파싱 | components만 |
처리 방법
- CI 통과 확인
- 자동 할당된 멤버가 리뷰
처리 스케줄
이렇게 분류한 라이브러리의 버전 업데이트의 PR을 효율적으로 처리하기 위해 다음과 같은 주간 스케줄을 만들 수 있습니다.
| 요일 | 작업 |
|---|---|
| 월요일 | Dependabot PR 확인 및 담당자 배정 |
| 화요일~수요일 | 저위험/중위험 PR 머지 |
| 목요일~금요일 | 고위험 PR 검토 및 테스트 |
이 부분은 팀의 상황에 맞게 조정할 수 있습니다.
우선순위 가이드라인
기본적으로 모든 PR을 빠르게 처리하는게 좋지만, 리소스가 부족한 경우 우선순위를 정할 필요가 있습니다. 예를 들어 다음과 같은 가이드라인을 사용하여, 우선순위를 정할 수 있습니다.
- Patch: 5개 이상 누적 시 처리(보안 취약점은 즉시 처리)
- Minor: 2개 이상 누적 시 처리(보안 취약점은 즉시 처리)
- Major: 팀 논의 후 처리
완료
이것으로 Dependabot PR을 효율적으로 처리하기 위한 리스크 분류 기준에 대해서 알아보았습니다.
다음 포스트에서는 이 분류 기준을 바탕으로 Dependabot 설정과 GitHub Actions를 사용한 자동화 방법에 대해서 알아보겠습니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku가 개발한 앱을 한번 사용해보세요.Deku가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.