개발을 하다 보면 흥미로운 현상을 발견한다. 모든 개발자가 레거시 코드를 싫어한다는 것이다.
“이 코드는 너무 복잡해”, “이건 왜 이렇게 짰지?”, “처음부터 다시 짜는 게 나을 것 같은데”라고 말한다. 하지만 정작 레거시 코드를 만나면 어떻게 해야 할지 모르는 경우가 많다.
레거시 코드는 정말 그렇게 나쁠까? 아니면 우리가 레거시 코드를 바라보는 시각이 문제일까?
레거시 코드는 보통 “오래된 코드”라고 정의된다. 하지만 나는 다른 관점에서 바라본다. 레거시 코드는 “과거의 선택”이다.
과거의 개발자가 그때 그 상황에서 최선이라고 생각했던 선택의 결과물이다. 그때는 그게 최선이었을 수도 있다. 하지만 시간이 지나면서 상황이 바뀌었고, 그 선택이 더 이상 최선이 아니게 되었다.
이것이 바로 레거시 코드의 본질이다. 시간의 흐름에 따라 변하는 것이다.
개발자들이 레거시 코드를 두려워하는 이유는 여러 가지가 있다.
첫 번째는 이해하기 어렵다는 것이다. 코드가 복잡하고, 주석이 없고, 변수명이 이상하다. 그래서 코드를 읽고 이해하는 데 시간이 오래 걸린다.
두 번째는 수정하기 어렵다는 것이다. 한 부분을 수정하면 다른 부분에 영향을 줄 수 있다. 그래서 수정할 때마다 신중해야 한다.
세 번째는 테스트하기 어렵다는 것이다. 테스트 코드가 없거나, 테스트 코드가 있더라도 제대로 동작하지 않는다.
하지만 이런 문제들은 레거시 코드 자체의 문제가 아니라, 우리가 레거시 코드를 바라보는 시각의 문제일 수도 있다.
레거시 코드에는 가치가 있다. 첫 번째는 비즈니스 로직이다. 오래된 코드일수록 실제 비즈니스 요구사항을 반영하고 있다. 새로운 코드보다 더 안정적일 수 있다.
두 번째는 학습의 기회다. 레거시 코드를 분석하면서 과거의 개발자가 어떤 생각으로 코드를 짰는지 알 수 있다. 그리고 그 과정에서 새로운 것을 배울 수 있다.
세 번째는 점진적 개선의 기반이다. 레거시 코드를 완전히 새로 짜는 것보다, 점진적으로 개선해나가는 것이 더 현실적이다.
레거시 코드를 수정하기 전에 먼저 이해해야 한다. 코드가 왜 이렇게 되어 있는지, 어떤 문제를 해결하려고 했는지 파악해야 한다.
이해하는 과정에서 주석을 추가하고, 변수명을 개선하고, 코드를 정리할 수 있다. 이것이 바로 점진적 개선의 시작이다.
레거시 코드를 수정하기 전에 테스트를 추가해야 한다. 테스트가 있어야 수정할 때 안전하다.
테스트를 추가하는 과정에서 코드의 동작을 더 잘 이해할 수 있다. 그리고 테스트가 추가되면 코드의 신뢰성이 높아진다.
레거시 코드를 한 번에 모두 바꾸려고 하지 말고, 작은 단위로 개선해나가야 한다.
한 번에 하나의 함수나 클래스만 개선하고, 그 개선이 안전한지 확인한 후 다음 단계로 넘어간다. 이렇게 하면 리스크를 최소화할 수 있다.
레거시 코드와 새로운 코드 사이에 명확한 경계를 만들어야 한다.
새로운 기능은 새로운 코드로 작성하고, 레거시 코드는 점진적으로 개선해나간다. 이렇게 하면 레거시 코드의 영향을 최소화할 수 있다.
레거시 코드를 분석하면서 배울 수 있는 것들이 많다.
첫 번째는 비즈니스 도메인에 대한 이해다. 오래된 코드일수록 실제 비즈니스 요구사항을 반영하고 있다. 코드를 분석하면서 비즈니스 도메인을 더 잘 이해할 수 있다.
두 번째는 기술적 선택의 결과다. 과거의 개발자가 어떤 기술을 선택했고, 그 선택이 어떤 결과를 가져왔는지 알 수 있다. 그리고 그 경험을 바탕으로 더 나은 선택을 할 수 있다.
세 번째는 팀워크의 중요성이다. 레거시 코드는 여러 개발자가 함께 만든 결과물이다. 코드를 분석하면서 팀워크의 중요성을 깨달을 수 있다.
레거시 코드는 단순히 오래된 코드가 아니다. 레거시 코드는 시간의 흐름을 담고 있는 코드다.
과거의 개발자가 그때 그 상황에서 최선이라고 생각했던 선택의 결과물이다. 그리고 그 선택에는 그때의 제약사항과 요구사항이 반영되어 있다.
레거시 코드를 이해한다는 것은 과거의 개발자를 이해한다는 것이다. 그리고 그 이해를 바탕으로 더 나은 미래를 만들어갈 수 있다.
레거시 코드는 피해야 할 대상이 아니라, 현실이다.
레거시 코드를 두려워하지 말고, 이해하려고 노력하자. 그리고 그 이해를 바탕으로 점진적으로 개선해나가자.
레거시 코드와 공존하는 방법을 배우면, 더 나은 개발자가 될 수 있다. 그리고 그 경험은 미래의 레거시 코드를 만드는 것을 방지할 수 있다.
레거시 코드는 과거의 선택이지만, 미래의 선택은 우리가 만든다. 그리고 그 선택이 더 나은 미래를 만들어갈 것이다.