Git 주니어 시스템 설계 면접
새 면접Q. 5명의 개발자가 동시에 작업하는 웹 서비스 프로젝트에서 Git 브랜치 전략을 설계해야 합니다. 프로젝트는 2주마다 정기 배포를 하며, 긴급 버그 수정도 자주 발생합니다. 어떤 브랜치 구조를 설계하시겠습니까? 각 브랜치의 역할과 머지 규칙을 포함해서 설명해주세요.
main(프로덕션), develop(개발 통합), feature/기능명(개발자별 작업), release/버전명(배포 준비), hotfix/이슈명(긴급 수정) 브랜치를 운영합니다. feature는 develop에서 분기하여 작업 후 develop으로 머지하고, release는 develop에서 분기하여 QA 후 main과 develop에 모두 머지합니다. hotfix는 main에서 분기하여 수정 후 main과 develop 양쪽에 머지합니다. 모든 머지는 Pull Request를 통해 코드 리뷰 후 진행하며, main과 develop은 직접 push를 금지합니다.
- • 5개 브랜치 타입(main, develop, feature, release, hotfix)의 명확한 역할 분리
- • 브랜치 분기 및 머지 규칙 정의(어디서 분기하고 어디로 머지하는지)
- • 코드 리뷰 프로세스와 보호 브랜치 설정
- • 정기 배포와 긴급 배포를 구분하는 워크플로우
만약 팀 규모가 20명으로 늘어나고 여러 기능을 병렬로 개발해야 한다면, 이 브랜치 전략을 어떻게 수정하시겠습니까?
Q. 마이크로서비스 아키텍처로 구성된 프로젝트에서 Git 저장소를 설계해야 합니다. API 서버, 프론트엔드, 모바일 앱, 공통 라이브러리 4개의 컴포넌트가 있습니다. 모노레포(Monorepo)와 멀티레포(Multi-repo) 중 어떤 방식을 선택하시겠습니까? 선택한 방식의 장점과 관리 방법을 설명해주세요.
멀티레포 방식을 선택하여 각 컴포넌트를 독립적인 저장소로 분리합니다. API 서버, 프론트엔드, 모바일 앱은 각각 독립적인 배포 주기를 가지므로 별도 저장소로 관리하고, 공통 라이브러리는 npm/maven 패키지로 배포하여 버전 관리합니다. 각 저장소는 독립적인 CI/CD 파이프라인을 가지며, 공통 라이브러리 업데이트 시 각 서비스에서 의존성 버전을 명시적으로 업그레이드합니다. 저장소 간 코드 공유가 필요한 경우 Git submodule이나 패키지 매니저를 활용합니다.
- • 멀티레포 선택 이유: 독립적인 배포 주기와 팀 자율성
- • 공통 라이브러리의 패키지화 및 버전 관리 전략
- • 각 저장소의 독립적인 CI/CD 구성
- • 저장소 간 의존성 관리 방법(submodule, 패키지 매니저)
만약 모노레포 방식을 선택했다면 어떤 장점이 있고, 어떤 도구를 사용해서 관리하시겠습니까?
Q. Git 저장소에서 버전 관리와 릴리즈 노트 자동화 시스템을 설계해야 합니다. 커밋 메시지를 기반으로 자동으로 버전을 올리고 릴리즈 노트를 생성하려고 합니다. 어떤 방식으로 설계하시겠습니까? 커밋 메시지 규칙, 버전 관리 전략, 자동화 프로세스를 포함해서 설명해주세요.
Conventional Commits 규칙을 사용하여 커밋 메시지를 feat(기능 추가), fix(버그 수정), docs(문서), chore(기타) 등으로 분류합니다. Semantic Versioning(MAJOR.MINOR.PATCH)을 적용하여 feat는 MINOR 버전을, fix는 PATCH 버전을 올립니다. main 브랜치에 머지될 때 GitHub Actions나 GitLab CI를 통해 커밋 메시지를 파싱하고, 자동으로 버전 태그를 생성하며, 해당 버전의 모든 커밋을 분류하여 CHANGELOG.md 파일을 업데이트합니다. 릴리즈 노트는 GitHub Release 기능을 통해 자동으로 발행합니다.
- • Conventional Commits 규칙으로 커밋 메시지 표준화
- • Semantic Versioning 적용 및 자동 버전 증가 로직
- • CI/CD 파이프라인을 통한 자동화 프로세스
- • CHANGELOG.md 생성 및 GitHub Release 자동 발행
만약 개발자가 Conventional Commits 규칙을 지키지 않으면 어떻게 강제할 수 있을까요?
Q. 오픈소스 프로젝트의 기여자 관리 시스템을 Git 기반으로 설계해야 합니다. 외부 기여자의 코드를 안전하게 검토하고 머지하는 프로세스를 설계하세요. 권한 관리, 코드 리뷰 프로세스, 자동화된 검증 단계를 포함해서 설명해주세요.
외부 기여자는 fork를 통해 자신의 저장소에서 작업하고 Pull Request를 생성하도록 합니다. PR이 생성되면 자동으로 CI가 실행되어 코드 스타일 검사(linter), 테스트, 빌드를 수행하고 결과를 PR에 표시합니다. 메인테이너만 머지 권한을 가지며, 최소 1명 이상의 코드 리뷰 승인이 필요하도록 설정합니다. PR 템플릿을 제공하여 기여자가 변경 내용, 테스트 결과, 관련 이슈를 명확히 작성하도록 하고, CONTRIBUTING.md 문서로 기여 가이드를 제공합니다. 승인된 PR은 squash merge로 커밋 히스토리를 정리하여 main 브랜치에 머지합니다.
- • fork 기반 외부 기여 워크플로우와 권한 분리
- • 자동화된 CI 검증(린트, 테스트, 빌드)
- • 코드 리뷰 승인 요구사항 및 브랜치 보호 규칙
- • PR 템플릿과 기여 가이드 문서 제공
악의적인 코드나 보안 취약점이 포함된 PR을 방지하기 위해 어떤 추가 안전장치를 마련하시겠습니까?
Q. 중요한 프로젝트의 Git 저장소에 대한 백업 및 재해 복구 전략을 설계해야 합니다. GitHub나 GitLab 같은 원격 저장소 서비스가 장애를 겪거나, 실수로 중요한 데이터가 삭제되는 상황에 대비해야 합니다. 어떤 백업 전략과 복구 절차를 수립하시겠습니까?
주 저장소(GitHub)와 미러 저장소(GitLab, Bitbucket 등) 2곳 이상에 동기화하여 다중화합니다. 매일 자동으로 bare clone을 생성하여 별도 스토리지(S3, NAS)에 보관하고, 최소 30일간의 백업 이력을 유지합니다. 중요 브랜치(main, develop)는 force push를 금지하고, 삭제된 브랜치도 30일간 보관하는 정책을 설정합니다. 재해 발생 시 미러 저장소나 백업에서 복구하며, git reflog와 git fsck를 활용하여 삭제된 커밋을 복구합니다. 복구 절차를 문서화하고 분기별로 복구 훈련을 실시합니다.
- • 다중 원격 저장소를 통한 실시간 미러링
- • 정기적인 bare clone 백업 및 보관 주기 관리
- • 브랜치 보호 정책 및 삭제 방지 규칙
- • 복구 절차 문서화 및 정기적인 복구 훈련
만약 실수로 민감한 정보가 포함된 커밋이 여러 브랜치에 퍼진 상태에서 이를 완전히 제거해야 한다면 어떻게 하시겠습니까?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!