
로마군 요새의 기생충, 그리고 우리가 마주한 '레거시'의 진실
로마군의 최첨단 인프라도 막지 못한 기생충 감염 사례를 통해, 소프트웨어 개발 환경에서의 '기술적 부채'와 '개발 위생 습관'의 중요성을 통찰해 봅니다.
최PM
시니어 Product Manager

안녕하세요. 풀링포레스트에서 시니어 Product Manager로 일하고 있는 최PM입니다.
최근 흥미로운 고고학 기사 하나를 접했습니다. 영국 하드리아누스 성벽 근처의 로마 요새 '빈돌란다(Vindolanda)'의 하수구 퇴적물을 분석한 결과, 당시 로마 병사들이 심각한 수준의 기생충 감염에 시달렸다는 내용이었습니다. 회충, 편충은 물론이고 설사를 유발하는 '지아르디아(Giardia)'라는 원생동물까지 검출되었다고 하더군요.
사실 조금 놀라웠습니다. 로마는 당대 최고의 공중보건 인프라를 갖춘 문명이었으니까요. 그들은 정교한 목욕탕과 수세식 변기, 하수도 시스템을 구축했습니다. 하지만 연구 결과는 냉혹했습니다. "최첨단 인프라가 있었음에도 불구하고, 위생 상태는 끔찍했다"는 것이죠. 병사들은 만성적인 복통과 영양실조 속에서 근무를 서야 했습니다.
이 기사를 읽으며 묘한 기시감을 느꼈습니다. 겉보기에 화려한 인프라를 갖췄지만, 속으로는 '기술적 부채(Technical Debt)'라는 기생충에 시달리며 신음하던 과거 저의 프로젝트가 떠올랐기 때문입니다.
최고의 도구가 최악의 결과를 막지 못할 때
몇 년 전, 제가 담당했던 프로덕트 팀은 소위 '차세대 시스템' 구축에 한창이었습니다. 우리는 레거시 모놀리식(Monolithic) 구조를 탈피하기 위해 MSA(Microservices Architecture)를 도입했고, 배포 자동화를 위해 최신 CI/CD 파이프라인을 구축했습니다. 협업 툴도 가장 비싼 엔터프라이즈급 SaaS로 교체했죠.
팀원들은 들떴습니다. "이제 우리도 구글이나 넷플릭스처럼 일할 수 있다"는 기대감이 팽배했습니다. 로마군이 견고한 돌로 지은 수세식 변기를 보며 느꼈을 자부심과 비슷했을 겁니다.
하지만 6개월 뒤, 상황은 처참했습니다. 서비스 간의 통신 오류는 빈번했고, 트랜잭션 정합성은 깨지기 일쑤였습니다. 장애가 터지면 원인을 찾는 데 전보다 세 배 이상의 시간이 걸렸습니다. 개발자들은 "코드를 건드리는 게 무섭다"며 호소했습니다.
솔직히 고백하자면, 그때 저는 PM으로서 큰 무력감을 느꼈습니다. '왜 최고의 인프라를 깔아줬는데, 생산성은 더 떨어지고 버그(기생충)는 들끓는가?'라는 질문에 답을 할 수 없었기 때문입니다.
'시스템'이 아니라 '위생 습관'의 부재
빈돌란다 요새의 연구진은 로마 병사들의 감염 원인으로 '손 씻기 같은 개인 위생 습관의 부재'와 '오염된 음식물'을 지목했습니다. 하수도로 오물을 흘려보내는 시스템은 있었지만, 그 변기를 쓰고 난 뒤 손을 씻지 않고 빵을 집어 먹는 행위까지 시스템이 막아주진 못한 겁니다.
소프트웨어 개발도 마찬가지였습니다. 우리 팀은 MSA라는 '하수도'는 팠지만, 코드를 작성하는 '손 씻기' 습관은 여전히 구시대적이었습니다.
리뷰 없는 커밋(Commit): 바쁘다는 핑계로 PR(Pull Request) 리뷰는 "LGTM(Looks Good To Me)"으로 도배되었습니다. 오염된 로직이 그대로 메인 브랜치로 흘러들어갔습니다.
테스트 코드의 부재: 자동화 파이프라인은 있었지만, 그 위를 달리는 테스트 케이스는 빈약했습니다. 거름망 없는 하수구에 온갖 쓰레기가 들어가는 꼴이었습니다.
문서화의 실종: 서비스는 쪼개졌는데, API 명세서는 업데이트되지 않았습니다. 옆자리의 동료가 무슨 코드를 짜는지 모르는 '사일로(Silo)' 현상이 심화되었습니다.
결국 우리는 시스템의 구조(Architecture)만 바꿨지, 팀의 개발 문화(Culture)와 위생(Hygiene)은 바꾸지 못했던 것입니다.
디지털 기생충을 박멸하는 '손 씻기'
이 뼈아픈 실패를 겪은 후, 저는 팀과 함께 화려한 도구 도입을 멈추고 기본으로 돌아갔습니다. 우리가 도입한 '디지털 손 씻기' 원칙은 다음과 같았습니다.
첫째, 가시성(Visibility) 확보입니다. 로마인들은 기생충의 존재를 어렴풋이만 알았지만, 우리는 알 수 있습니다. SonarQube 같은 정적 분석 도구를 파이프라인에 강제로 태워, '코드 냄새(Code Smell)'가 기준치를 넘으면 배포 자체가 안 되도록 막았습니다.

둘째, 엄격한 'Definition of Done(완료의 정의)'입니다. 기획자인 저부터 요구사항을 명확히 했고, 개발팀은 "테스트 코드가 작성되지 않은 기능은 개발이 완료된 것이 아니다"라는 원칙을 세웠습니다. 아무리 급해도 손을 씻지 않으면 식탁에 앉을 수 없는 것과 같은 이치입니다.
셋째, 작은 단위의 회고(Retrospective)입니다. 거창한 분기별 리뷰가 아니라, 스프린트 단위로 "이번 배포에서 우리를 괴롭힌 기생충(버그)은 무엇이었나?"를 집요하게 파고들었습니다.
마치며: 화려한 변기보다 중요한 것
연구에 따르면 로마 병사들은 만성적인 설사로 인해 전투력이 크게 저하되었을 것이라 합니다. 오늘날 우리 개발 조직도 마찬가지입니다. 레거시 코드와 잦은 장애라는 기생충은 팀의 리소스를 갉아먹고, 결국엔 번아웃을 유발합니다.
주니어 개발자나 이제 막 매니징을 시작한 분들께 꼭 드리고 싶은 말씀이 있습니다. Cursor나 Github Copilot 같은 최신 AI 도구가, 혹은 MSA 같은 화려한 아키텍처가 여러분의 문제를 해결해 줄 거라 맹신하지 마십시오.
로마의 수세식 변기가 병사들의 회충을 막아주지 못했듯, 도구 자체가 코드의 품질을 담보하진 않습니다. 우리를 건강하게 만드는 것은 매일매일 지키는 지루하고 사소한 원칙들—꼼꼼한 코드 리뷰, 이름 짓기에 대한 고민, 로그 한 줄을 대하는 태도—입니다.
오늘 여러분의 코드는 안녕하신가요? 혹시 화려한 IDE 속에 기생충을 키우고 있지는 않은지, 잠시 멈춰 살펴볼 때입니다.


