레거시 코드란 여전히 그 목적을 달성하고 있지만, 현재는 구식인 기술로 개발된 소프트웨어 코드를 말합니다. 여기에는 다른 팀이나 이전 소프트웨어 버전에서 상속받은 코드와 더 이상 적극적으로 지원되거나 유지 관리되지 않는 소스 코드가 포함됩니다. 또한 구식 하드웨어 또는 운영 체제, 단종된 컴파일러 또는 애플리케이션 프로그래밍 인터페이스(API), 오래된 프로그래밍 언어 또는 소프트웨어 개발 환경을 사용하여 작성된 코드도 포함됩니다. 그 결과 레거시 코드는 더 이상 새로운 코딩 표준, 최신 소프트웨어 설계 원칙 또는 최신 컴퓨팅 아키텍처를 준수하지 않습니다.
Michael Feathers는 2004년에 출간된 그의 저서 레거시 코드 활용 전략(Working Effectively with Legacy Code)에서 '테스트 없는 코드'라는 또 다른 설명을 제시했습니다.1 레거시 코드의 이러한 정의는 프로그래머가 코드가 예상대로 작동하는지 확인할 방법이 없음을 의미합니다. 또한 많은 레거시 시스템에는 동작을 이해하는 데 필수적인 적절한 문서가 부족하여 개발자가 시스템을 확장하거나 개선하는 데 많은 어려움을 겪습니다.
레거시 코드는 지속적인 코드 유지보수를 통해 시간이 지남에 따라 '상환'해야 하는 기술 부채의 원인이 됩니다. 다음은 조직이 레거시 코드를 유지보수하는 동안 직면할 수 있는 몇 가지 일반적인 문제점입니다.
● 적응성
● 비용
● 성능
● 확장성
● 보안 및 규정 준수
레거시 코드는 구식이기 때문에 최신 시스템과 호환되지 않거나 통합하기 어려울 수 있습니다. 이러한 적응성 부족은 혁신을 저해하고 비즈니스 성장을 둔화시켜 잠재적으로 기업의 경쟁력을 잃게 할 수 있습니다.
레거시 시스템은 유지보수 비용이 많이 들 수 있습니다. 이러한 운영 및 유지보수 비용은 누적될 수 있으며, 구형 소프트웨어와 하드웨어 버전에 대한 타사 지원 비용이 증가할 수 있습니다. 더욱이 구식 컴퓨팅 방식이나 프로그래밍 언어에 능숙한 개발자를 찾는 일도 쉽지 않으며, 비용도 많이 듭니다.
투박한 모놀리식 아키텍처는 지연 시간이 길고 응답 시간이 느리며 가동 중지 시간이 잦은 결과를 초래합니다. 이러한 성능 저하로 사용자 경험에 부정적인 영향을 미쳐 고객 만족도가 낮아질 수 있습니다. 또한 이러한 시스템으로 작업을 수행하고 이를 유지보수하는 팀 구성원의 생산성과 효율성을 저해할 수 있습니다.
오래된 시스템은 사용자 부하가 증가할 수 있습니다. 급증하는 수요를 충족하고 필요에 따라 규모를 확장하거나 축소하는 데 어려움을 겪을 수 있습니다. 또한 긴밀하게 결합된 구성 요소로 인해 기존 기능을 업그레이드하거나 새로운 피처를 추가하기가 어렵습니다.
오래된 코드는 보안 패치로 적극적으로 업데이트되지 않고 최신 보안 표준을 따르지 않아 사이버 공격과 침해에 취약할 수 있습니다. 또한 레거시 시스템은 최신 규정을 준수하지 않을 수도 있습니다.
레거시 애플리케이션을 현대화하려면 신중한 계획이 필요합니다. 다음은 프로세스를 간소화하는 데 도움이 되는 5단계 방법론입니다.
● 코드베이스 이해
● 분할 및 정복
● 특성화 테스트 제작
● 리팩터링, 마이그레이션 또는 재작성
● 테스트 및 문서화
첫 번째 단계는 코드베이스를 이해하는 것인데, 보통 가장 어려운 부분입니다. 요구 사항 문서, 인라인 코드 댓글 또는 커밋 로그나 변경 로그와 같은 버전 관리 기록 등 사용 가능한 모든 문서를 검토하는 것부터 시작하세요.
문서가 충분하지 않은 경우 코드를 실행하지 않고도 자동으로 코드를 검사하는 정적 코드 분석 툴을 사용해 보세요. 또한 코드 시각화 툴은 소스 코드 구조를 그래픽으로 표현하여 요소 간의 종속성과 상호작용을 매핑하는 데 도움이 됩니다.
소프트웨어 개발 팀이 레거시 시스템을 충분히 이해하면 문제를 해결할 수 있습니다. 이렇게 방대한 코드베이스는 다루기 부담스러울 수 있으므로 더 작고 관리하기 쉬운 모듈로 나누고 한 번에 한 모듈씩 작업하세요.
테스트는 일반적으로 코드의 정확성과 의도된 동작의 검증을 위해 작성됩니다. 그러나 특성화 테스트는 코드가 수행하는 작업과 작동 방식을 이해하기 위해 생성됩니다. 이는 레거시 코드를 이해하는 데 유용합니다.2
기업은 일반적으로 레거시 코드를 현대화할 때 리팩터링, 마이그레이션 또는 재작성의 세 가지 옵션을 선택할 수 있습니다. 또한 이러한 접근 방식을 결합할 수도 있습니다. 어떤 경로를 추구할지 결정하려면 소프트웨어 엔지니어링 팀과 비즈니스 리더십 팀 모두의 참여가 필요합니다.
코드 리팩터링은 소스 코드의 외부 동작을 수정하거나 기능에 영향을 주지 않고 내부 구조를 변경합니다. 이러한 작은 변경으로 버그 발생 가능성이 적고 유지보수가 더 쉬운 명확하고 깔끔한 코드를 만들 수 있습니다.
레거시 코드의 경우, 팀은 변수 이름 바꾸기, 중복되거나 사용하지 않는 방법 제거, 서식 표준화 등 각 모듈에 대한 미세한 수정부터 시작할 수 있습니다. 그런 다음 큰 방법을 작은 방법으로 나누고, 복잡한 조건을 단순화하고, 함수 간에 피처를 이동하여 종속성을 줄이고 일관성을 강화하는 등 보다 논리 기반의 재구성을 진행할 수 있습니다.
마이그레이션은 레거시 코드를 현대화하는 또 다른 경로입니다. 여기에는 모놀리식 아키텍처에서 마이크로서비스로 전환하거나 온프레미스에서 클라우드로 전환하는 등 코드의 전체 또는 일부를 최신 플랫폼이나 기술 스택으로 마이그레이션하는 작업이 수반됩니다. 플랫폼 또는 기술 스택과의 호환성을 확인하고 마이그레이션 중에 공급자가 지원을 제공하는지 확인하는 것이 중요합니다.
레거시 코드 재작성 은 이전 코드를 대체하기 위해 완전히 새로운 코드를 만들어야 하기 때문에 최후의 수단인 경우가 많습니다. 이는 그 자체로 새로운 프로젝트이며, 별도의 개발 팀이 필요할 수도 있는 대규모 작업입니다.
마이그레이션과 재작성 모두 방대한 레거시 코드베이스에서는 어려운 작업이 될 수 있으므로 팀에서는 '스트랭글러 무화과' 전략을 고려할 수 있습니다.3 스트랭글러 무화과는 나무 표면에서 높이 자라며, 뿌리가 땅으로 뻗으면서 줄기로 천천히 숙주 나무를 감싸며 조여 결국에는 시들어 죽게 만듭니다.
레거시 시스템의 경우, 팀은 전체 코드베이스가 최신 프레임워크로 전환되거나 최신 프로그래밍 언어로 개발될 때까지 작은 코드 조각을 점진적으로 마이그레이션하거나 재작성할 수 있습니다. 하지만 팀은 기존 코드와 새 코드가 공존할 수 있도록 과도기적 아키텍처를 구축해야 합니다. 그런 다음 마이그레이션 또는 재작성이 완료되면 이 과도기적 아키텍처는 폐기됩니다.3
리팩터링, 마이그레이션 또는 재작성한 코드를 철저히 테스트하여 버그가 나타나지 않는지 확인하는 것이 중요합니다. 개발자는 자체 통합 및 단위 테스트를 작성할 수 있지만, 기능, 회귀 및 엔드투엔드 테스트를 실행하여 피처와 동작이 손상되지 않았는지 확인할 수 있는 QA 팀의 참여도 필수적입니다.
문서는 현대화 워크플로에서 또 다른 중요한 부분입니다. 인라인 댓글을 통해 코드에 주석을 달거나, 자세한 변경 로그를 작성하거나, 포괄적인 아키텍처 및 설계 문서와 기타 기술 문서를 작성하는 등 소스 코드 변경 사항을 문서화하세요.
레거시 코드 현대화 프로세스의 속도를 높이고 자동화하는 데 도움이 되는 여러 툴이 있습니다. 다음은 몇 가지 일반적인 툴입니다.
● 정적 코드 분석기
● 코드 시각화 애플리케이션
● 테스트 자동화 프레임워크
● 마이그레이션 플랫폼 및 툴킷
● 문서 생성기
코드 시각화 툴은 소스 코드를 그래픽으로 표현하여 특히 규모가 크거나 복잡한 코드베이스의 경우 작동 방식을 더 잘 파악할 수 있도록 합니다. 이러한 그래픽 표현은 코드 맵, 순서도, 통합 모델링 언어(UML) 다이어그램 등 다양한 형식으로 제공됩니다. 코드 시각화 앱의 예로는 CodeScene, CodeSee, Understand 등이 있습니다.
이러한 프레임워크는 자동화된 테스트를 생성 및 실행하고 해당 테스트에 대한 보고서를 생성합니다. 인기 있는 테스트 자동화 프레임워크로는 웹 애플리케이션용 Cypress 및 Selenium과 모바일 앱용 Appium이 있습니다.
이러한 플랫폼과 툴킷은 레거시 시스템의 마이그레이션 워크플로를 간소화하고 자동화하는 데 도움이 됩니다. 몇 가지 주요 마이그레이션 플랫폼으로는 AWS Application Migration Servic, Azure Migrate, Google Cloud Migration Toolkit, IBM Cloud Transformation Advisor 및 애플리케이션용 Red Hat Migration Toolkit 등이 있습니다.
이러한 툴은 소스 코드 및 기타 입력 파일에서 문서를 자동으로 생성합니다. 문서 생성 툴의 예로는 Doxygen, Sphinx,Swimm 등이 있습니다.
인공 지능(AI)은 레거시 코드 현대화를 지원할 수 있습니다. 생성형 AI 애플리케이션은 복잡하거나 거대한 레거시 코드베이스를 분석할 수 있는 대규모 언어 모델(LLM)의 지원을 받습니다.
생성형 AI는 다음과 같은 레거시 코드 현대화 작업을 지원하는 데 사용될 수 있습니다.
● 코드 설명
● 코드 리팩터링
● 코드 변환
● 테스트 생성 및 문서화
생성형 AI는 레거시 코드베이스의 기반이 되는 컨텍스트와 의미를 이해할 수 있습니다. 따라서 프로그래머가 이해할 수 있는 방식으로 코드를 설명하면서 그 이면의 로직과 기능을 개괄적으로 파악할 수 있습니다.
AI 기반 툴은 실시간 리팩터링 권장 사항을 제공할 수 있습니다. 예를 들어 IBM watsonx Code Assistant는 IBM granite 모델을 활용하여 버그와 최적화를 식별합니다. 그런 다음 팀의 기존 코딩 규칙에 부합하는 타겟팅된 수정 사항을 제안하여 코드 리팩터링을 간소화하고 가속화할 수 있도록 지원합니다.
테스트 자동화 프레임워크와 마찬가지로 AI 코딩 어시스턴트도 테스트를 자동으로 생성할 수 있습니다. 또한 인라인 댓글을 만들어 특정 코드 조각이나 스니펫의 기능을 문서화할 수 있습니다.
모든 AI 기반 애플리케이션과 마찬가지로 프로그래머는 레거시 코드를 현대화하기 위해 AI를 사용할 때는 여전히 주의를 기울여야 합니다. 아웃풋의 정확성을 검토하고 제안된 변경 사항 또는 수정 사항을 테스트해야 합니다.
안전한 하이브리드 클라우드 환경 내에서 배포를 가속화하고, 마이그레이션 위험을 줄이며, 클라우드 네이티브 개발을 지원하세요.
생성형 AI를 사용하여 메인프레임 애플리케이션 현대화를 가속화하고 간소화하세요.
IBM Instana Observability는 포괄적인 모니터링과 실행 가능한 인사이트를 제공하여 클라우드 마이그레이션 여정을 간소화합니다.
1 #195 - 레거시 코드와 AI 코딩 어시스턴트로 효과적으로 작업하기 - Michael Feathers, 테크 리드 저널, 2024년 10월 14일
2 특성화 테스트, Michael Feathers, 2016년 8월 8일
3 스트랭글러 무화과, Martin Fowler, 2024년 8월 22일