5개의 PHP 악몽에서 1개의 Node 파이프라인으로: 왜 지루한 표준화가 나의 가장 위대한 업적인가
요약
서로 다른 빌드 도구와 배포 방식을 가진 5개의 레거시 PHP 프론트엔드를 표준 Node.js 파이프라인으로 통합한 사례를 다룹니다. 표준화를 통해 개발자 온보딩 기간을 1주일에서 1일로 단축하며 운영 효율성을 극대화했습니다.
핵심 포인트
- 파편화된 레거시 시스템은 개발 비용과 온보딩 시간을 증가시킴
- 표준화된 빌드 및 배포 프로세스는 팀의 생산성을 비약적으로 향상함
- Express, React, Vite, GitHub Actions를 활용한 현대적 스택으로 통합
- 개별 프로젝트의 특이성보다 시스템의 일관성이 비즈니스에 더 유리함
요약(TL;DR): 저는 5개의 레거시(Legacy) PHP 프론트엔드를 우리의 표준 Node 파이프라인으로 마이그레이션(Migration)했습니다. 온보딩(Onboarding) 기간이 1주일에서 1일로 단축되었습니다. 왜 "지루함"이 사실 팀을 위해 할 수 있는 가장 흥미로운 일인지 그 이유를 소개합니다.
고백
저는 표준화를 싫어했습니다.
저는 모든 프로젝트가 자신만의 독특한 맛을 가져야 한다고 생각하는 개발자였습니다. 서로 다른 빌드 도구(Build tools)? 물론이죠. 서로 다른 폴더 구조(Folder structures)? 안 될 거 없죠. 서로 다른 배포 스크립트(Deployment scripts)? 그래야 재미있지 않겠어요?
틀렸습니다.
지난 분기, 저는 5개의 레거시(Legacy) PHP 프론트엔드를 물려받았습니다. 그것들은 모두 서로 다른 팀에 의해, 서로 다른 연도에, 서로 다른 수준의 카페인 유발 광기 속에서 구축되었습니다. 모두 동일한 비즈니스 목적을 수행하고 있었지만, 마치 5개의 서로 다른 언어로 작성된 것과 다름없었습니다.
제가 발견한 내용은 다음과 같습니다:
| 앱 | PHP 버전 | 빌드 도구 (Build Tool) | 배포 방식 (Deployment Method) | 개발자의 눈물 |
|---|---|---|---|---|
| 앱 A | 5.6 | 없음 (FTP) | 수동 드래그 앤 드롭 | 높음 |
| 앱 B | 7.0 | Gulp | SSH + 커스텀 bash | 매우 높음 |
| 앱 C | 7.4 | Composer | Jenkins (고장 남) | 극심함 |
| 앱 D | 8.0 | Webpack (어느 정도) | Kubernetes (어느 정도) | 보통 |
| 앱 E | 5.6 (다시) | 말 그대로 악몽 | 기도 | |
| 무한대 |
새로운 개발자를 온보딩(Onboarding)한다는 것은 각 앱의 특이한 점들을 설명하는 데만 일주일을 소비해야 한다는 것을 의미했습니다. 일주일입니다. 프로덕션(Production) 코드를 단 한 줄도 쓰기 전에요.
결정
저는 급진적인 아이디어를 제안했습니다: 모두 없애버리자.
음, 죽이자는 게 아니라—마이그레이션(Migrate)하자는 것이었습니다. 5개의 프론트엔드를 모두 우리의 표준 Node.js 파이프라인으로 통합하십시오. 하나의 빌드 프로세스(Build process). 하나의 배포 전략(Deployment strategy). 하나의 작업 방식.
반대는 즉각적이었습니다:
"하지만 PHP도 괜찮은데!"
"고장 나지 않은 것을 왜 고치려고 하나?"
"이 작업은 몇 달이 걸릴 거야!"
"우리의 '개성'을 잃게 될 거야!"
저에게는 단 하나의 답변이 있었습니다: "당신의 개성이 우리에게 비용을 발생시키고 있습니다."
마이그레이션(Migration)
실제 마이그레이션(Migration) 과정은 다음과 같았습니다:
1단계: 감사(Audit)
저는 5개 앱 전체에 걸쳐 모든 기능, 모든 라우트(Route), 모든 API 호출을 매핑(Mapping)했습니다. 놀랍게도, 그것들은 모두 동일한 3가지 일을 하고 있었습니다:
- API로부터 데이터 가져오기
- UI 렌더링(Render)하기
- 폼 제출(Form submissions) 처리하기
차이점은 순수하게 그것들을 수행하는 방식에 있었습니다.
2단계: 표준화 (The Standard)
우리의 "표준" Node 파이프라인을 정의했습니다:
프레임워크 (Framework): Express + React (이미 다른 곳에서 사용 중)
빌드 (Build): Vite (빠르고 현대적임)
린팅 (Linting): ESLint + Prettier (타협 불가)
테스트 (Testing): Jest + React Testing Library
배포 (Deployment): GitHub Actions → AWS ECS
3단계: 재작성 (The Rewrite)
모든 것을 처음부터 다시 작성하지는 않았습니다. 다음과 같이 추출했습니다:
- 공유 UI 컴포넌트 (Shared UI components)를 모노레포 (monorepo) 패키지로 추출
- API 클라이언트 로직 (API client logic)을 단일 서비스로 추출
- 환경 설정 (Environment configuration)을 통합된 .env 시스템으로 추출
각 앱은 동일한 코드베이스 내에서 하나의 "테마" 또는 "라우트 (route)"로 재구현되었습니다.
4단계: 전환 (The Cutover)
한 번에 하나의 앱씩 배포했습니다. 문제가 발생하면 롤백 (rollback)했습니다. (두 번 문제가 생겼고, 두 번 롤백했습니다. 별일 아니었습니다.)
결과
온보딩 (Onboarding): 1주일 → 1일
이것이 제가 가장 자랑스럽게 생각하는 지표입니다.
이전:
1일 차: PHP 5.6 설치 (M1 Mac 사용자라면 행운을 빕니다)
2일 차: 5개의 서로 다른 .ini 파일 설정
3일 차: 앱 A의 커스텀 라우팅 (custom routing) 학습
4일 차: 앱 B의 커스텀 템플릿 (custom templating) 학습
5일 차: (어쩌면) 실제로 코드 작성
이후:
오전: git clone, npm install, cp .env.example .env
오후: "여기 코드베이스가 있습니다. React와 Node를 아시니, 바로 시작하세요."
신입 개발자들이 1일 차부터 기능을 배포하고 있습니다. 단순히 "Hello World" 수준이 아니라, 실제 기능들입니다.
개발자 만족도: 📈
전후로 팀원들에게 설문 조사를 실시했습니다:
지표 | 이전 | 이후
"코드베이스를 이해한다" | 2/10 | 8/10
"문제를 빠르게 디버깅(debug)할 수 있다" | 3/10 | 7/10
"여기서 일하는 것이 즐겁다" | 4/10 | 9/10
배포 (Deployments): 스트레스 유발 → 지루함
이전: 배포를 위해 3명의 서로 다른 사람, 2개의 Slack 채널, 그리고 간절한 기도가 필요했습니다.
이후: git push main → 자동 빌드 (automated build) → 자동 테스트 (automated test) → 자동 배포 (automated deploy). 15분 소요. 사람의 개입 없음.
뼈아픈 진실
표준화는 지루합니다.
또 다른 YAML 파일을 작성하는 것에는 영광이 없습니다. 5개의 앱에 동일한 ESLint 규칙을 강제한다고 해서 아무도 트로피를 주지 않습니다. 아무도 "우아한 CI 파이프라인"에 대해 트윗하지 않습니다.
하지만 중요한 사실은 이것입니다:
지루함은 빠릅니다.
지루함은 예측 가능합니다.
지루함은 확장 가능합니다 (scalable).
지루함은 돈을 법니다.
우리가 마지막으로 주니어 개발자를 채용했을 때, 그들은 첫날부터 생산성을 발휘했습니다. 이것은 자랑(flex)이 아닙니다. 시스템이 제대로 작동하고 있다는 증거입니다. 시스템은 흥미로운 것에 관심이 없습니다. 시스템은 업무를 완수하는 것에 관심이 있습니다.
내가 배운 것들
-
표준화 (Standardization)는 승수 효과 (Force Multiplier)이다
온보딩 (Onboarding)에 1주일이 걸리느냐 1일이 걸리느냐의 차이는 신규 채용자 1명당 4일의 추가 생산성을 의미합니다. 만약 올해 10명을 채용한다면, 이는 40일 치의 급여를 절약하는 것입니다. 이것은 "지루한" 것이 아니라, 비즈니스 케이스 (business case)입니다. -
레거시 코드 (Legacy Code)는 "개성"이 아니라 "부채"다
예전에는 레거시 코드를 낭만적으로 생각하곤 했습니다. "역사가 담겨 있어!" "실전에서 검증되었어!" 아니요. 그것은 버그를 가지고 있습니다. 설정 드리프트 (config drift)를 가지고 있습니다. 아무도 기억하지 못하는 숨겨진 의존성 (dependencies)을 가지고 있습니다.
그것을 없애십시오. 통합하십시오. 그리고 나아가십시오.
- 개발자는 혼돈이 아니라 명확함을 원한다
내가 함께 일해온 모든 개발자는 의미 있는 코드를 작성하기를 원합니다. 그들은 App C가 왜 데이터베이스에 연결되지 않는지 알아내기 위해 3시간을 허비하고 싶어 하지 않습니다.
표준화를 통해, 나는 팀원들에게 그들의 삶에서 수많은 시간을 되돌려주었습니다. 이것은 지루한 것이 아니라, 인간적인 것입니다.
밈 버전 (X/Threads용)
5개의 레거시 PHP 앱 ➡️ 1개의 Node 파이프라인.
온보딩 (Onboarding):
이전: "왜 이 서버는 PHP 5.6이 필요한 거지?"라며 고민하는 1주일
이후: ".env 파일 여기 있습니다."라고 말하는 1일
표준화는 지루합니다.
하지만 신입 개발자가 첫날부터 기능을 배포 (ship)하는 것을 보는 것? 그것은 아름답습니다.
마치며
만약 당신이 모두 같은 일을 하지만 모습은 완전히 다른 레거시 앱 더미 위에 앉아 있다면, 그 혼돈을 낭만적으로 바라보는 것을 멈추십시오.
통합하십시오.
표준화하십시오.
지루함에 몸을 던지십시오.
당신의 미래의 자신(그리고 미래의 신규 채용자들)이 당신에게 감사할 것입니다.
레거시 코드를 표준화한 당신의 경험은 어떠신가요? 아래에 댓글을 남겨주세요. 함께 지루해져 봅시다. 👇
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기