일기 slecs

모노레포 전환으로 팀 온보딩과 협업 구조를 개선한 첫 주

목차

모노레포 첫 주. 아무것도 없던 자리에 뼈대를 세운 날이다.


왜 지금 모노레포인가

팀이 커지면서 앱과 패키지가 제각각 흩어져 있는 상황이 눈에 밟히기 시작했다. 공통 컴포넌트를 쓰려면 npm 패키지를 일일이 버전 맞춰서 설치해야 했고, 타입 한 줄 바꾸면 downstream 전체를 직접 쫓아다니며 확인해야 했다. 이 비용이 팀 속도를 조용히 갉아먹고 있었다.

모노레포 전환을 결정한 건 기술적 판단이기도 했지만, 절반은 팀 운영 판단이었다. 새 멤버가 합류했을 때 "이 코드는 어느 레포에 있어요?"를 없애고 싶었다. 온보딩 비용, 컨텍스트 스위칭 비용을 구조로 줄이는 것. 그게 이번 Week 1의 진짜 목표였다.


Week 1에 건드린 파일들

파일 역할 이번 작업에서의 의미
.github/workflows/ci.yml CI 파이프라인 정의 모노레포 첫날부터 CI를 붙인 이유는 명확 — "돌아가는 상태"를 기준선으로 고정하기 위해
.gitignore 추적 제외 목록 모노레포 구조에서는 루트 + 앱별 ignore 정책을 레이어로 나눠야 함
README.md 프로젝트 진입점 문서 팀이 처음 클론했을 때 5분 안에 실행 가능하게 만드는 것이 목표
apps/web/.eslintrc.json 웹 앱 린트 설정 앱 단위로 린트 규칙을 격리하되 루트 config 상속 구조
apps/web/components.json UI 컴포넌트 레지스트리 설정 컴포넌트 시스템 기준을 초기에 못 박아두는 작업
apps/web/next-env.d.ts Next.js 타입 선언 타입 체킹 기준점 — 빠질 경우 팀 전체 TS 경험이 흔들림

숫자로 보면 6개 파일이지만, 이게 "작은 작업"이라고 보면 오산이다. 이 파일들이 앞으로 팀원 전원이 매일 밟고 지나가는 땅이 된다.


CI를 첫날부터 붙인 이유

ci.yml을 Day 1에 커밋한 건 의도적이었다. 인프라 스캐폴딩 단계에서 CI를 미루는 팀을 자주 봤는데, 나중에 붙이려고 하면 그때는 이미 "동작은 하는데 CI가 깨지는" 상태가 누적되어 있다. 처음부터 그린 빌드를 유지하는 습관을 구조로 강제하는 게 낫다.

# ci.yml — 초기 파이프라인 기본 구조 예시
on:
  push:
    branches: [main]
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: pnpm install --frozen-lockfile
      - run: pnpm run build
      - run: pnpm run lint
      - run: pnpm run typecheck

단순해 보여도 이 구조가 의미하는 건 크다. PR 올릴 때마다 lint, typecheck, build 세 관문을 통과해야 머지할 수 있다는 팀 약속이다. 코드리뷰에서 "혹시 빌드 깨지지 않나요?" 같은 확인 코멘트가 사라진다.


스캐폴딩에서 팀장이 직접 해야 하는 것들

솔직히 말하면 이 작업, 팀원에게 넘길 수도 있었다. 하지만 초기 구조 결정은 내가 직접 짰다. 이유가 있다.

  • .eslintrc.json 상속 구조: 루트에서 어디까지 공유하고 앱별로 어디서 갈라지는지를 처음부터 잘못 잡으면 나중에 "이 규칙 왜 있어요?"가 넘친다
  • components.json: UI 컴포넌트 기준을 초기에 못 박지 않으면 앱마다 다른 컴포넌트 시스템이 난립하기 시작한다
  • README.md: 온보딩 문서는 팀장이 직접 쓰는 게 맞다. 설치 명령어보다 "왜 이 구조인지"를 담아야 하기 때문이다
apps/
  web/           Next.js 
packages/
  ui/            공유 컴포넌트
  config/        공유 eslint, tsconfig

이 디렉토리 구조 자체가 팀에게 보내는 메시지다. "공통은 packages에 담고, apps에서는 조립만 해라."


Week 1 회고

기술적으로 화려한 작업은 아니다. 커밋 메시지에도 chore가 붙었다. 그런데 이 커밋이 이후 모든 커밋의 토대가 된다는 걸 팀원들이 알아줬으면 한다.

모노레포 첫 주는 항상 "아무것도 동작하지 않는 상태에서 모든 것을 동작하게 만드는" 구간이다. 이 구간을 빨리, 단단하게 통과하는 게 팀장의 역할이라고 생각한다. 다음 주부터 팀원들이 feature 브랜치를 딸 수 있게, 그 땅을 닦은 한 주였다.


끝.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.