#Backend

배송최적화 시스템 구축기 Part 02. 복잡한 비즈니스 로직에 유연한 디자인 패턴 입히기

배송최적화 시스템 구축기 Part 02. 복잡한 비즈니스 로직에 유연한 디자인 패턴 입히기
01

Summary

복잡한 배송 비즈니스 로직, 'if 문의 늪'에서 벗어나는 세련된 백엔드 디자인 패턴 설계법

올리브영이 수많은 실시간 출고 변수 속에서도 흔들리지 않는 유연한 코드를 작성하기 위해 선택한 전략과 조합 패턴의 힘

본 아티클은 배송최적화 시스템 구축 과정에서 다양하고 복잡한 출고 센터 결정 조건들을 어떻게 유연한 아키텍처로 설계했는지 다룹니다. 점차 확장될 배송 규칙에 유연하게 대처하기 위해 기본형 전략 패턴의 한계를 넘어 선택 전략과 결정 전략을 정교하게 이원화했습니다. 나아가 여러 검증 프로세스를 효율적으로 묶어 실행하기 위해 컴포지트 패턴을 유기적으로 융합한 실제 Kotlin 코드 구현 방식을 심도 있게 제안합니다.

  • 01중첩 if-else 문의 늪으로 생겨나는 테스트 피로감과 복잡도를 디자인 패턴으로 해결하려는 실무적 배경 제시
  • 02기본 전략 패턴의 유용성과 한계를 짚고, 이를 배송 도메인 맞춤형으로 고도화하여 확장성과 유연성을 극대화한 전략 도출
  • 03출고 가능 센터를 추출하는 후보군 추리기(Selection) 단계와 단 하나의 센터를 낙점하는 최종 확정(Decision) 단계로 비즈니스 책임을 정교하게 분리
  • 04개별 전략과 전략의 집합을 일관된 인터페이스로 일괄 실행하고 결합하는 컴포지트 패턴(Composite Pattern)의 영리한 도입기

RECOMMENDATION

비즈니스 정책의 잦은 변경이나 다중 규칙 조건 분기로 인해 유지보수 비용이 급증하는 도메인을 다루는 백엔드 개발자에게 적극 권장하며, 설계 초기 단계부터 변화를 대비한 확장형 패턴 적용 가이드라인으로 강력 추천합니다.

The Problem

올리브영의 멀티 센터 체제 하에서 최적의 출고 센터를 결정하기 위한 비즈니스 조건이 복잡해짐에 따라, 기존의 if-else 분기 방식으로는 코드 중첩이 깊어지고 가독성과 테스트 용이성이 심각하게 저해되는 문제가 있었습니다.

The Solution

다양한 배송 판별 조건을 개별 검증 전략으로 분리하는 '전략 패턴(Strategy Pattern)'을 도입하고, 후보군을 추려내는 선택(Selection) 단계와 최종 센터를 결정하는 결정(Decision) 단계로 아키텍처 책임을 분리한 뒤 이를 컴포지트 패턴을 통해 결합하였습니다.

The Result

각 배송 조건을 유연한 전략 객체로 모듈화함으로써 복잡한 제어 로직을 격리하였고, 신규 요구사항이나 규칙이 추가되더라도 기존 코드를 수정할 필요 없이 새로운 구현체를 조합하여 안전하게 배포할 수 있는 구조적 기틀을 확보했습니다.

Trade-off

전략 객체와 결정 인터페이스가 고도화되고 세분화됨에 따라 단순 if-else 문을 사용했을 때보다 초기 생성 클래스 개수와 보일러플레이트 코드가 증가했으며, 동적으로 전략이 조합되어 실행되므로 코드 추적 난이도가 일부 증가할 수 있습니다.

03

Key Concepts

Concept · 01

전략 패턴 (Strategy Pattern)

동일한 목적을 가진 알고리즘군을 각각 개별 클래스로 캡슐화한 뒤, 필요에 따라 동적으로 상호 교환이 가능하도록 만들어 클라이언트 영향 없이 알고리즘을 독립적으로 변경할 수 있게 하는 행위 디자인 패턴입니다.

  • 올리브영의 다양한 배송 판별 규칙을 개별 독립 클래스로 분리하여 정책 추가에 유연하게 대응하도록 설계하는 데 기본 개념으로 활용되었습니다.
Concept · 02

컴포지트 패턴 (Composite Pattern)

개별 단일 객체와 복합 객체를 동일한 인터페이스로 묶어 다룸으로써, 클라이언트가 복합 구조인지 개별 구조인지 구분하지 않고 동일하게 트리 구조 데이터를 제어할 수 있게 돕는 구조적 패턴입니다.

  • 여러 개의 센터 선택 전략(CenterSelectionStrategy)들을 단일 전략 리스트처럼 순차 처리하고 일괄 수집하는 CompositeCenterSelectionStrategy 구현에 응용되었습니다.
Concept · 03

선택과 결정의 책임 분리 (Separation of Selection and Decision)

의사결정 복잡도를 낮추기 위해 조건 분석을 통해 대상 풀(Pool)을 좁히는 검색(Filtering) 역할과, 선별된 대상 중 비즈니스 룰에 맞는 최적의 대상을 뽑는 최종 합의(Decision) 역할을 격리하는 설계 패러다임입니다.

  • 출고 조건을 충족하는 센터 후보군을 뽑아내는 CenterSelectionStrategy와 정책적 우선순위를 종합 판정해 한 곳을 결정하는 DecisionStrategy로 아키텍처 책임을 분할 적용했습니다.