차량 탁송 및 물류 업무를 함께 수행하는 외부 파트너사 전용 포털 시스템입니다. 파트너사마다 다루는 검수 항목과 업무 절차가 미세하게 달랐습니다.
거창한 멀티테넌트 시스템을 만들지 않은 이유
"파트너사마다 화면과 기능이 조금씩 다르다"는 요구사항을 들으면, 흔히 복잡한 멀티테넌트 데이터베이스, 동적 폼 빌더, 설정 기반 UI 조립 엔진 같은 거대한 아키텍처를 떠올리기 쉽습니다.
하지만 실제 연동 대상 파트너사가 서너 곳에 불과한 상황에서 수개월짜리 테넌트 시스템을 구축하는 것은 전형적인 오버엔지니어링입니다.
따라서 복잡한 추상화 레이어를 얹는 대신, Next.js App Router의 경로(Route) 기반으로 파트너사별 전용 페이지를 깔끔하게 분리했습니다. 공통 UI 요소는 컴포넌트로 재사용하되, 회사별 특화 로직은 독립된 페이지 코드에서 직관적으로 처리했습니다.
진짜 중요한 곳에 집중하기: 엄격한 유한 상태 기계(State Machine)
화면 분기는 단순하게 유지한 반면, 탁송 주문의 진행 단계(배차 → 픽업 → 검수 → 인계 → 정산)는 엄격한 상태 기계(Finite State Machine)로 중앙 집중화하여 강제했습니다.
UI의 사소한 차이는 비즈니스에 치명적이지 않지만, 주문 상태 전이가 꼬여 특정 검수 단계를 건너뛰고 정산으로 넘어가는 것은 심각한 금전적 사고로 이어지기 때문입니다.
요약
엔지니어링의 지혜는 모든 것을 똑같이 공통화하는 것이 아니라, 오류 발생 시의 비즈니스 손실 크기에 따라 '단순함을 유지할 곳'과 '철저히 통제할 곳'의 경계를 올바르게 나누는 것에 있습니다.