레거시 코드 3개월 리팩토링하면서 배운 것

입사하고 처음 맡은 게 8년 된 모놀리식 서비스였습니다. 테스트도 없고, 주석은 죄다 옛날 담당자 이름만 남아 있고, 빌드하는 데만 20분 걸리는 상태였어요. 팀장님은 "일단 돌아가니까 건드리지 마"라고 했지만 그 상태로 기능 추가를 계속하다간 진짜 큰일 나겠더군요.

첫 달은 아무것도 안 하고 코드만 읽었습니다. 어디서부터 흐름이 시작되는지, 이 함수가 왜 이렇게 생겼는지, 왜 이 모듈이 다른 모듈을 다섯 번 거쳐 호출되는지. 시간 아깝다고 느낄 수 있는데, 이 과정을 건너뛰고 바로 손대면 반드시 갚아야 할 빚이 생깁니다.

두 번째 달부터는 테스트를 먼저 붙였습니다. 기능을 고치기 전에 현재 동작을 고정하는 테스트를 쓰는 방식으로요. 여기서 핵심은 '이상한 동작도 그대로 테스트로 박제한다'였습니다. 원래 그렇게 동작하던 걸 무심코 고쳐버리면 다른 데서 터지니까요.

세 번째 달에 리팩토링을 시작했는데, 원칙은 두 개만 지켰습니다.

  • 한 번에 하나만 바꾼다: 구조를 바꾸면 로직은 안 건드리고, 로직을 바꾸면 구조는 그대로 둔다.
  • 커밋은 작게, 배포는 자주: 거대한 PR 하나보다 작은 PR 열 개가 리뷰도 쉽고 롤백도 쉽습니다.

결과적으로 빌드 시간은 20분에서 4분으로 줄었고, 무엇보다 기능 추가할 때 겁이 안 나게 됐습니다. 성능이 극적으로 좋아진 건 아니지만 그게 목적도 아니었고요.

돌아보면 가장 도움이 된 건 "리팩토링은 코드를 예쁘게 만드는 게 아니라 변경을 안전하게 만드는 일"이라는 관점이었습니다. 같은 상황에 계신 분들 있으면, 일단 테스트부터 붙이시는 걸 추천합니다.

작성자 데이터덕후552

10 개의 답변

이거 맞음ㅋㅋ 특히 첫 달 코드만 읽기 진짜 중요한데 다들 시간 아깝다고 스킵함

작성자 스타트업러306 · ▲0

3개월 만에 8년 된 모놀리스를 손댈 수 있는 상태로 만든 것 자체가 대단한데요. 저희 팀은 비슷한 상황에서 '일단 돌아가니까' 하다가 2년 뒤에 결국 다 갈아엎었습니다. 그때 테스트라도 있었으면 최소 반년은 아꼈을 거예요.

작성자 호기심천국316 · ▲0