[Legacy to Modernization] 3. Language Context Switching에 따른 작업 효율성 고려하기

서론

최근, CodeIgnitor 1.0 beta & 언더바 템플릿 2개의 고대 유물적인 Framework를 섞어서 하나로 만들어 놓은 요상한 FrameWork 기반의 Legacy PHP Web Application을 Next.Js(Front)와 SpringBoot(Back)으로 분리하며 Converting 작업을 진행하고 있습니다.

 

컨버팅 작업 자체는 큰 리소스를 요구하지 않지만, 유지보수도 함께 진행해야 한다는 점에서 문제가 발생합니다. 코드 컨벤션이 전혀 지켜지지 않은 과거의 스파게티 코드와 에일리언 코드를 분석하고, 이를 Java Spring 진영에서 재구현하는 과정에서 유지보수 작업이 들어오면 다시 PHP로 돌아가야 하는 반복적인 행위가 이어집니다. 이러한 언어 컨텍스트 스위칭은 작업 효율성과 업무 집중도를 크게 떨어뜨려 극한의 비효율성을 체감하게 만들었습니다.

이에 따라, 언어 컨버팅을 동반하는 고도화 또는 리팩토링 작업 시 작업 효율성을 고려할 수 있는 방향성을 제시하고자 합니다.


본론

1. 언어 컨텍스트 스위칭의 문제점 파악

언어 컨텍스트 스위칭은 개발자가 작업 중인 언어 또는 프레임워크를 변경할 때 발생하는 인지적 부담을 의미합니다. PHP에서 Java로, 다시 JavaScript로 전환하는 과정에서 개발자는 각 언어의 문법, 라이브러리, 개발 환경 등을 다시 적응해야 합니다. 이러한 반복은 작업 흐름을 끊고 생산성을 저하시킬 뿐만 아니라, 실수 발생의 가능성도 높입니다.

특히 레거시 시스템에서는 코드의 가독성과 구조가 불량한 경우가 많아 분석에 더 많은 시간이 소요됩니다. 스파게티 코드와 에일리언 코드를 이해하고 이를 현대적인 언어와 프레임워크로 변환하는 과정은 상당한 인지적 부담을 가중시킵니다.

2. 작업 효율성 향상을 위한 전략

2.1 현실적인 작업 분담과 문서화의 중요성

이상적으로는 여러 개발자가 투입될 수 있는 상황에서 작업 단위를 잘게 쪼개어 모듈화하고, 유지보수와 컨버팅 작업을 명확히 구분하여 각 작업에 대한 목표와 범위를 설정한 후 분배하면 효율적입니다. 하지만 대부분의 회사는 그런 여력이나 상황이 주어지지 않습니다.

따라서 현실적인 대안으로 유지보수를 진행하면서 기존 레거시 코드에 대한 철저한 문서화를 진행하는 것이 중요합니다. 이를 통해 향후 언어 컨텍스트 스위칭 시 유지보수에 참여하지 않았던 개발자도 비즈니스 플로우를 이해할 수 있게 됩니다. 문서화에는 다음과 같은 요소를 포함해야 합니다.

  • 비즈니스 로직의 흐름도 작성: 기능 단위로 로직이 어떻게 진행되는지 시각화합니다.
  • 주석 및 코드 설명 추가: 복잡한 코드나 이해하기 어려운 부분에 상세한 주석을 남깁니다.
  • API 명세서 작성: 기존 시스템의 입력과 출력, 처리 과정을 문서화합니다.
  • 변경 이력 관리: 코드 변경 사항과 그 이유를 기록하여 추후 추적이 가능하도록 합니다.

2.2 기능 단위의 모듈화와 스크럼 방식의 도입

레거시 시스템에서는 기능에 대한 히스토리 관리 이력이 남아있지 않은 경우가 많습니다. 이러한 상황에서 새로운 UI를 담은 클라이언트 애플리케이션을 개발하는 기획자, 디자이너, 프론트엔드 개발자들은 기능 단위로 모듈화된 비즈니스 로직을 하나씩 RESTful한 API로 구현해 나가는 것이 중요합니다.

이를 위해 다음과 같은 전략을 도입할 수 있습니다.

  • 기능별 우선순위 설정: 비즈니스 중요도에 따라 구현해야 할 기능의 우선순위를 정합니다.
  • 스크럼 방식의 애자일 도입: 짧은 개발 주기로 기능을 개발하고 검토하는 스크럼 방식을 통해 팀원 간의 협업을 강화합니다.
  • 공동의 코드 스타일과 규칙 수립: 코드 컨벤션을 통일하여 협업 시 발생하는 혼란을 최소화합니다.
  • 테스트 주도 개발(TDD): 각 기능에 대한 테스트 코드를 작성하여 안정성을 확보합니다.

2.3 개발 환경의 일관성 유지

언어 컨텍스트 스위칭으로 인한 부담을 줄이기 위해 개발 환경의 일관성을 유지하는 것도 중요합니다.

  • 통합 개발 환경(IDE) 사용: PHP, Java, JavaScript를 모두 지원하는 IDE를 사용하여 언어 전환 시에도 익숙한 환경을 유지합니다.
  • 자동화된 빌드 및 배포 파이프라인 구축: CI/CD 도구를 활용하여 빌드와 배포 과정을 자동화합니다.
  • 테스트 코드 작성: 인터프리터 기반 언어에서 컴파일 기반 언어로의 컨버팅에서 가장 중요하다고 생각하는 것이 저는 테스트 코드 작성이라고 생각합니다. 유지보수를 진행하면서도 틈틈히 작성해놓은 테스트 코드는, 타 언어로 재작성할 때 빛을 봅니다.

2.4 팀 내 지식 공유와 교육

  • 정기적인 코드 리뷰 세션: 팀원들이 서로의 코드를 리뷰하면서 지식을 공유하고 코드 품질을 높이는 것도 중요합니다.
  • 교육 프로그램 운영: 새로운 언어와 프레임워크에 대한 교육은 팀원들의 역량을 강화할 수 있고, 이런 교육을 운영하는 회사의 팀원 이탈율은 그렇지 않은 회사보다 상당히 적을 것이라 확신합니다.
  • 기술 블로그나 위키 운영: 팀 내에서 발견한 문제와 해결 방법을 공유하여 collective intelligence를 형성하는 문화를 가져보는것을 추천드립니다.

결론

레거시 시스템의 현대화 작업에서 언어 컨텍스트 스위칭은 피할 수 없는 도전이라 생각합니다. 그리고 모든 기업체가 그렇겠지만, 제한된 자원과 인력으로 이 문제를 극복하기 위해서는 현실적인 전략이 필요합니다. 유지보수 과정에서의 철저한 문서화, 기능 단위의 모듈화, 스크럼 방식의 도입, 개발 환경의 일관성 유지, 그리고 팀 내 지식 공유와 교육을 통해 작업 효율성을 높일 수 있습니다.

궁극적으로 이러한 노력은 개발자들의 인지적 부담을 줄이고, 생산성을 향상시키며, 높은 품질의 소프트웨어를 제공하는 데 기여할 것입니다. 레거시 시스템의 현대화는 단순히 기술적인 변환을 넘어 조직 문화와 작업 방식의 혁신을 요구합니다. 지속적인 개선과 협업을 통해 성공적인 전환을 이뤄낼 수 있을 것입니다.