어떤 팀이 결국 프레임워크를 벗어나는 이유
팀이 프레임워크를 벗어났다는 신호, 그 고통의 근본 원인, 전체 재작성 없이도 안전하게 진화할 수 있는 현실적 선택과 실용적 다음 단계를 알아봅니다.

프레임워크를 벗어난다는 것이 의미하는 바
프레임워크를 벗어났다는 건 프레임워크가 "실패했다"거나 팀이 틀린 도구를 선택했다는 뜻이 아닙니다. 프레임워크의 기본 가정이 더 이상 제품과 조직의 요구와 맞지 않게 되었다는 뜻입니다.
프레임워크는 일련의 의견(opinions)입니다: 코드 구조화 방법, 요청 라우팅 방법, UI 구성 방법, 배포 방법, 테스트 방법 등. 초반에는 이런 의견들이 결정을 덜어주어 빠르게 움직이게 해 줍니다. 시간이 흐르면 같은 의견들이 제약이 됩니다: "쉬운 길"이 더 이상 현실에 맞지 않고, "어려운 길"이 매주 선택해야 하는 경로가 됩니다.
프레임워크 자체가 나쁜 것이 아니라, 당신의 필요가 바뀐 것이다
대부분의 팀이 프레임워크를 벗어나는 이유는 조직이나 제품이 프레임워크가 최적화하지 않았던 방향으로 확장되기 때문입니다: 개발자 수 증가, 기능 증가, 더 높은 가동시간 기대치, 강화된 보안 요구사항, 다중 플랫폼, 통합 대상 증가 등. 프레임워크 자체는 여전히 괜찮을 수 있지만, 시스템의 중심으로서 더 이상 최선이 아닐 뿐입니다.
이 가이드에서 얻을 것
프레임워크 한계의 초기 신호를 포착하는 법, 고통의 공통 근본 원인, 그리고 전체 재작성 없이도 안전하게 진화할 수 있는 현실적인 선택지들을 비교하는 법을 배우게 됩니다. 또한 팀과 함께 당장 실행할 수 있는 실용적인 다음 단계도 얻을 수 있습니다.
정답은 없다
일부 팀은 프레임워크 주변에 더 나은 경계와 도구를 만들어 문제를 해결합니다. 다른 팀은 가장 제약이 큰 부분만 교체합니다. 일부는 아예 완전히 이전하기도 합니다. 정답은 목표, 위험 수용도, 비즈니스가 흡수할 수 있는 변화량에 따라 다릅니다.
프레임워크가 초반에 훌륭하게 느껴지는 이유
프레임워크는 불확실성을 줄여주기 때문에 쇼트컷처럼 느껴집니다. 초기 단계에서는 팀이 실제로 무언가를 출시하고 가치를 증명하며 사용자로부터 학습해야 합니다—빠르게. 좋은 프레임워크는 합리적인 기본값으로 명확한 "해피 패스"를 제공하여 논쟁을 줄이고 전달에 집중하게 해 줍니다.
적은 결정으로 얻는 속도
팀이 작을 때, 추가 결정 하나하나가 비용입니다: 회의, 조사, 잘못 선택할 위험. 프레임워크는 프로젝트 구조, 빌드 툴링, 라우팅, 인증 패턴, 테스트 설정 등 많은 선택을 하나로 묶어 빠르게 움직이게 합니다.
기본값은 온보딩을 쉽게 만듭니다. 새로운 개발자는 관습을 따라하고 패턴을 복사하며 커스텀 아키텍처를 먼저 이해하지 않고도 기여할 수 있습니다.
제약은 초반에는 장점이다
제약은 과도한 엔지니어링을 막아줍니다. 프레임워크는 표준적인 방식을 권장해 제품의 요구를 탐색할 때 이상적입니다. 구조는 가드레일 역할을 하여 엣지 케이스와 창의적 구현을 줄이고 너무 일찍 내리는 장기 약속을 줄입니다.
특히 제품 작업과 시스템 안정성을 균형 잡을 때 유용합니다. 작은 팀에서는 일관성이 유연성보다 더 중요할 때가 많습니다.
트레이드오프: 지금의 편의 vs 나중의 유연성
속도를 내게 하는 동일한 기본값이 요구사항이 확장되면 마찰이 됩니다. 편의성은 보통 프레임워크가 "대부분의 앱"이 필요로 하는 것을 가정한다는 뜻입니다. 시간이 지나면 당신의 앱은 "대부분의 앱"이 아니라 "당신의 앱"이 됩니다.
초반엔 도움이 되지만 나중엔 제약처럼 느껴질 수 있는 예
몇 가지 공통된 예:
- 복잡해진 도메인이나 팀이 늘어나면 어색해지는 의견이 강한 폴더 구조
- 성능, SEO, 배포 요구와 맞지 않는 내장 라우팅/렌더링 가정
- 복잡한 워크플로우, 리포팅, 다중 DB에서 힘든 일괄적인 데이터 접근 패턴
- 프레임워크를 따라가느라 별도의 프로젝트가 되는 번들된 툴링과 업그레이드 주기
초반에는 이런 기본값이 무료 가속처럼 느껴지지만, 나중엔 명시적으로 동의하지 않은 규칙을 따라야 하는 것처럼 느껴질 수 있습니다.
성장하면서 요구사항이 어떻게 바뀌는가
5명의 개발자와 한 제품 라인에서 완벽해 보였던 프레임워크가 조직이 커지면 제한적으로 느껴질 수 있습니다. 프레임워크가 나빠진 게 아니라, 해야 할 일이 바뀐 것입니다.
규모는 조정 비용을 곱한다
성장은 보통 더 많은 개발자, 더 많은 서비스, 더 많은 릴리스, 더 많은 고객을 의미합니다. 이는 작업이 시스템을 통해 이동하는 방식에 새 압력을 만듭니다:
- 병렬 개발이 병합 충돌, 리뷰 부담, 의존성 관리를 증가시킵니다
- 릴리스 빈도가 수동 단계와 "특별 케이스"를 비싸게 만듭니다
- 고객 볼륨은 작은 비효율을 눈에 띄는 지연과 지원 티켓으로 바꿉니다
비기능적 요구사항이 1순위가 된다
초기에는 팀이 ‘충분히 좋음’의 성능과 약간의 다운타임을 수용할 수 있습니다. 사업이 확장되면 기대치는 측정 가능한 보증으로 이동합니다.
성능, 신뢰성, 컴플라이언스, 다중 리전 지원이 더 이상 엣지 케이스가 아닌 설계 제약이 됩니다. 캐싱, 관측성, 오류 처리, 데이터 보존, 감사 로그, 인시던트 대응 등 스타터 프레임워크가 가볍게만 다루던 영역들이 명확한 경계를 필요로 합니다.
통합은 앱을 시스템으로 만든다
결제, 분석, 데이터 파이프라인, 파트너 통합을 추가하면 코드베이스가 단일 제품 이상이 됩니다. 다음에 대한 일관된 패턴이 필요합니다:
- 이벤트와 비동기 워크플로우
- 버전 관리된 API와 역호환성
- 시크릿 관리, 접근 통제, 데이터 거버넌스
프레임워크가 하나의 "권장 방식"만을 밀어붙이면 팀은 우회로를 만들고, 그 우회로들이 실제 아키텍처가 됩니다.
팀의 다양성은 "단순함"의 의미를 바꾼다
다양한 숙련도와 작업 스타일을 가진 팀이 늘어나면 관습은 가르치기 쉽고 강제할 수 있으며 테스트 가능한 형태가 되어야 합니다. 예전에는 부족한 지식(tribal knowledge)으로 해오던 방식이 문서화된 표준, 도구, 가드레일이 되어야 합니다. 프레임워크가 그런 일관성을 지원하지 못하면 코드가 잘 돌아가더라도 생산성이 떨어집니다.
프레임워크를 벗어났음을 알려주는 흔한 신호들
프레임워크를 벗어나는 현상은 보통 단일한 극적인 실패로 드러나지 않습니다. 보통 패턴으로 나타납니다: 일상 업무가 점점 느려지고, "쉬운 기본값"이 필요와 충돌합니다.
1) 빌드와 설정 마찰이 규범이 된다
작은 변경에도 빌드 시간과 로컬 설정이 명백히 느려진다면 큰 신호입니다. 새 팀원들이 생산적이 되기까지 몇 시간(또는 며칠)이 걸리고, CI가 안전망이 아니라 병목으로 느껴집니다.
2) 한 부분을 고치려면 모든 걸 건드려야 한다
부분별로 독립적으로 테스트, 배포, 확장하기 어렵다면 프레임워크가 당신을 전체-또는-무(ALL-OR-NOTHING) 아키텍처로 밀어붙이고 있을 수 있습니다. 종종 다음을 경험합니다:
- 작은 기능도 전체 앱 빌드를 요구함
- 단일 서비스 변경이 광범위한 회귀 위험을 촉발함
- "간단한" 리팩터가 경계가 실질적이지 않아서 멈춤
3) 우회와 특수 케이스가 늘어난다
프레임워크의 한계는 예외 컬렉션—커스텀 스크립트, 패치, "이렇게 하지 마라" 규칙, 기본 동작을 우회하는 내부 문서—로 드러나는 경우가 많습니다. 엔지니어가 사용자 문제 해결보다 프레임워크와의 협상에 더 많은 시간을 쓴다면 강한 신호입니다.
4) 업그레이드가 지연되거나, 두렵거나, 계속 깨진다
버전 업그레이드가 관련 없는 영역을 반복적으로 망가뜨리거나 업그레이드를 수개월씩 미룬다면 프레임워크가 안정적 기반 역할을 하지 못합니다. 최신 상태를 유지하는 비용이 기능 제공과 경쟁하기 시작합니다.
5) 인시던트의 원인이 숨겨진 동작에 있다
프로덕션 인시던트가 프레임워크 제약이나 매직 동작(예상치 못한 캐싱, 라우팅, 직렬화, 백그라운드 작업)에 기인한다면 디버깅이 느리고 위험합니다. 프레임워크가 도우미가 아니라 빈번한 근본 원인이라면 이미 한계를 넘어선 것입니다.
보통 고통을 일으키는 원인들
프레임워크의 고통은 보통 단일한 “나쁜 결정”에서 시작하지 않습니다. 제품과 팀이 프레임워크보다 빨리 진화할 때 나타납니다.
작은 변경이 큰 변경으로 바뀌는 촘촘한 결합
많은 프레임워크는 초반에는 깔끔하게 느껴지는 패턴을 권장하지만, 나중에는 모듈 간 촘촘한 결합을 만들어 작은 변경도 많은 파일과 많은 사람을 한 PR에 끌어들입니다.
문제를 추론하기 어려운 숨겨진 마법
관습이 구성보다 우선되는 방식은 도움이 되지만, 관습이 보이지 않는 규칙이 되면 문제가 됩니다. 자동 주입(auto-wiring), 암묵적 라이프사이클 훅, 리플렉션 기반 동작은 문제 재현 및 디버깅을 어렵게 만듭니다. 팀은 "이것이 어디서 일어나고 있지?"를 묻느라 "다음에 무엇을 만들까?"를 묻지 못하게 됩니다.
적합성 부족을 메우는 플러그인 난립
프레임워크가 점점 많은 요구를 커버하지 못하면 팀은 확장으로 공백을 메우려 합니다. 시간이 지나면 서로 품질이 다른 플러그인, 겹치는 책임, 호환되지 않는 업그레이드 경로의 모자이크가 생깁니다. 프레임워크는 기반이라기보다 의존성 협상 대상이 됩니다.
업그레이드를 얼어붙게 하는 버전 잠금
하나의 중요한 의존성(ORM, UI 킷, 런타임, 배포 도구)이 전체 스택을 오래된 프레임워크 버전에 묶을 수 있습니다. 보안 수정과 성능 개선이 업그레이드를 안전하게 할 수 없어서 밀리면 매달 지연의 비용이 쌓입니다.
도메인 가정과의 불일치
프레임워크는 워크플로우, 데이터 형태, 요청/응답 패턴 등에 대한 가정을 합니다. 제품이 그 가정에 맞지 않으면(복잡한 권한, 오프라인 우선, 무거운 백그라운드 처리) 기본값과 싸우게 되고, 핵심 부분을 래핑하거나 우회하거나 재구현하게 됩니다.
비즈니스에 미치는 영향: 비용, 위험, 속도
프레임워크를 벗어나는 것은 단순한 엔지니어링 불편이 아닙니다. 이는 더 느린 전달, 더 높은 운영 리스크, 증가하는 비용으로 비즈니스 측면에 드러납니다—대부분 아무도 프레임워크를 원인으로 지목하기 전부터 나타납니다.
속도: 관습이 마찰로 변할 때
프레임워크는 처음에는 팀에 "올바른 방식"을 제공해 가속합니다. 제품 요구가 다양해질수록 동일한 관습이 제약이 됩니다.
팀은 프레임워크와 타협하는 데 더 많은 시간을 쓰기 시작합니다—우회, 플러그인, 비정상적 패턴, 긴 빌드 파이프라인—고객 가치 전달보다 더 많은 코디네이션과 재작업이 필요해져 로드맵이 밀립니다.
위험: 신뢰성 및 보안 노출
프레임워크 동작이 미묘하거나 추론하기 어려워지면 인시던트 위험이 증가합니다. 흔한 증상: 실제 트래픽에서만 실패하는 라우팅·캐싱·백그라운드 작업의 엣지 케이스. 각 인시던트는 시간과 신뢰를 갉아먹고, "진정한 해결"은 깊은 프레임워크 지식을 요구합니다.
보안 위험도 커집니다. 업그레이드는 기술적으로 가능해도 운영상 비용이 커서 패치가 지연되면 "지금은 업그레이드할 수 없다"가 일상 상태가 되며, 이는 취약점이 비즈니스 문제가 되는 시점입니다.
비용: 성장을 짊어지는 숨은 세금
비용은 두 가지 방식으로 증가합니다:
- 사람 비용: 스택을 아는 엔지니어가 적어 채용·온보딩이 오래 걸리고 시니어 개발자가 리뷰·디버깅·아키텍처 결정의 병목이 됨
- 운영 비용: 프레임워크 한계를 보완하려 인프라와 툴링이 확장됨—더 많은 캐시, 더 많은 큐, 더 많은 빌드 리소스, 더 많은 관측성 지출
결과는 복리 세금처럼 됩니다: 더 느리게 움직이기 위해 더 많은 비용을 지불합니다. 이를 조기에 인식하면 팀은 비상 상황 대신 통제된 경로를 선택할 수 있습니다.
앞으로 나아갈 네 가지 경로(단순히 "다시 쓰기"만 있는 건 아니다)
프레임워크가 속도를 늦춘다고 해서 자동으로 "모두 다시 쓰자"가 정답은 아닙니다. 대부분의 팀은 비용, 위험, 속도에서 다른 트레이드오프를 가진 여러 실행 가능한 경로를 갖고 있습니다.
옵션 A: 유지하고 표준화하기
프레임워크가 대부분 요구를 충족하지만 팀이 많이 커스터마이즈된 경우 적합합니다.
특수 케이스를 줄이는 데 집중하세요: 플러그인 축소, 일회성 패턴 축소, 설정 단순화, 명확한 "골든 패스". 이는 큰 중단 없이 일관성 회복과 온보딩 개선을 가장 빠르게 해 줍니다.
옵션 B: 프레임워크 내부에서 모듈화하기
프레임워크 자체는 괜찮지만 코드베이스가 얽혀 있는 경우 선택하세요.
명확한 경계를 만드세요: 공유 패키지, 도메인 모듈, 안정된 내부 API. 목표는 시스템 일부를 독립적으로 변경할 수 있게 하여 프레임워크 제약의 영향을 줄이는 것입니다. 많은 팀이 같은 제품에 기여할 때 특히 유용합니다.
옵션 C: 스트랭글러 접근(한 조각씩 옮기기)
프레임워크가 중요한 요구를 막고 있지만 전체 전환이 위험할 때 적합합니다.
안정된 인터페이스(라우트, API, 이벤트) 뒤로 기능을 점진적으로 옮깁니다. 프로덕션에서 성능, 신뢰성, 개발자 워크플로를 검증할 수 있어 전체 런치에 올인하지 않고도 진행할 수 있습니다.
옵션 D: 신규 작업만 대체하기
레거시가 충분히 안정적이고 미래 전달이 가장 큰 고통일 때 선택하세요.
신규 기능과 서비스는 새 경로에서 시작하고 기존 영역은 유지합니다. 마이그레이션 압박을 줄여 주지만 논리를 중복시키거나 두 경쟁하는 "진실의 근원"을 만들지 않도록 규율이 필요합니다.
어떻게 결정할 것인가: 실용적인 평가 체크리스트
프레임워크가 속도를 늦출 때 목표는 "새 스택을 고르는 것"이 아니라—6개월 후에도 방어할 수 있는 결정을 내리는 것입니다. 감정이 아니라 결과에 기반해 선택하세요.
1) 실제 목표(의견이 아닌)를 적어라
원하는 결과를 먼저 나열하세요:
- 더 빠른 전달(단축된 사이클 타임, 적은 핸드오프)
- 더 안전한 변경(낮은 변경 실패율, 쉬운 롤백)
- 더 나은 신뢰성(인시던트 감소, 명확한 책임)
측정할 수 없다면 다시 써라.
2) 비협상 항목 정의하기
다음 접근법이 반드시 지원해야 할 능력을 식별하세요. 공통 필수 항목:
- 관측성(무엇이 깨졌는지 빠르게 답할 수 있는 로그·메트릭·트레이스)
- 테스트(단위, 통합, 현실적인 스테이징 신뢰도)
- 배포 모델(모놀리식, 모듈러 모놀리식, 서비스; CI/CD 제약)
짧게 유지하세요. 길면 우선순위가 불명확하다는 신호입니다.
3) 간단한 스코어카드로 옵션 비교
실행 가능성이 있는 2–4개의 경로를 골라 다음으로 점수화하세요:
- 영향(Impact): 목표를 얼마나 개선하는가
- 노력(Effort): 엔지니어링 시간 및 운영 부하
- 위험(Risk): 마이그레이션/벤더/기술 스킬 리스크
1–5의 간단한 척도가 충분합니다. 이유를 기록하세요.
4) 결정에 시간 제한 두기
엄격한 탐색 기간(대개 1–2주)을 설정하고, 회의에서 결정을 내리며 명확한 책임자를 지정하세요. "영구 연구"를 피합니다.
5) 가벼운 아키텍처 노트로 문서화하기
목표, 비협상 항목, 고려한 옵션, 점수, 결정, 재검토할 조건을 캡처하세요. 짧고 공유하기 쉬우며 업데이트하기 쉬운 문서가 좋습니다.
중단 없이 안전한 마이그레이션 계획하기
마이그레이션이란 6개월 동안 제품 작업을 멈추는 것을 의미하지 않습니다. 가장 안전한 전환은 작은 되돌릴 수 있는 움직임의 연쇄로 바꿔 시스템이 바뀌는 동안에도 팀이 계속 배포할 수 있게 합니다.
1) 명확한 인벤토리로 시작
미래를 계획하기 전에 현재 무엇이 있는지 문서화하세요. 경량 인벤토리:
- 서비스/모듈과 그 역할
- 핵심 의존성(데이터베이스, 큐, 서드파티 API)
- 트래픽과 중요도(수익에 영향 주는 것 vs 내부적인 것)
- 소유자와 온콜 책임
이게 작업 순서를 정하고 놀라움을 피하는 지도 역할을 합니다.
2) 대상 아키텍처 스케치(경계부터)
40페이지 디자인 문서는 필요 없습니다. 어떤 것이 함께 있어야 하고 무엇을 분리해야 하며 어떤 컴포넌트가 통합되는지를 보여주는 간단한 스케치면 충분합니다.
구현 디테일보다는 인터페이스와 계약(API, 이벤트, 공유 데이터)에 집중하세요.
3) 마일스톤과 성공 지표 정의
마이그레이션이 끝나지 않는 느낌을 주지 않으려면 진척을 측정 가능하게 만드세요. 예: "첫 서비스가 새 방식에서 실행됨" 또는 "상위 3개 중요 흐름 마이그레이션 완료" 같은 마일스톤과 다음 지표를 연결하세요:
- 오류율과 지연
- 배포 빈도와 리드 타임
- 롤백 빈도
- 프레임워크 특유의 우회에 소비되는 개발자 시간
4) 병행 실행, 데이터 마이그레이션, 롤백 계획
구식 시스템과 새 시스템을 병행 운영할 것을 예상하세요. 데이터 이동(일방향 동기, 이중 쓰기, 백필 등), 검증 방법, 그리고 릴리스가 잘못되었을 때의 롤백 방법을 사전에 결정하세요.
5) 빅뱅 전환은 피하라
만약 만료되는 벤더 계약이나 중대한 보안 이슈 같은 강력한 이유가 없다면 한꺼번에 전환하는 것을 피하세요. 점진적 전환은 위험을 줄이고 전달을 계속하게 하며 팀이 프로덕션에서 실제로 작동하는 것을 학습할 시간을 줍니다.
변경 중 위험을 줄이는 기술적 전술
프레임워크의 일부를 교체하거나 서비스로 분리할 때 위험은 보통 예기치 않은 동작: 트래픽이 잘못된 코드 경로로 가는 경우, 숨겨진 의존성, 끊긴 통합 등으로 나타납니다. 안전한 전환은 변경을 관찰 가능하고 되돌릴 수 있게 하는 실용적 전술에 의존합니다.
기능을 되돌릴 수 있게 하라(Feature flags)
기능 플래그로 트래픽의 일부만 새 구현으로 라우팅한 다음 점진적으로 늘리세요. 내부 사용자 → 소규모 코호트 → 전체 트래픽 같은 명확한 롤아웃 단계와 즉시 "끄는" 스위치를 설계하세요.
계약 테스트로 동작을 고정하라
특히 API, 이벤트, 공유 데이터 형식 주변에 계약 테스트를 추가하세요. 목표는 한 부분이 게시하는 것이 다른 부분이 기대하는 것과 여전히 일치한다는 점을 보장하는 것입니다. 이는 기본 모듈을 바꿀 때 "격리했을 때는 됐었는데" 같은 회귀를 방지합니다.
큰 조각을 옮기기 전에 관측성을 업그레이드하라
주요 리팩터 전 관측성(로그/메트릭/트레이스)을 개선해 실패를 빠르게 보고 옛 시스템과 새 시스템의 동작을 비교하세요. 우선순위:
- 요청 전반의 상관 ID
- 지연, 오류율, 포화도 대시보드
- 고객 영향 징후에 대한 경보
휴먼 에러를 자동화로 줄이기
빌드와 배포를 자동화해 릴리스를 "지루하게" 만드세요: 일관된 환경, 반복 가능한 단계, 빠른 롤백. 좋은 CI/CD 파이프라인은 변경이 잦을 때 안전망이 됩니다.
"옛" 시스템의 종료 계획을 세워라
구식 엔드포인트와 모듈에 대해 사용 중단 정책을 세우세요: 일정 공지, 사용량 추적, 경고 추가, 통제된 마일스톤에 따라 제거. 사용 중단 작업은 나중에 할 정리 작업이 아니라 전달의 일부입니다.
사람과 프로세스: 전환을 정착시키기
프레임워크 변화는 코드만으로 실패하지 않습니다. 실패하는 이유는 보통 책임자가 불분명하고 팀들이 "새 방식"을 다르게 해석하며 이해관계자들이 혼란만 듣기 때문입니다. 전환을 정착시키려면 운영상의 변화로 다루세요.
소유권 명확히 하기(플랫폼 대 제품)
포장된 길(paved road)을 누가 소유하는지 결정하세요. 플랫폼(또는 지원) 팀은 공유 툴링: 빌드 파이프라인, 템플릿, 핵심 라이브러리, 업그레이드 경로, 가드레일을 소유할 수 있습니다. 제품 팀은 기능 전달과 앱별 아키텍처 결정을 소유하세요.
핵심은 경계를 명확히 하는 것입니다: 공유 표준 변경을 누가 승인하는가, 긴급 수정은 누가 처리하는가, 지원은 어떻게 제공되는가(오피스아워, 슬랙 채널, 요청 프로세스).
결정 피로를 줄이는 공유 표준 만들기
팀에는 더 많은 규칙이 필요한 게 아니라 반복되는 논쟁을 줄이는 표준이 필요합니다:
- 프로젝트 템플릿과 "골든 패스" 스타터
- 버전 관리된 내부 라이브러리(인증, 로깅, UI, API 클라이언트)
- "어떻게 시작하나?"와 "승인된 방식으로 어떻게 하나?"에 답하는 짧은 문서
기본값과 탈출 해치(escape hatch)를 제공하세요. 누군가 벗어나면 간단한 서면 이유를 요구해 예외가 가시화되도록 하세요.
실무 중심 교육으로 팀을 훈련시키기
프레임워크 전환은 일상 습관을 바꿉니다. 실제 작업에 초점을 맞춘 짧은 워크숍(하나의 화면, 하나의 엔드포인트, 하나의 서비스 마이그레이션)을 운영하세요. 경험 많은 기여자와 페어를 맺고 내부 가이드에 "전/후" 예시와 흔한 함정을 게시하세요.
교육은 킥오프 한 번이 아니라 몇 주간 지속적으로 이루어져야 합니다.
이해관계자에게는 평이한 언어로 트레이드오프를 전달하라
이해관계자는 기술적 세부가 아니라 결과에 대한 명확성이 필요합니다:
- 무엇이 개선되는가(속도, 품질, 채용, 신뢰성)
- 무엇이 일시적으로 나빠지는가(일부 기능 느려짐, 추가 리뷰 시간)
- 무엇이 비협상 항목인가(보안, 컴플라이언스, 성능)
"프레임워크를 벗어났다"는 말을 개발자 관점이 아닌 비즈니스 용어로 번역하세요: 개발자 생산성 저하, 증가하는 기술 부채, 커져가는 변경 리스크.
가시적인 로드맵으로 진행 상황 추적
파일럿 앱 완료, 핵심 라이브러리 안정화, X% 서비스 마이그레이션 같은 마일스톤을 담은 가벼운 로드맵을 공개하세요. 정기 점검에서 검토하고 마일스톤을 축하하며 현실이 바뀌면 조정하세요. 가시성은 마이그레이션 전략을 배경 소음이 아닌 공동의 모멘텀으로 만듭니다.
흔한 실수와 피하는 법
프레임워크를 벗어나는 문제는 대개 단일 기술적 이슈가 아니라 전달 압력에서 내린 일련의 피할 수 있는 결정들입니다. 전환을 느리게, 위험하게, 비싸게 만드는 실수와 피하는 법:
가치를 증명하기 전에 모든 것을 다시 쓰기
전체 리라이트는 깔끔하게 느껴지지만 불확실한 보상에 거는 내기입니다.
얇은 슬라이스 마이그레이션을 통해 피하세요: 하나의 사용자 흐름이나 내부 서비스 하나를 골라 성공 지표(리드 타임, 오류율, 지연, 온콜 부담)를 정의하고 새 접근이 실제로 개선하는지 검증하세요.
종료 일자가 없는 두 스택 공존
병행 스택은 정상적이지만 종신적 병행은 세금입니다.
명확한 종료 기준을 설정해 어떤 모듈을 옮겨야 하고 언제 제거할지 정하세요. 폐기 일자를 정하고 오래된 코드 경로를 제거할 책임자를 지정하세요.
성능과 관측성을 늦게 신경쓰기
팀들은 종종 새 설정이 캐싱, 요청 팬아웃, 빌드 시간, 인시던트 가시성에 변화를 줬다는 것을 늦게 깨닫습니다.
관측성을 런치 요건으로 다루어 현재의 지연과 실패를 기준으로 삼고 새 서비스는 처음부터 계측(로그, 메트릭, 트레이스, SLO)하세요.
데이터와 통합 복잡성을 과소평가
프레임워크 변경은 UI나 서비스 리팩터처럼 보이지만 데이터 모델, 아이덴티티, 결제, 서드파티 통합이 들어오면 복잡해집니다.
핵심 통합을 초기에 맵으로 그려보고 단계적 데이터 접근(백필, 필요 시 이중 쓰기, 명확한 롤백 경로)을 설계해 피하세요.
개발자 시간과 릴리스 품질을 측정하지 않음
개선이 보이지 않으면 방향을 조정할 수 없습니다.
간단한 지표: 사이클 타임, 배포 빈도, 변경 실패율, 복구 시간 등을 추적하세요. 이를 기반으로 다음에 무엇을 옮길지, 무엇을 중단할지 결정하세요.
팀을 위한 간단한 다음 단계 계획
프레임워크는 약속이 아니라 도구입니다. 도구가 더 이상 작업에 맞지 않다면—팀이 늘고, 통합이 늘고, 보안 요구가 강화되고, 가동시간 요구가 올라갔다는 신호입니다—마찰은 도덕적 실패가 아니라 요구가 진화했다는 신호입니다.
1단계: 빠른 "적합성(fit)" 감사 실행(1–2시간)
실제 고통을 반영하는 8–10개의 질문을 골라 점수화하세요(예: 1–5): 릴리스 속도, 테스트 신뢰도, 빌드 시간, 온보딩 시간, 관측성, 성능, 보안 통제, 커스텀 우회 생성 빈도.
증거 기반으로 유지하세요: 인시던트, PR 메트릭, 놓친 마감, 고객 불만 링크를 첨부하세요.
2단계: 파일럿 영역 하나 선택(전체 시스템이 아님)
프레임워크 제약이 뚜렷하게 드러나는 영역을 하나 고르세요—대개 단일 서비스, 워크플로우, UI 표면 하나가 적합합니다. 좋은 파일럿은:
- 영향력이 충분히 있어야 함
- 몇 주 내에 끝낼 수 있을 만큼 작아야 함
- 측정이 쉬워야 함(지연, 사이클 타임, 결함률, 클라우드 비용)
3단계: 한 페이지 분량의 의사결정 문서 작성
현재의 고통, 고려한 옵션(유지 포함), 결정 기준, 위험, 성공 정의를 캡처하세요. 이렇게 하면 "다시 쓰기 에너지"가 범위 확대로 흐르는 걸 막을 수 있습니다.
4단계: 현실적인 90일 계획 수립
주간 마일스톤: 무엇을 바꿀지, 무엇을 안정화할지, 어떻게 테스트할지, 문제가 생기면 어떻게 롤백할지. 이해관계자 소통 계획과 명확한 책임자도 포함하세요.
90일 계획은 주간 실행 항목과 검증 가능한 성공 기준을 담아야 합니다.
추가로 의사결정과 트레이드오프를 정리하는 데 도움이 필요하면 /blog/engineering의 관련 노트를 참고하세요. 스택 일부에 대해 구축 대 구매(build-vs-buy)를 고민 중이라면 /pricing이 예산 논의를 위한 유용한 기준점이 될 수 있습니다.
실용적인 “구축 vs 구매 vs 현대화” 옵션으로 일부 팀은 특정 작업(내부 도구, 신규 서비스, 그린필드 기능)에 대해 Koder.ai 같은 바이브-코딩(vibe-coding) 플랫폼을 평가하기도 합니다. 이 플랫폼들은 채팅으로 웹·백엔드·모바일 앱을 생성하고 소스 코드 내보내기로 탈출구를 제공하기 때문에 리스크가 낮은 프로토타이핑 수단이 될 수 있습니다. 플래닝 모드, 스냅숏/롤백, 배포/호스팅 기능이 있는 플랫폼을 사용하면 전체 마이그레이션에 투자하기 전에 사이클 타임과 변경 안전성이 개선되는지 검증할 수 있습니다.
자주 묻는 질문
“프레임워크를 벗어났다”는 건 무슨 의미인가요?
프레임워크의 내장된 가정(구조, 라우팅, 데이터 접근, 배포, 테스트)이 더 이상 제품과 조직의 요구와 맞지 않을 때 프레임워크를 "벗어났다"고 합니다.
이것은 품질의 문제가 아니라 *적합성(fit)*의 문제입니다. 프레임워크 자체는 여전히 견고할 수 있지만 요구사항(규모, 신뢰성, 보안, 통합, 팀 규모)이 바뀌었기 때문에 맞지 않게 되는 경우입니다.
프레임워크를 벗어났다는 가장 명확한 징후는 무엇인가요?
일상적으로 반복되는 마찰을 찾아보세요:
- 느린 빌드, 느린 CI, 불편한 로컬 설정
- 작은 변경이 전체 리팩터나 전체 빌드를 요구함
- 점점 늘어나는 우회 코드, 스크립트, “이건 기본 방식으로 하지 마세요” 규칙들
- 업그레이드가 지속적으로 두렵거나 깨지거나 수개월씩 미뤄짐
- 숨겨진 프레임워크 동작(매직 라우팅/캐싱/직렬화) 때문에 발생하는 인시던트
하나의 불편함이 신호는 아닙니다—패턴이 쌓이는 것이 신호입니다.
팀이 성장하면서 프레임워크 문제를 일으키는 원인은 무엇인가요?
일반적인 근본 원인은 다음과 같습니다:
- 초기 패턴이 권장하는 촘촘한 결합(tight coupling)
- 동작을 추적하기 어려운 숨겨진 “마법(magic)”
- 부족한 기능을 메우려는 플러그인 확장(sprawl)
- 한 가지 중요한 의존성 때문에 생기는 버전 잠금(version lock)
- 도메인과 맞지 않는 가정(권한, 백그라운드 작업, 오프라인 우선, 다중 DB, 복잡한 워크플로우)
이게 프레임워크 문제인지 단순한 기술 부채인지 어떻게 구분하나요?
비즈니스 결과와 엔지니어링 현실을 연결하는 지표를 먼저 측정하세요:
- 사이클 타임(아이디어 → 프로덕션)
- 변경 실패율과 롤백 빈도
- 인시던트 복구 시간
- 신규 엔지니어 온보딩 시간
- 보안·핵심 의존성의 업그레이드/패치 지연
지표가 악화하는데 노력은 늘어나면, 프레임워크 제약이 비용의 한 부분일 가능성이 큽니다.
언제(언제라도) 전체 리라이트가 정답인가요?
전체 리라이트는 보통 가장 위험한 선택입니다. 가치를 지연시키고 범위를 키우기 때문입니다.
다음 조건을 모두 만족할 때만 고려하세요:
- 프레임워크가 필수 불가결한 조건(보안/컴플라이언스, 가용성, 다중 리전)을 차단할 때
- 점진적 접근으로는 제약을 현실적으로 제거할 수 없을 때
- 먼저 얇은 슬라이스(pilot)로 가치를 증명할 수 있을 때
그렇지 않다면 점진적 방법이 적은 위험으로 더 빠른 개선을 줍니다.
“모두 다시 쓰기” 대신 현실적인 대안은 무엇인가요?
현실적인 대안 네 가지:
- 유지하고 표준화하기: 특수 케이스 축소, 설정 단순화, ‘골든 패스’ 확립
- 프레임워크 내부에서 모듈화하기: 실제 경계를 만들기(모듈/패키지, 내부 API)
- 스트랭글러(strangler) 접근: 안정적인 인터페이스(라우트/API/이벤트) 뒤로 기능을 한 조각씩 옮기기
- 새로운 작업만 교체: 기존 레거시는 유지하고 신규 기능/서비스만 새 스택에서 개발
감정이 아니라 영향·노력·이전 위험을 기준으로 선택하세요.
유지, 확장, 이전 중 무엇을 선택할지 어떻게 평가해야 하나요?
간단한 스코어카드를 사용하세요:
- 측정 가능한 목표 작성(예: 리드타임 30% 감축, 변경 실패율 감소)
- 비협상 항목 나열(관측성, 테스트, 배포 모델, 컴플라이언스)
- 2–4가지 옵션을 영향/노력/위험으로 점수화(1–5이면 충분)
- 조사 기간을 타임박스(보통 1–2주)하고 명확한 결정 담당자 지정
결과를 짧은 아키텍처 노트로 남겨 두면 팀 변화에도 합리적 근거가 유지됩니다.
기능 제공을 멈추지 않고 어떻게 이전할 수 있나요?
변경을 작고 되돌릴 수 있는 단계로 생각하세요:
- 서비스, 의존성, 핵심 유저 플로우를 인벤토리화
- 구현 세부가 아니라 경계와 계약(API/이벤트)에 먼저 집중
- 지연 시간, 오류율, 배포 빈도 같은 성공 지표로 마일스톤 정의
- 병행 운영, 데이터 이동 방식, 롤백 경로를 계획
- 강력한 이유가 없다면 빅뱅 전환은 피하세요
전환 중 위험을 줄이려면 어떤 기술적 전술을 써야 하나요?
위험을 줄여주는 고레버리지 전술 세 가지:
- 기능 플래그: 트래픽 일부를 새 구현으로 라우팅하고 즉시 끌 수 있게 설계
- 계약 테스트: 컴포넌트 간 API/이벤트/데이터 포맷을 고정하는 시험
- 관측성 우선 업그레이드: 상관 ID, 지연/오류 대시보드, 고객 영향 경보
이 방법들은 실 트래픽에서 내부를 바꿀 때의 ‘미지수’를 줄여줍니다.
새로운 접근법을 팀에 뿌리내리게 하려면 어떻게 해야 하나요?
새 접근법이 지속되려면 사람과 프로세스를 바꿔야 합니다:
- 템플릿, 파이프라인, 핵심 라이브러리, 가드레일을 담당하는 플랫폼/지원 팀을 명확히 하세요
- 짧은 “어떻게 하는지” 문서와 스타터 템플릿을 제공해 기본 경로를 쉽게 따르게 하세요
- 실제 마이그레이션(한 엔드포인트/화면/서비스)을 주제로 한 핸즈온 워크숍을 운영하세요
- 가시적 로드맵과 사용 중단(deprecation) 계획을 유지해 두 스택을 영원히 유지하는 상황을 방지하세요
명확한 책임과 기본값이 분열을 막습니다.