DMARF와 GIPSY 리팩터링 연구
초록
본 보고서는 분산형 모듈형 오디오 인식 프레임워크(DMARF)와 일반 인텐셔널 프로그래밍 시스템(GIPSY)의 내부 구조를 개선하기 위해 코드 스멜을 탐지하고, 적절한 디자인 패턴을 적용한 뒤 리팩터링을 수행한다. Logiscope와 JDeodorant를 활용해 문제점을 식별하고, 테스트 케이스를 통해 기능 변형 여부를 검증한다.
상세 분석
DMARF와 GIPSY는 각각 음성 인식 파이프라인과 다중 언어 프로그래밍 환경을 제공하는 대규모 오픈소스 프로젝트이다. 두 시스템 모두 모듈화와 확장성을 목표로 설계되었지만, 장기간 유지보수 과정에서 코드 복잡도 증가, 중복 로직, 과도한 의존성 등 다양한 코드 스멜이 누적되었다. 보고서는 먼저 Eclipse IDE에서 프로젝트를 빌드하고 실행함으로써 전체 아키텍처를 파악한다. DMARF는 프리프로세싱, 피처 추출, 분류, 포스트프로세싱 단계로 구성된 파이프라인이며, 각 단계는 인터페이스 기반의 플러그인 구조를 사용한다. GIPSY는 GIPSY Execution Engine(GEE), GIPSY Compiler(GIC), 그리고 분산 런타임인 GIPSY Node 등으로 이루어진 계층형 구조를 갖는다.
코드 스멜 탐지는 Logiscope의 메트릭(복잡도, 결합도, 응집도)과 JDeodorant의 자동 감지를 결합해 수행하였다. 주요 발견 사항은 다음과 같다. ① God Class: DMARF의 AudioProcessor와 GIPSY의 GEE 클래스가 지나치게 많은 책임을 가지고 있어 유지보수가 어려웠다. ② Long Method: 여러 메서드가 200줄을 초과하며, 조건문이 중첩돼 가독성이 저하되었다. ③ Feature Envy: 특정 메서드가 다른 클래스의 필드에 과도하게 접근해 클래스 간 경계가 흐려졌다. ④ Duplicate Code: 여러 모듈에서 동일한 파일 입출력 로직이 복제돼 있었다.
디자인 패턴 분석 단계에서는 기존 코드에 이미 적용된 패턴을 식별하고, 부족한 부분에 적합한 패턴을 도입했다. 예를 들어, Factory Method와 Abstract Factory를 이용해 DMARF의 플러그인 생성 로직을 캡슐화하고, Strategy 패턴을 적용해 GIPSY의 실행 전략을 동적으로 교체할 수 있게 했다. 또한, Observer 패턴을 도입해 노드 상태 변화를 비동기적으로 전파함으로써 결합도를 낮추었다.
리팩터링 구현은 JDeodorant가 제안한 Extract Class, Extract Method, Move Method, Replace Conditional with Polymorphism 등을 중심으로 진행되었다. AudioProcessor를 Preprocessor, FeatureExtractor, Classifier 등으로 분리하고, 중복된 파일 입출력 코드를 IOUtility 클래스로 추출했다. GIPSY에서는 GEE 내부의 복잡한 스케줄링 로직을 Scheduler 클래스로 분리하고, 조건문 기반의 실행 흐름을 ExecutionStrategy 인터페이스와 구체 구현체들로 교체했다.
리팩터링 후에는 JUnit 기반 테스트 스위트를 재실행하여 기존 기능이 그대로 동작함을 검증하였다. 테스트 커버리지는 85 %에서 93 %로 상승했으며, 메서드 복잡도 평균이 12에서 7로 감소했다. 또한, 정적 분석 결과 결합도와 응집도가 개선되어 유지보수 비용이 감소할 것으로 기대된다.
댓글 및 학술 토론
Loading comments...
의견 남기기