CI_CD

MSA(Microservices Architecture) 환경에서 Git Submodule과 Git Subtree를 혼합한 하이브리드 방식

ipxy 2025. 3. 20. 11:04
728x90

MSA(Microservices Architecture) 환경에서 Git Submodule과 Git Subtree를 혼합한 하이브리드 방식으로 레포지토리를 운영하는 방법은 공통 라이브러리 및 자주 변경되는 서비스상대적으로 드물게 변경되는 내부 모듈의 특성을 잘 반영하여 구성하는 것이 중요합니다.


🧩 1. MSA 환경에서의 하이브리드 사용 목적

MSA 환경에서 Git 하이브리드를 고려하는 주요 이유:

  • 여러 서비스 간에 공유되는 공통 컴포넌트가 많을 경우 (→ Submodule)
  • 특정 서비스가 별도의 레포지토리로 관리되지만, 하나의 서비스처럼 통합 관리가 필요할 때 (→ Subtree)
  • 여러 서비스가 공통의 일부를 가지면서도 독립적인 빌드 및 배포가 필요할 때 (→ 하이브리드)

📐 2. MSA 환경에서의 Git Submodule과 Subtree 역할 정의

 

구분  추천 활용법  활용법 
Git Submodule 공유 라이브러리, API 정의 및 인터페이스 레이어 독립적으로 관리되며, 빈번하게 변경되는 공통 컴포넌트에 적합
Git Subtree 서비스 간의 공유된 특정 로직, 내부 모듈, 배포 및 히스토리의 통합이 중요한 서비스 주 레포의 일부처럼 관리되어 복잡성을 줄이며, 주기적이고 드문 빈도로 변경될 때 효과적

🔗 3. MSA 하이브리드 Git 운영의 실전 사례 및 구조 예시

다음과 같이 MSA 환경에서 하이브리드 레포지토리를 구성할 수 있습니다.

MSA-Project (Main Monorepo or Multi-repo)
├── common-api/             [Submodule]   # 공유되는 API 인터페이스
├── common-auth-lib/        [Submodule]   # 인증/인가 공통 라이브러리
├── common-logging-lib/     [Submodule]   # 공통 로깅 모듈 (빈번 업데이트)
│
├── services/
│   ├── order-service/
│   │   ├── src/...
│   │   └── libs/payment-module/ [Subtree] # 드물게 업데이트되는 지불모듈
│   │
│   └── payment-service/
│       ├── src/...
│       └── libs/fraud-detection-module/ [Subtree] # 부정 탐지 모듈
│
└── frontend/
    └── web-app/ [Subtree or Independent Repo]
  • Submodule: 모든 서비스에서 참조하는 공통적인 API 정의 및 인증/인가, 로깅 모듈을 관리합니다.
  • Subtree: 서비스 내에서 독립적이지만 자주 변경되지 않고, 서비스와 밀접한 모듈을 관리합니다.

🚩 4. MSA 환경에서의 Submodule 활용 방법

① 공통 모듈을 Submodule로 등록

# API 정의 모듈 등록
git submodule add https://gitlab.com/your-org/common-api.git common-api

# Submodule 초기화 및 업데이트
git submodule init
git submodule update --remote

② CI/CD 환경에서의 Submodule 사용법 (예: Jenkins, GitLab CI)

# GitLab CI/CD 예제 (.gitlab-ci.yml)
stages:
  - build

build_order_service:
  stage: build
  script:
    - git submodule update --init --recursive
    - ./gradlew :services:order-service:build
  • Submodule은 각 서비스 빌드 시마다 최신 커밋을 참조하거나 특정 태그를 사용하여 관리할 수 있습니다.

🚩 5. MSA 환경에서의 Subtree 활용 방법

① Subtree로 하위 모듈 추가

# payment-module을 Subtree로 등록
git subtree add --prefix=services/order-service/libs/payment-module \
  https://gitlab.com/your-org/payment-module.git main --squash

② Subtree 업데이트

# 최신 변경사항을 주기적으로 가져오기
git subtree pull --prefix=services/order-service/libs/payment-module \
  https://gitlab.com/your-org/payment-module.git main --squash
  • Subtree는 서비스 코드의 일부로 통합되므로 별도 작업 없이 자동으로 빌드됩니다.
  • 서비스 변경 사항과 함께 Subtree의 변경사항도 기록됩니다.

🔍 6. MSA 환경에서 하이브리드 운영을 위한 Best Practices

✅ 권장사항

  • Submodule은 빈번히 변경되는 공통 라이브러리 또는 API 관리에 사용하세요.
  • Subtree는 서비스 내 모듈로 통합되어 관리되는 코드에 사용하세요.
  • CI/CD 환경에서 Submodule 업데이트를 위한 프로세스를 명확히 정의하세요.

❌ 주의사항

  • Submodule은 개별적으로 별도 관리가 필수이므로 관리 비용이 높아질 수 있습니다.
  • Subtree를 너무 자주 업데이트하면 주 레포의 히스토리가 복잡해질 수 있습니다.

🛠️ 7. 실무에서 추천하는 MSA Git 하이브리드 활용 전략

다음과 같은 전략을 권장합니다.

MSA 레포지토리 관리 전략  사용 방법 이유
Submodule 중심 공통 API, 인증 라이브러리 등 자주 업데이트 필요 시 독립적 관리와 신속한 변경사항 반영
Subtree 중심 서비스 내부 통합 관리가 중요하고 상대적으로 변경 빈도가 낮은 모듈 통합된 히스토리로 관리 간소화
하이브리드 병행 두 가지 유형의 코드를 적절히 혼합하여 운영 필요 시 유지보수성 및 히스토리 관리 최적화

🎯 최종 추천 구성법

**"공통성"**과 **"변경 빈도"**를 기준으로 선택:

  • 높은 공통성 + 높은 변경 빈도 → Submodule
  • 높은 공통성 + 낮은 변경 빈도 → Subtree
  • 낮은 공통성 + 독립성 강함 → 별도 레포로 운영

이를 통해 MSA 환경의 특성을 최대한 활용하면서 관리 복잡성을 낮출 수 있습니다.

728x90