개요
글로벌 제조사의 POP 제품 예산 관리는 본사(HQ)에서 지역 본부(RHQ)를 거쳐 계열사(Subsidiary)와 국가(Country)까지 수직으로 예산이 배분되는 복잡한 계층 구조를 가진다. Samsung POP Order Management System은 이 4단계 조직 계층을 반영한 예산 편성·할당·주문 워크플로우를 자동화하는 B2B 내부 포털이다.
Spring MVC 4.2.4 + MyBatis + JSP 기반의 서버사이드 렌더링 방식으로 구현되었으며, AWS RDS(MySQL)를 데이터 저장소로 사용한다. AdminLTE 기반 UI에서 각 조직 레벨 담당자가 역할에 맞는 기능만 접근하도록 역할 기반 접근 제어(Interceptor)를 적용했다.
외부 쇼핑몰 API(smpop.net)와 연동하여 상품 카탈로그를 실시간으로 가져오고, 예산 내역과 주문 목록을 Apache POI로 엑셀 보고서로 자동 생성한다.
주요 기능
4단계 계층적 예산 편성
HQ가 전체 예산을 설정하면 RHQ → Subsidiary → Country 순으로 예산이 배분된다. 하위 조직의 할당 합계가 상위 조직 한도를 초과하면 자동으로 조정하는 비즈니스 규칙을 BudgetController에서 처리한다.
제품 주문 워크플로우
국가 담당자가 외부 쇼핑몰 API에서 가져온 POSM·Security·Fixture·GDS 카탈로그에서 제품을 선택하고 주문서를 작성하면, 상위 조직의 승인을 거쳐 주문이 확정된다. 파일 첨부와 주문 수정을 지원한다.
예산 증액 요청 및 승인
하위 조직이 추가 예산을 요청하면 HQ에서 승인 또는 거절하고, 결과를 이메일(JavaMail)로 자동 통보한다. 증액 이력은 감사 로그로 기록된다.
엑셀 보고서 자동 생성
Apache POI로 예산 현황, 주문 목록, 법인별 사용량을 다계층 엑셀 포맷으로 자동 생성한다. 다수의 시트와 계층형 헤더를 포함하는 복잡한 리포트 구조를 지원한다.
기술적 도전
계층적 예산 배분 로직
도전: 4단계 조직 구조에서 예산 편성 시 상위-하위 간 잔액 연동과 초과 방지 규칙을 복잡한 트리 구조로 처리해야 했다.
해결: BudgetController에서 상위 조직의 잔여 예산을 실시간으로 조회하고, 하위 조직 합계가 한도를 초과하면 자동으로 조정하는 유효성 검사 레이어를 구현했다. MyBatis XML 매퍼로 계층 쿼리를 표현했다.
외부 쇼핑몰 API 통합
도전: 내부 주문 시스템과 외부 상품 카탈로그(smpop.net)를 실시간으로 연동하면서 API 장애 시 내부 기능에 영향을 주지 않아야 했다.
해결: apiService를 별도 서비스 레이어로 분리하고, API 호출 실패 시 캐시된 카탈로그 데이터로 폴백하는 방어 코드를 적용했다.
XSS 방지 및 감사 로그
도전: 글로벌 법인 담당자가 접근하는 내부 포털에서 입력 데이터 보안과 사용자 액션 추적이 필요했다.
해결: Spring Filter로 XSS 입력을 필터링하고, LogService로 주요 액션(예산 편성, 주문 승인, 증액 요청)을 DB에 기록하여 감사 추적을 구현했다.
아키텍처
Spring MVC Server-Side Rendering + External REST API 연동 구조다.
samsungmall/
├── src/main/java/
│ ├── controllers/ # Spring MVC 컨트롤러
│ │ ├── BudgetController # 예산 편성·배분 로직
│ │ ├── OrderController # 주문 생성·승인
│ │ └── MainController # 외부 API 상품 카탈로그
│ ├── service/ # 비즈니스 로직
│ ├── mapper/ # MyBatis 인터페이스
│ └── model/ # 도메인 VO
├── src/main/resources/mapper/ # MyBatis XML SQL
└── WEB-INF/views/ # JSP 뷰 (AdminLTE)