레거시 코드 리팩토링에 대한 생각

레거시코드

요즈음 레거시코드 최신화 작업을 진행하면서 느끼는 생각들에 대해 정리해보고자 합니다.

많은 개발자, 아니 모든 개발자들에게 있어서 레거시코드란 두려움의 대상이지만 쉽사리 개선에 도전하기 어려운 무시무시한 존재라고 생각합니다.
사실 레거시코드의 정의 또한 모호하기도 한데 아래와 같은 코드들을 일반적으로 레거시코드라고 부를수 있겠습니다.

  1. 오래된 기술을 사용한 코드
    • 버전업이 되지 않아 구버전의 코드들로 구현되어있는 코드
    • 오래된 버전의 프로그래밍 언어, 구버전 프레임워크, 구식 설계 패턴
  2. 유지보수가 어려움운 코드
    • 코드의 이해가 어려운 코드
    • 수정하거나 새로운 기능을 추가하기 어려운 코드
  3. 기능 확장이 어려운 코드
    • 코드의 구조가 복잡한 코드
    • 코드간의 의존성이 높은 코드
  4. 최신 보안 및 성능 표준 미적용된 코드
    • 최신 보안 업데이트나 성능 최적화가 적용되지 않은 코드
  5. 중단된 라이브러리 및 프레임워크를 사용하는 코드
    • 새로운 기능 도입이나 버그 수정이 어려움
  6. 히스토리 파악이 어려운 코드
    • 담당자 부재, 문서 부재
  7. 테스트가 어려운 코드
    • 자동화된 테스트 코드가 부족한 코드
    • 테스트하기 어려운 코드 구조를 가지고 있는 코드

사실상 위 케이스들은 레거시코드이자 일반적으로 이야기하는 리팩토링의 대상이라고 볼수도 있을것같습니다. 리팩토링의 주요한 원칙중 하나는 계속 리팩토링해라인데 레거시코드를 놔두면 놔둘수록 점점 리팩토링하기 어려워지는 코드가 되어가는 경험은 모두들 해보셨을것이라 생각합니다.


레거시코드 리팩토링

레거시코드를 리팩토링하는 일은 사실 쉽게 들어가기는 힘든것에 많은 공감을 합니다. 특히 그 레거시가 얼마나 오래되어있고 비즈니스에 특화되어있는지에 따라서 그 어려움은 상상을 초월할것이라고 생각합니다.

하지만 앞으로도 지속가능한 코드유지를 위해서라면 반드시 레거시를 개편하는 일은 필수적인 일이라고 생각합니다. 레거시코드 리팩토링은 다음과 같은 값어치가 있다고 생각합니다.

  1. 기술 부채 해소
    • 레거시 코드는 기술적인 부채를 가지고 있을 가능성이 높음
    • 새로운 기술과 도구들을 사용해 코드를 최신화함으로써 기술 부채를 해소하고, 유지보수성을 향상
  2. 보안 강화
    • 레거시 코드는 오래된 기술과 보안 취약점을 포함할 수 있음
    • 최신 기술을 사용하고 보안 업데이트를 적용하여 시스템 보안 강화
  3. 성능 향상
    • 최신 기술과 최적화된 알고리즘을 도입하여 성능을 향상
    • 대용량 트래픽이나 대규모 데이터 처리가 필요한 시스템에서 성능 최적화를 통해 성능이 크게 향상 될 수 있음
  4. 확장성과 유연성 향상
    • 새로운 요구 사항에 대응 및 더 큰 규모의 시스템으로 확장하기 위한 코드 재설계
    • 모듈화 및 느슨한 결합을 도입하여 유연성을 향상
  5. 유지보수 비용 절감 및 생산성 향상
    • 레거시 코드는 유지보수가 어려움
    • 코드를 최신화를 통해 코드를 이해하고 수정하는 데 드는 시간과 비용 절감
  6. 협업 향상
    • 최신화된 코드기반으로 개발자들 간의 협업을 촉진
    • 새로운 팀원들이 빠르게 프로젝트에 참여 가능

개인적으로는 마지막 6번이 그 무엇보다도 가장 중요한 순기능이라고 생각합니다. 결국 우리 팀원들이 읽기 쉽고 작업하기 쉬운 코드베이스가 만들어져야 무슨일이든 순조롭게 잘 해 나갈수 있을것인데 레거시코드만 있는 팀에서는 작업 효율도 안나고 신규팀원들의 적응에 가장 큰 걸림돌이 되는 주요한 원인이 될 수 있을것입니다.


레거시코드 리팩토링 하기

레거시코드를 리팩토링 하면서 중요하게 고려해야할것들이 있습니다.

  1. 전략적 계획 수립
    리팩토링 규모가 클수록 계획수립이 가장 중요하다고 생각합니다. 리팩토링은 절대 한번에 진행될 수 없기에 어떤 부분을 개편할지, 어떤 기술 및 아키텍쳐를 도입해서 개편할지 또 어떻게 전환할지에 대한 명확한 계획을 수립하는것이 중요합니다.

  2. 레거시 코드 이해 리팩토링 하기 전에 레거시 코드를 깊이 이해할 필요가 있습니다. 보통 레거시코드는 퇴사자가 개발한 경우가 많기 때문에 코드에 대한 정확한 설명을 담당했던 개발자에게 직접 듣기 어려운경우가 있으나 코드의 의도와 기능, 의존성등에 대해서 명확하게 판단후에 신규코드를 작성해야 합니다.

  3. 테스트코드 작성 레거시 코드를 개편하면서 테스트 코드를 작성하는것이 중요합니다. 기존 기능이 변경되지 않았는지, 새로운 기능이 문제를 일으키지 않는지를 확실히 검증하기도 하고 개발자에게 자신감을 심어 줄수있는 주요한 장치라고 생각합니다.

  4. 점진적인 개선 위 계획수립에서와 같이 한번에 신규코드를 전환하기 보다는 점진적인 방식으로 작은 부분부터 시작하여 개선해 나가는 것이 부수효과를 줄이고, 코드들을 검증해가면서 개편할수있는 좋은 방식이 될 수 있습니다.

  5. 새로운 기술 도입 코드를 리팩토링하면서 과거의 기술및 아키텍쳐들을 그대로 사용한다면 크게 의미가 없을수도 있습니다. 향후 유지보수성 향상을 위해서 신규 기술에 대한 스터디 및 스킬 증진을 통해 검토후 도입하는것을 고려해봐야합니다.

  6. 변경 관리와 롤백 전략 점진적인 개선과 함께 언제든지 롤백할 수 있는 전략과 변경 관리 계획이 필요합니다. 생각하지 못한 문제가 발생했을때 빠르게 대처할 수 있는 방안을 미리 마련해두어야 합니다.


마무리

레거시코드 개편작업을 진행하면서 왜 해야하는가?, 어떻게 해야하는가? 에 대한 물음에 대해 스스로 정리해보았습니다. 혹시 동일하게 고민하고 계신분께 도움이 될 수 있다면 좋겠습니다.