디지털가람 플랫폼 프로젝트에서, 기존 레거시 코드 리팩토링 경험을 통해 코드 구조와 유지 보수성을 개선한 사례를 소개하고자 합니다.
1. 초기 문제 상황
- 패키지 단위의 모듈화 문제
- 중복 코드와 강한 의존성 문제
- 코드 리뷰 프로세스 부재
2022~2023년도 초반, 디지털가람 플랫폼 개발 초기에는 코드 모듈화가 패키지 단위로 이루어져 있었습니다. 하지만 중복 코드가 많았고, 패키지 간 의존성이 강해 독립적으로 작동해야 할 패키지가 서로 얽혀 있는 문제가 있었습니다. 이러한 문제는 개발 리드의 부재와 코드 리뷰 프로세스의 부재, 그리고 촉박한 일정 속에서 코드 정리가 우선순위에서 밀려나면서 발생했습니다.
결과적으로 플랫폼의 규모가 커지면서 기능이 추가될수록 코드가 복잡해지고, 유지 보수와 확장이 어려워지는 상황에 이르렀습니다.
2. 리팩토링 과정
- 1차 리팩토링: 기능별 분리 시도
- 기능별 분리레거시 코드를 정리하기 위해 처음부터 새로 개발할 수는 없었습니다. 플랫폼은 실시간 서비스 중이었기에 점진적인 접근이 필요했습니다.먼저, 기존 코드를 기능별로 분리하는 작업을 시작했습니다. 중복된 함수를 찾아내 삭제하고, 코드의 일관성을 유지하려 노력했습니다. 하지만 시간 부족과 기존 기능이 정상적으로 작동하지 않는 문제가 발생하면서, 1차 시도는 "모듈화의 세분화"라는 부분적 목표에 그쳤습니다. 이 시점에서는 프로젝트 진행과 병행해야 했기에, 전면적인 개선은 어려웠습니다.
- 2차 리팩토링: 구조적 개선
- 구조적 개선제가 팀장으로 역할을 맡은 후, 주요 기능 개발이 마무리될 시점에 레거시 코드 정리를 본격적으로 진행했습니다.
- 기능 단위 모듈화
- 지도 플랫폼의 특성상 화면 단위로 코드를 분리하기에는 하나의 덩어리가 너무 커지는 문제가 있었습니다. 따라서 기능 단위로 모듈화를 진행했습니다. 지도 관련 기능, 공통 기능 등은 common 폴더로 별도 분리해 재사용성을 높였습니다. 특히, 지도 렌더링과 관련된 반복적인 코드들을 하나의 유틸리티 함수로 통합하여 유지 보수성을 크게 개선했습니다.
- 복사 및 비동기 작업 진행
- 기존에 서비스 중인 코드를 그대로 복사한 뒤, 백그라운드에서 정리 작업을 진행했습니다. 서비스는 실시간으로 운영되고 있었기 때문에, 새로 추가되는 기능들은 구성원들과 협의하여 새롭게 설계된 모듈화 구조에 바로 통합될 수 있도록 했습니다. 또한, 추가된 기능을 수시로 기존 작업에 동기화하며 최신 상태를 유지했습니다. 이를 통해 실시간 서비스에 영향을 주지 않고 리팩토링을 진행할 수 있었습니다.
- 중복 코드 제거와 인터페이스 통일
- 기존 레거시 코드에는 유사한 기능을 수행하는 여러 중복 함수가 존재했습니다. 이를 식별하고 하나의 함수로 통합했으며, 입력값과 반환값의 형식을 표준화해 코드를 사용하는 다른 모듈 간의 인터페이스를 통일했습니다. 예를 들어, 지도 데이터를 불러오는 함수는 파일 형식이나 데이터 소스에 따라 여러 버전이 있었지만, 이를 단일 API로 통합해 관리했습니다.
- 정리 프로세스의 체계화
- 초기에는 제가 틀을 직접 설정하고, 이후 팀원들과 분업하여 각자의 파트에 맞는 코드를 정리하도록 했습니다. 이를 위해 리팩토링 가이드를 문서화하고, 코드 리뷰를 통해 정리 기준을 공유했습니다.
3. 결과 및 성과
- 코드 가독성과 유지보수성 향상
- 코드 라인 수 감소 (100줄 → 30줄)