#Backend

코드 품질 개선 기법 29편: 고르디우스 변수

코드 품질 개선 기법 29편: 고르디우스 변수
01

Summary

복잡하게 꼬인 동기화 로직, '중간 데이터 구조'로 단칼에 해결하는 법

고르디우스의 매듭을 끊듯, 복잡한 데이터 의존성을 정리하여 코드 품질을 높이는 설계 전략

데이터 동기화 로직에서 흔히 발생하는 복잡한 조건문과 데이터 참조 문제를 해결하기 위해, 최종 처리 로직에 최적화된 중간 데이터를 먼저 설계하는 역발상 기법을 소개합니다. Kotlin의 컬렉션 조작 역량을 극대화하여 런타임 에러 가능성을 제거하고 비즈니스 의도를 명확히 드러내는 리팩터링 과정을 담고 있습니다.

  • 01복잡한 ID 집합 연산을 가독성 높은 상태 기반 리스트로 치환하는 전략
  • 02partitionByNullity 패턴을 통한 데이터 분류 로직의 재사용성 확보
  • 03불필요한 null 체크 및 런타임 예외를 구조적으로 방지하는 설계
  • 04추가, 수정, 삭제라는 비즈니스 핵심 행위를 부각하는 코드 작성법
  • 05데이터 의존성을 추적하기 쉬운 일직선 형태의 함수 흐름 구성

RECOMMENDATION

데이터 동기화나 상태 전이 로직을 작성할 때 조건문이 많아져 흐름을 파악하기 어렵다면, 이 아티클의 '중간 데이터 설계' 관점을 적용하여 로직을 분리해 보길 권장합니다.

The Problem

로컬과 원격 저장소 간의 데이터 동기화 로직 구현 시, ID 집합의 차집합을 계산하고 다시 맵에서 데이터를 조회하는 과정이 반복되어 데이터 의존성이 복잡하게 얽히고 가독성이 떨어지는 문제가 발생했습니다. 이로 인해 불필요한 런타임 에러 처리가 강제되고, 추가·수정·삭제 로직의 일관성이 결여되는 부작용이 있었습니다.

The Solution

추가(Created), 수정(Updated), 삭제(Deleted)라는 세 가지 상태를 명확히 정의하는 '이상적인 중간 데이터 구조'를 설계하고, 이를 추출하기 위한 partitionByNullity 함수를 도입했습니다. 원본 데이터로부터 필요한 상태 리스트를 미리 분리해냄으로써, 비즈니스 로직은 분리된 데이터를 순회하기만 하면 되는 선언적인 구조로 변경했습니다.

The Result

데이터 흐름의 의존성이 단순화되어 코드의 읽기 성능이 향상되었으며, 맵 조회 실패에 대비한 방어적 예외 처리가 사라져 로직이 견고해졌습니다. 또한 추가/수정/삭제 과정이 동일한 패턴으로 처리되어 코드의 일관성과 유지보수성이 크게 개선되었습니다.

Trade-off

중간 데이터 구조를 생성하기 위해 모든 키의 합집합을 구하고 별도의 리스트를 할당해야 하므로, 메모리 사용량이 미세하게 증가할 수 있습니다. 본문에 구체적인 수치는 없으나, 일반적인 데이터 동기화 규모에서는 성능 저하보다 가독성 및 안정성 확보의 이득이 훨씬 클 것으로 판단됩니다.

03

Key Concepts

Concept · 01

Gordian Variable (고르디우스 변수)

복잡하게 얽힌 데이터 의존성을 해결하기 위해 도입된 개념으로, 최종 처리에 딱 맞는 형태로 가공된 중간 데이터를 의미합니다.

  • 본문에서는 복잡한 ID 조회 대신 추가/수정/삭제를 위한 전용 리스트를 지칭함
  • 복잡한 의존성의 매듭을 한 번에 끊어내는 역할
Concept · 02

Intermediate Data Structure (중간 데이터 구조)

원천 데이터와 최종 처리 로직 사이의 가교 역할을 수행하며, 특정 비즈니스 목적에 최적화된 데이터 형태입니다.

  • remoteEntryMap과 localEntryMap을 조합해 만든 3가지 상태 리스트
  • 로직의 복잡도를 분산시키고 순수 비즈니스 로직에만 집중하게 함
Concept · 03

partitionByNullity

두 개의 소스에서 가져온 데이터의 존재 유무(null 여부)에 따라 데이터를 세 그룹으로 분류하는 고차 함수 패턴입니다.

  • ID 합집합을 순회하며 원격/로컬 존재 여부를 판별
  • Triple 형태로 생성, 수정, 삭제 대상을 한 번에 반환하여 가독성 증대