Architecture

멀티레포에서
모노레포로

지속적으로 증가하는 컴포넌트 라이브러리의 유지보수 비용과 개발 효율성 저하 문제를 해결하기 위해,
26년도 연구 과제로 지정하며 105개의 컴포넌트 라이브러리를
멀티레포에서 모노레포로 전환한 과정과 결과를 공유합니다.

역할

프론트엔드 개발자

기간

2025년 12월 ~ 현재

부서 / 직급

개발센터 / 전임(대리)

Problem

어떤 문제가 있었죠?

01

내부 구조 노출

전역 스타일, 폰트, 사내 아이콘 등 공통 자산을 사용하기 위해 개별 모듈에서 라이브러리의 빌드 결과물인 "dist" 내부 경로에 직접 접근하고 있었습니다. 이는 라이브러리의 내부 폴더 구조가 변경될 때마다 참조 경로가 깨질 위험이 컸으며, 모듈 간의 강한 결합도를 유발했습니다.

02

트리쉐이킹 미지원

105개의 컴포넌트 전체가 하나의 번들로 묶여 불필요한 코드까지 포함됐습니다. 특정 모듈에서 단 15개의 컴포넌트만 사용하더라도 105개 전체 구성 요소와 연관 의존성을 모두 설치해야 했습니다.

03

의존성 버전 파편화

특정 버전부턴 멀티레포가 React 19로 업그레이드되면서 React 18 기반의 모듈들은 최신 컴포넌트를 사용할 수 없었습니다. 결국 버그 수정이나 기능 추가를 위해 과거 버전 브랜치를 별도로 유지하며 수동 배포를 반복해야 했습니다.

Overview

무엇이
달라졌죠?

Yarn Workspaces를 기반으로 모노레포를 선언하고, 캐싱이 지원되는 Nx로 빌드를 최적화했습니다. 버전 변경 이력 관리를 위해 Changesets을 도입해 릴리즈 프로세스를 체계화했습니다.

의존성 구조 변화

BEFORE — 멀티레포

@sprrow/components

단일 번들 · 트리쉐이킹 없음

v0.9.x

React 18

v1.0.x

React 19

서버 매니저

React 18

v0.9.123-compact

GUI

React 18

v0.9.123-compact

엔터프라이즈

React 19

v1.0.200

플러그인

React 19

v1.0.200

버전 분리 관리 · 버그 수정 2중 배포

AFTER — 모노레포

@sp/monorepo

Yarn Workspaces · Nx · Changesets

atoms

공용

molecules

공용

organisms

공용

layout

공용

peerDependencies로 버전 위임

서버 매니저

React 18

GUI

React 18

엔터프라이즈

React 19

플러그인

React 19

단일 소스 · React 버전 충돌 해소
트리쉐이킹 적용 · Parsed size −250KB

Process

전환 여정기

STEP 01

인프라 및 폴더 구조 수립

Yarn Workspaces 기반 모노레포 환경을 선언하고, 빌드 성능 최적화를 위한 Nx와 자동화된 버전 관리를 위한 Changesets를 도입했습니다. Atomic Design 원칙을 적용해 atoms / molecules / layout / organisms 구조로 105개 컴포넌트를 재배치했습니다.

Yarn WorkspacesNxChangesetsAtomic Design
STEP 02

유연한 의존성 관리 전략

초기에는 dependencies로 의존성을 설정했으나 Changesets의 '버전 전파' 현상이 라이브러리 사용자가 하나의 컴포넌트를 업데이트할 때마다 의도치 않게 다른 컴포넌트들까지 상위 버전으로 마이그레이션해야 하는 관리 복잡성을 초래할 수 있음을 파악했습니다. 해당 이슈를 파트 내 공유하여 "호스트 모듈에 설치된 라이브러리를 공유하여 사용함으로써 버전 충돌을 방지하고 업데이트 효율을 높이자"는 리더의 기술적 조언을 수용해 peerDependencies에 의존성을 명시하도록 변경해 개별 컴포넌트의 독립적인 배포 유연성을 확보했습니다.

peerDependencies버전 전파 해소팀 협업
STEP 03

시맨틱 버저닝 규칙 수립

컴포넌트의 초기 버전은 1.0.0으로 정의하고, 기능 추가 시 Minor, 버그 수정 시 Patch를 업데이트하는 규칙을 제안 및 시행했습니다. 버전 전파 이슈 방지를 위해 리더와의 기술적 합의를 거쳐 Major 버전을 1.x.x 대에서 관리하는 전략을 채택했습니다.

Semantic VersioningMajor 1.x.x 고정Changesets 자동화
STEP 04

트리쉐이킹으로 번들 최적화

라이브러리 경량화를 위해 ESM 문법 적용, 선택적 import, Rollup의 preserveModules: true, sideEffects: false 설정으로 트리쉐이킹을 구성했습니다. lodash를 lodash-es로 전면 교체하여 실제 사용되는 코드만 번들에 포함되도록 개선했습니다.

ESMpreserveModulessideEffects: falselodash-es
STEP 05

DX 도구 및 가이드라인 제공

새로운 환경 도입 시 동료들이 겪을 수 있는 초기 학습 비용을 최소화하고자 상세한 트러블슈팅 문서와 공유용 기술 가이드를 작성하고, 누락된 peerDependencies를 자동으로 탐색·설치하거나 전체 라이브러리를 한 번에 업데이트하는 커스텀 자동화 스크립트를 배포했습니다.

트러블슈팅 문서자동화 스크립트팀 DX
STEP 06

CI/CD 파이프라인

멀티레포 운영 당시의 로컬 수동 배포 방식은 배포 이력 공유 미흡으로 인한 버전 충돌이 빈번했습니다. GitLab CI/CD를 구축하여 원격 저장소 푸시 시 빌드 및 배포가 자동 수행되도록 개선하고, Discord 웹훅으로 배포 완료 알림을 연동했습니다.

GitLab CI/CDDiscord 웹훅
STEP 07

품질 검증 체계

대규모 리뉴얼 제품의 품질을 보장하기 위해 Playwright를 활용한 시각적 회귀 테스트 환경을 구축했습니다. 모노레포 컴포넌트 적용 전후의 서버 화면을 정밀하게 캡처 및 비교하여 의도치 않은 UI 변경 사항을 사전에 검출하고 안정적인 릴리즈 기반을 마련했습니다.

Playwright시각적 회귀 테스트

Result

번들 사이즈
비교

모노레포 적용 전후, ERB 모듈의 실제 번들 사이즈 변화입니다.

−250KB

Parsed size 감소

Parsed Size−250KB
Before
1040KB
After
790KB
Stat Size−1.80MB
Before
3.31MB
After
1.51MB

Learned

배운 것들

단순히 일감을 받아 결과를 내는 것이 아닌, 과정 속에서 미래를 바라보며 다른 개발자도 내 코드를 손쉽게 이해하고 수정할 수 있도록 만드는 것이 목표였습니다.

불편함을 그냥 넘기지 않기

트리쉐이킹 미지원을 발견했을 때 개선 방법을 찾아 직접 적용했고, 수동 배포로 인한 버전 충돌 문제는 GitLab CI/CD 파이프라인과 Discord 웹훅 알림으로 해결해 배포 안정성을 확보했습니다.

공유와 협업의 힘

파트에 공유하면서 리더님의 한 마디, "명령어 하나로 peerDependencies까지 설치해 주세요"가 초기 설치 비용을 크게 줄였습니다. 또한 버저닝 수립에 대해 동료들과 고민하면서 제품에 맞는 전략을 만들어 낼 수 있었습니다.

문서화는 개발의 일부

내가 겪은 트러블슈팅을 문서로 남기면 다음 사람은 같은 시간을 낭비하지 않습니다. 또한 컨벤션과 적용법을 문서로 남겨서 동료들의 초기 진입 장벽을 낮추는 데도 신경 썼습니다.

Tech Stack

사용한 기술

빌드 & 번들링

Yarn Workspaces

모노레포 선언

Nx

캐싱 기반 빌드

Rollup

컴포넌트 번들링

ESM

트리쉐이킹 지원

릴리즈 관리

Changesets

버전 & 릴리즈 관리

GitLab CI/CD

자동 배포 파이프라인

협업 도구

Notion

파트 내 공유 문서

Jira

다른 부서와 공유

AI & 테스트

Claude Code

AI 코딩 어시스턴트

Playwright

UI 자동화 테스트

✉️ ay052884@gmail.com