피드로 돌아가기
Refactoring Legacy Code: The Jedi Move of Extracting Pure Functions
Dev.toDev.to
Backend

Pure Function 추출을 통한 복잡도 66% 감소 및 코드 라인 수 60% 절감

Refactoring Legacy Code: The Jedi Move of Extracting Pure Functions

Timevolt2026년 6월 17일7intermediate

Context

I/O 작업과 비즈니스 로직이 혼재된 200라인 규모의 거대 함수로 인해 코드 가독성 저하 및 유지보수 비용 증가. 전역 상태 변경과 Side Effect가 산재하여 작은 기능 수정에도 시스템 전반의 Regression Risk가 높은 구조적 한계 노출.

Technical Solution

  • 계산 로직과 Side Effect를 완전히 분리한 Pure Function 추출 전략 채택
  • DB 조회, 캐시 업데이트, 로깅 등 I/O 처리를 담당하는 얇은 Orchestrator 계층 설계
  • 입력값에 따라 결정론적 결과만 반환하는 Deterministic Helper 함수 구현을 통한 로직 고립
  • 복잡한 조건문 기반의 명령형 코드를 단순 합산 및 데이터 변환 중심의 선언형 파이프라인으로 전환
  • Error Handling을 Orchestrator 레벨로 집중시켜 Pure Function의 단일 책임 원칙 준수

Impact

  • Cyclomatic Complexity 12에서 4로 감소
  • 코드 라인 수 200라인에서 80라인으로 약 60% 축소
  • 신규 비즈니스 룰 추가 및 테스트 완료 시간 15분 이내로 단축

Key Takeaway

비즈니스 로직의 핵심인 '계산(Calculation)'을 외부 환경(I/O, State)으로부터 격리함으로써 테스트 가능성과 컴포지션 능력을 극대화하는 설계 원칙의 중요성 확인.


1. 함수 내부에서 DB 호출, API 요청, 전역 변수 수정이 동시에 발생하는지 확인

2. '입력값만으로 결과를 예측할 수 있는 계산 영역'을 식별하여 별도 함수로 추출

3. 추출된 함수가 외부 상태를 참조하거나 변경하지 않는 Pure Function인지 검증

4. I/O 처리와 비즈니스 로직 호출을 분리하는 Orchestrator 구조 적용 여부 검토

원문 읽기