외주 개발을 맡긴 뒤 유지보수가 어려워지는 5가지 이유
외주로 만든 서비스가 왜 1년만 지나도 손대기 어려워지는지, 구조적인 원인 5가지와 외주 전·후에 각각 준비해야 할 것을 정리했습니다.
"외주로 런칭은 무사히 했는데, 이제 수정할 때마다 비용이 너무 많이 나옵니다."
"다른 개발자에게 보여줬더니 '이 코드는 손대기 어렵다'는 반응이 돌아왔습니다."
"외주사와 연락이 끊겼는데, 서비스를 고칠 수가 없습니다."
소규모 스타트업 대표들에게서 자주 듣는 이야기입니다. 첫 외주는 대부분 괜찮습니다. 문제는 그 다음입니다. 런칭 후 6개월~1년이 지나면 '건드리기 어려운 레거시'가 되어 있고, 그때부터 비용이 급증합니다.
이건 외주사의 잘못만은 아닙니다. 외주라는 계약 구조 자체가 유지보수를 고려하기 어렵게 만들어져 있습니다. 이 글에서는 왜 그런지, 그리고 앞으로 어떻게 해야 하는지를 정리합니다.
이유 1: 외주는 '납기'가 전부인 구조다
외주 개발은 본질적으로 "정해진 기한 내에 정해진 스펙을 납품"하는 계약입니다. 외주사 입장에서 중요한 건 기한 안에 요청한 기능이 '동작하는 상태'로 인도되는 것입니다.
이 구조에서 개발자는 두 가지 중 하나를 선택해야 합니다. 지금 빠르게 돌아가게 만드는 것, 아니면 나중에 유지보수하기 좋게 만드는 것. 시간이 부족하면 당연히 전자를 선택합니다.
결과적으로 코드는 "지금 요구사항만 정확히 만족하는" 형태가 됩니다. 재사용이나 확장을 고려한 구조가 아닙니다. 그래서 6개월 뒤에 비슷한 기능을 추가하려고 하면, 처음부터 다시 만드는 것과 비용 차이가 크지 않은 경우가 많습니다.
이유 2: 유지보수에 필요한 문서가 없다
외주 계약서에 "문서 작성 및 인도"가 명시되어 있지 않은 경우가 대부분입니다. 있더라도 '기능 명세서' 수준에 그치지, 실제 코드 구조와 아키텍처를 설명하는 개발 문서는 잘 포함되지 않습니다.
외주사 내부에서는 작업한 담당자가 구조를 알고 있지만, 그 개발자가 퇴사하거나 다른 프로젝트로 옮기면 그 지식은 사라집니다. 나중에 다른 사람이 코드를 보면 "왜 이렇게 짰는지" 파악하는 데 상당한 시간이 걸립니다.
특히 다음 항목들이 누락되는 경우가 많습니다.
- 주요 의사결정의 배경 (왜 이 라이브러리, 이 구조를 선택했는가)
- 환경 변수와 외부 서비스 연동 정보
- 배포 절차와 주의사항
- 알려진 버그와 워크어라운드
- 데이터베이스 스키마와 관계
이 정보들이 없으면 다음 개발자는 코드를 읽어서 추측해야 합니다. 그 추측이 틀리면 장애가 납니다.
이유 3: 기술 스택이 외주사 편의 위주로 정해진다
외주사는 자신들이 익숙한 기술 스택으로 개발합니다. 이건 자연스러운 일이지만, 그 선택이 서비스의 장기적 운영에는 맞지 않을 수 있습니다.
예를 들어 다음과 같은 경우들이 있습니다.
- 시장에 개발자가 드문 언어/프레임워크를 사용
- 내부 도구나 라이브러리를 만들어서 사용 (외주사 의존도 극대화)
- 너무 최신이거나 너무 오래된 기술 스택
- 외주사가 가진 서버/인프라에 종속적인 배포 구조
런칭 시점에는 문제가 없습니다. 하지만 다른 개발자에게 유지보수를 맡기려고 할 때, 그 개발자가 이 스택을 다룰 수 없거나 다루려면 학습 시간이 오래 걸리면 비용이 올라갑니다.
가장 흔한 케이스는 '외주사 내부 관리자 페이지 프레임워크'를 쓴 경우입니다. 그 외주사 외에는 누구도 손댈 수 없는 상태가 됩니다.
이유 4: 인수인계가 제대로 이루어지지 않는다
외주 계약이 끝나는 시점은 일반적으로 납품 직후입니다. 이때 코드, 배포 계정, 환경 변수, DB 접근 정보 등이 한꺼번에 넘어오지만, '넘어왔다'고 해서 운영이 가능해지는 것은 아닙니다.
대표나 운영 담당자가 받은 것은 대부분 이런 것들입니다.
- Git 저장소 주소와 접근 권한
- 배포 서비스 계정 (Vercel, AWS 등)
- 환경 변수 목록
- 데이터베이스 접속 정보
- 간단한 운영 매뉴얼
문제는 이것만으로는 아무것도 할 수 없다는 점입니다. 실제로 코드를 수정하려면 개발자가 필요합니다. 외주사가 계속 유지보수를 맡아준다면 괜찮지만, 다른 개발자로 교체하려고 하면 그 개발자가 먼저 이 코드를 '파악'하는 시간이 필요합니다. 그 파악 비용도 결국 대표가 지불하게 됩니다.
좋은 인수인계는 문서와 코드 리뷰 세션, 주요 기능별 설명 등을 포함해야 하지만, 대부분의 외주 계약에는 이게 포함되지 않습니다.
이유 5: 외주사와의 관계가 끝나면 책임 공백이 생긴다
외주 계약이 끝난 이후의 상황을 생각해보면 구조적 문제가 더 명확해집니다.
외주사는 이미 다음 프로젝트를 진행 중입니다. 이전 프로젝트에서 문제가 발생하면 대응하긴 하지만, 우선순위가 높지 않습니다. "다음 주에 가능하다"는 답변이 흔합니다. 서비스가 당장 안 돌아가는데도요.
추가 계약을 제안받을 수도 있습니다. 다만 이때는 처음 계약할 때보다 단가가 올라가는 경우가 많습니다. 외주사 입장에서는 "유일하게 이 코드를 아는 곳"이 되었으니까요.
그리고 가장 난감한 경우는 외주사 자체가 사라지는 상황입니다. 팀이 해산하거나, 담당자가 퇴사하거나, 아예 회사가 없어지는 경우입니다. 이때 서비스는 말 그대로 '주인 없는 코드'가 됩니다.
외주를 맡기기 전에 준비할 것
이미 외주가 끝난 상태라도 할 수 있는 일이 있고, 아직 외주를 시작하지 않은 단계라면 더 많은 것을 준비할 수 있습니다.
외주 시작 전 (권장)
- 계약서에 문서 작성과 인수인계 범위를 명시합니다
- 기술 스택을 함께 논의하고, 시장에 흔한 기술을 쓰도록 요청합니다 (예: Next.js, React, Node.js)
- 배포/인프라는 외주사 서버가 아닌 본인 계정으로 설정합니다
- 납품 이후 N개월의 유지보수 범위를 계약에 포함합니다
외주 진행 중
- 중요한 의사결정(DB 구조, 인증 방식 등)이 있을 때마다 이유를 기록해두도록 요청합니다
- 정기적으로 Git 저장소에 접근해서 커밋이 제대로 쌓이는지 확인합니다
- 환경 변수와 외부 서비스 계정 정보를 실시간으로 공유받습니다
외주 종료 직전
- 1~2시간 이상의 인수인계 세션을 진행합니다
- 주요 기능별로 "어떤 파일에서, 어떤 흐름으로 동작하는지" 설명을 받습니다
- 알려진 버그/이슈 목록을 받습니다
- 한 번 이상 배포 과정을 함께 진행합니다
이미 외주가 끝난 서비스라면
이 글을 읽고 있는 대부분의 경우, 이미 외주가 끝나고 운영 단계에 들어간 서비스일 것입니다. 그렇다면 이제부터 다음 단계를 밟는 것이 좋습니다.
1. 현재 코드 상태 점검
외주사가 아닌 제3의 개발자에게 코드 리뷰를 받아보세요. 구조적 문제, 보안 취약점, 유지보수성 평가를 포함해 '지금 상태'를 객관적으로 파악하는 것이 첫걸음입니다.
2. 필수 문서 재작성
이미 있는 코드를 보고 최소한의 운영 문서를 만듭니다. 환경 변수, 배포 절차, 주요 기능 흐름 정도면 충분합니다.
3. 운영 파트너 확보
외주사 외에 이 코드를 다룰 수 있는 개발 파트너를 확보합니다. 단건 해결부터 시작하고, 반복 이슈가 충분히 쌓이면 월 구독 운영 파트너를 검토하는 식으로 외주사에만 의존하지 않는 구조를 만드는 것이 중요합니다.
4. 기술 부채 정리 계획
한 번에 리팩토링하지 말고, 새 기능을 추가할 때마다 주변 코드를 조금씩 정리해나가는 방식이 현실적입니다.
LastFix의 역할
LastFix는 특히 이런 상황에서 많이 찾아옵니다.
- 외주로 만든 서비스를 이어받아 운영해야 하는데 내부에 개발자가 없을 때
- 외주사와 연락이 어려워졌거나 단가가 맞지 않을 때
- 처음 보는 코드라 어떻게 손대야 할지 감이 안 올 때
이런 경우 LastFix는 먼저 현재 코드를 점검하고, 무엇이 급하고 무엇이 나중 일인지 범위를 나눠서 제안합니다. 한꺼번에 다 고치지 않아도 됩니다.
단건 해결로 급한 버그부터 처리하고, 반복 이슈가 충분히 쌓이면 월 구독 운영 파트너를 검토하는 방식으로 외주 종속에서 벗어날 수 있습니다.
또한 LastFix가 진행한 작업은 완료일로부터 1년간 같은 범위 안에서 확인되는 문제를 무상 A/S로 지원합니다. 외주 결과물을 이어받아 손대는 입장에서, 적어도 새로 진행한 부분만큼은 책임 공백 없이 가져갈 수 있습니다.
정리
외주 개발 후 유지보수가 어려워지는 이유는 외주사의 잘못이 아니라, 외주라는 계약 구조 자체에 있습니다.
1. 납기 중심 구조 — 유지보수를 고려할 여유가 없음
2. 문서 부재 — 지식이 개발자 개인에게만 있음
3. 기술 스택의 편중 — 다른 개발자가 다루기 어려움
4. 부실한 인수인계 — 코드는 받았지만 운영할 수 없음
5. 관계 종료 후의 공백 — 외주사 의존을 벗어나기 어려움
외주를 시작하기 전이라면 계약서와 문서 요건을 정리하고, 이미 끝났다면 외주사 외의 운영 파트너를 확보하는 것이 첫걸음입니다. 지금 운영 중인 외주 결과물에 손댈 일이 생긴다면, LastFix에 현재 상황을 남기고 점검부터 시작해보세요.