
고르디우스의 매듭을 끊듯, 복잡한 데이터 의존성을 정리하여 코드 품질을 높이는 설계 전략
데이터 동기화 로직에서 흔히 발생하는 복잡한 조건문과 데이터 참조 문제를 해결하기 위해, 최종 처리 로직에 최적화된 중간 데이터를 먼저 설계하는 역발상 기법을 소개합니다. Kotlin의 컬렉션 조작 역량을 극대화하여 런타임 에러 가능성을 제거하고 비즈니스 의도를 명확히 드러내는 리팩터링 과정을 담고 있습니다.
데이터 동기화나 상태 전이 로직을 작성할 때 조건문이 많아져 흐름을 파악하기 어렵다면, 이 아티클의 '중간 데이터 설계' 관점을 적용하여 로직을 분리해 보길 권장합니다.
로컬과 원격 저장소 간의 데이터 동기화 로직 구현 시, ID 집합의 차집합을 계산하고 다시 맵에서 데이터를 조회하는 과정이 반복되어 데이터 의존성이 복잡하게 얽히고 가독성이 떨어지는 문제가 발생했습니다. 이로 인해 불필요한 런타임 에러 처리가 강제되고, 추가·수정·삭제 로직의 일관성이 결여되는 부작용이 있었습니다.
추가(Created), 수정(Updated), 삭제(Deleted)라는 세 가지 상태를 명확히 정의하는 '이상적인 중간 데이터 구조'를 설계하고, 이를 추출하기 위한 partitionByNullity 함수를 도입했습니다. 원본 데이터로부터 필요한 상태 리스트를 미리 분리해냄으로써, 비즈니스 로직은 분리된 데이터를 순회하기만 하면 되는 선언적인 구조로 변경했습니다.
데이터 흐름의 의존성이 단순화되어 코드의 읽기 성능이 향상되었으며, 맵 조회 실패에 대비한 방어적 예외 처리가 사라져 로직이 견고해졌습니다. 또한 추가/수정/삭제 과정이 동일한 패턴으로 처리되어 코드의 일관성과 유지보수성이 크게 개선되었습니다.
Trade-off
중간 데이터 구조를 생성하기 위해 모든 키의 합집합을 구하고 별도의 리스트를 할당해야 하므로, 메모리 사용량이 미세하게 증가할 수 있습니다. 본문에 구체적인 수치는 없으나, 일반적인 데이터 동기화 규모에서는 성능 저하보다 가독성 및 안정성 확보의 이득이 훨씬 클 것으로 판단됩니다.
복잡하게 얽힌 데이터 의존성을 해결하기 위해 도입된 개념으로, 최종 처리에 딱 맞는 형태로 가공된 중간 데이터를 의미합니다.
원천 데이터와 최종 처리 로직 사이의 가교 역할을 수행하며, 특정 비즈니스 목적에 최적화된 데이터 형태입니다.
두 개의 소스에서 가져온 데이터의 존재 유무(null 여부)에 따라 데이터를 세 그룹으로 분류하는 고차 함수 패턴입니다.








