1.5.4.1.2 레거시 코드의 안전한 교체를 위한 테스트 커버리지(Test Coverage) 선별적 확보

1.5.4.1.2 레거시 코드의 안전한 교체를 위한 테스트 커버리지(Test Coverage) 선별적 확보

개발자들 사이에서 낡고 비효율적인 레거시(Legacy) 시스템을 마이크로서비스(MSA) 기반의 신규 아키텍처로 넘기는 리팩토링(Refactoring) 과정은 흔히 ’비행 중인 여객기의 제트 엔진을 갈아 끼우는 작업’에 비유된다.

이토록 위험천만한 수술을 장비의 다운타임(Downtime) 없이 감행해야 할 때, 엔지니어와 기업이 추락하지 않도록 붙잡아주는 유일하고도 절대적인 생명줄은 코드가 기존처럼 똑같이 동작하고 있음을 보증해 주는 ’자동화된 테스트 셋(Automated Test Suite)’뿐이다.

1. 테스트 없는 레거시의 공포와 회귀(Regression) 방어망

소프트웨어 공학의 대가 마이클 페더스(Michael Feathers)는 자신의 명저에서 “레거시 코드란 오래된 코드가 아니라, 단순히 ’테스트 코드가 없는 코드’를 의미한다“고 정의한 바 있다.

  • 미지의 부작용(Side Effect)에 대한 공포: 부채로 얽힌 스파게티 시스템에서는 함수 하나를 수정했을 때, 전혀 연관성 없어 보이는 다른 쪽의 결제 로직이나 모터 제어 기능이 끊어지는 일이 다반사로 일어난다. 단위 테스트(Unit Test)가 없다면 내 수정 사항이 기존 기능을 파괴했는지(회귀 버그, Regression Bug)를 배포 전까지 알 방법이 없다.
  • 테스트 케이스의 선제적 구축: 따라서 최고기술책임자(CTO)는 모듈 교체 명령을 내리기 전, 기존 레거시 코드의 현재 입출력(Input/Output) 패러미터를 그대로 캡처하여 **‘블랙박스 테스트(Black-box Test) 안전망’**을 먼저 치도록 조치해야 한다. 구명조끼를 입고 나서야 비로소 칼을 대는 것이 리팩토링의 1원칙이다.

2. 야전 병원식 환자 분류(Triage)와 선별적 커버리지 확보

테스트의 중요성을 절감한 주니어 리더들은 흔히 “모든 레거시 코드의 테스트 커버리지를 100% 달성하고 나서 교체합시다“라는 순진하고 파멸적인 목표를 세운다.

  • 완벽주의의 함정: 이미 엉망으로 짜인 레거시 코드에 억지로 테스트 계층을 욱여넣어 커버리지를 100%로 끌어올리는 작업은, 비즈니스 기능을 단 하나도 추가하지 못하면서 팀의 리소스를 반년 이상 허비하게 만드는 엄청난 낭비다.
  • 크리티컬 패스(Critical Path) 중심의 가치 투자: CTO는 전쟁터의 야전 병원 군의관처럼 자원을 선별적으로 배분해야 한다. 전체 회사 매출의 90%가 발생하는 ’결제 및 과금 모듈’이나 시스템 다운 시 기계가 박살 날 수 있는 ’충돌 회피 제어 모듈’과 같은 크리티컬 코드에는 테스트 자원을 집중 폭격해 커버리지 80% 이상의 견고한 벙커를 구축해야 한다.
  • 전략적 포기와 방치: 반면, 한 달에 한 번 접속하는 관리자용 사내 통계 대시보드 화면이나, 에러가 나더라도 단순히 로고 이미지가 깨지는 정도의 모듈에 대해서는 **과감하게 테스트 작성을 포기하고 버그 발생 시 수동으로 고치는 전략적 방치(Strategic Neglect)**를 승인하는 결단력을 발휘해야 한다.

3. 결론

“완벽주의는 실전 배포의 가장 큰 적이다.” 테스트 코드를 작성하고 커버리지(Coverage) 숫자를 올리는 행위 그 자체가 고객에게 돈을 받아다 주지는 않는다. CTO는 테스트 작성의 궁극적인 목적이 ’보고서에 올릴 아름다운 숫자의 달성’이 아니라, ’엔지니어가 코드를 수정하고도 밤에 발 뻗고 잘 수 있는 두려움 없는 배포 환경(Fearless Deployment)의 구축’임을 명확히 각인시켜야 한다. 비즈니스 파괴 리스크가 높은 모듈 중심으로 선별적 방어벽을 쌓아 올릴 때, 레거시 교체 작업은 비로소 안전 궤도에 오를 수 있다.

참고 문헌 및 추천 논문:

  • Feathers, M. (2004). Working Effectively with Legacy Code. Prentice Hall.
  • Fowler, M. (1999). Refactoring: Improving the Design of Existing Code. Addison-Wesley.
  • Meszaros, G. (2007). xUnit Test Patterns: Refactoring Test Code. Addison-Wesley.