올리브영이 수많은 실시간 출고 변수 속에서도 흔들리지 않는 유연한 코드를 작성하기 위해 선택한 전략과 조합 패턴의 힘
본 아티클은 배송최적화 시스템 구축 과정에서 다양하고 복잡한 출고 센터 결정 조건들을 어떻게 유연한 아키텍처로 설계했는지 다룹니다. 점차 확장될 배송 규칙에 유연하게 대처하기 위해 기본형 전략 패턴의 한계를 넘어 선택 전략과 결정 전략을 정교하게 이원화했습니다. 나아가 여러 검증 프로세스를 효율적으로 묶어 실행하기 위해 컴포지트 패턴을 유기적으로 융합한 실제 Kotlin 코드 구현 방식을 심도 있게 제안합니다.
비즈니스 정책의 잦은 변경이나 다중 규칙 조건 분기로 인해 유지보수 비용이 급증하는 도메인을 다루는 백엔드 개발자에게 적극 권장하며, 설계 초기 단계부터 변화를 대비한 확장형 패턴 적용 가이드라인으로 강력 추천합니다.
올리브영의 멀티 센터 체제 하에서 최적의 출고 센터를 결정하기 위한 비즈니스 조건이 복잡해짐에 따라, 기존의 if-else 분기 방식으로는 코드 중첩이 깊어지고 가독성과 테스트 용이성이 심각하게 저해되는 문제가 있었습니다.
다양한 배송 판별 조건을 개별 검증 전략으로 분리하는 '전략 패턴(Strategy Pattern)'을 도입하고, 후보군을 추려내는 선택(Selection) 단계와 최종 센터를 결정하는 결정(Decision) 단계로 아키텍처 책임을 분리한 뒤 이를 컴포지트 패턴을 통해 결합하였습니다.
각 배송 조건을 유연한 전략 객체로 모듈화함으로써 복잡한 제어 로직을 격리하였고, 신규 요구사항이나 규칙이 추가되더라도 기존 코드를 수정할 필요 없이 새로운 구현체를 조합하여 안전하게 배포할 수 있는 구조적 기틀을 확보했습니다.
Trade-off
전략 객체와 결정 인터페이스가 고도화되고 세분화됨에 따라 단순 if-else 문을 사용했을 때보다 초기 생성 클래스 개수와 보일러플레이트 코드가 증가했으며, 동적으로 전략이 조합되어 실행되므로 코드 추적 난이도가 일부 증가할 수 있습니다.
동일한 목적을 가진 알고리즘군을 각각 개별 클래스로 캡슐화한 뒤, 필요에 따라 동적으로 상호 교환이 가능하도록 만들어 클라이언트 영향 없이 알고리즘을 독립적으로 변경할 수 있게 하는 행위 디자인 패턴입니다.
개별 단일 객체와 복합 객체를 동일한 인터페이스로 묶어 다룸으로써, 클라이언트가 복합 구조인지 개별 구조인지 구분하지 않고 동일하게 트리 구조 데이터를 제어할 수 있게 돕는 구조적 패턴입니다.
의사결정 복잡도를 낮추기 위해 조건 분석을 통해 대상 풀(Pool)을 좁히는 검색(Filtering) 역할과, 선별된 대상 중 비즈니스 룰에 맞는 최적의 대상을 뽑는 최종 합의(Decision) 역할을 격리하는 설계 패러다임입니다.




