이번 4개월의 인턴십 중 막바지 한달 조금 넘게 남기고 정산프로세스 개발이라는 큰 임무를 맡게되었다. 많이 촉박한 시간이었지만 성장할 수 있는 큰 기회를 주심에 감사하며 기획부터 설계, 개발까지 어떻게 풀어나갔는지 기록해보고자 한다.
(너무 자세한 정책은 언급하지 않도록 하겠습니다.)
처음 정산을 기획하기 위해 가장 먼저 했던 것은 '정산'에 대한 도메인 이해였다.
민감한 문제라 정산 프로세스, 또는 관련 도메인 개발과 관련한 레퍼런스가 매우 부족했지만 아래와 같은 링크들을 통해 도메인 지식을 조금이라도 습득하고 시작했다.
🔗 정산 도메인 이해에 참고한 링크들
정산 프로세스는 여태까지 해온 프로젝트들과 결이 많이 달랐다. 회사의 돈, 회사의 근본적인 설립 이유와 관련된 문제다.
비즈니스가 단순히 무언가 파는 행위를 통해 수익을 얻는 형태였다면 구현이 조금 편할 수 있었겠지만, 내가 근무하고 있는 회사의 비즈니스는 '플랫폼'이었다.
엄격해야하고, 어느때보다 validation, 예외처리가 중요하고 사용자 편의만을 고려할 수 없었다. 다양한 예외처리 및 검증에 따른 userFlow도 더 세세하고 엄격해야했다. 과정을 거치며 오히려 더 정확한 정산을 위해 사용자가 불편한 방향으로 더 바꿔나가기도 했다.
그래서 초기 자료조사부터 기획까지 적어도 기본 정산 프로세스 및 수식에는 오류가 없도록 이사님과 소통을 통해 재차 확인하며 수정해나갔다.
돈과 관련된 로직이어서 백엔드도 걱정되었는데, 이렇게 복잡한 프로세스를 맨땅에서부터 프론트 작업을 한 적은 없었기에, 프론트가 많이 걱정되었다.
우선 관리자 정산 관리라는 업무가 주어지고 조사 및 문제 정의/파악을 먼저 하였다.
앞선 자료조사 및 초기 기획을 통해 발생한 궁금증 및 비즈니스적 문제를 정리해 여쭤보고 답변을 받아 다음 기획을 수정해나갔다.
대략적인 Questions는 다음과 같다.
추가적으로 개인적으로 써드파티 수수료에 대해 자료 조사를 진행하고, 모든 수수료 차감 방식에 대한 정의 및 수식 정리 이후 최종 정산 수식에 반영될 수 있도록 요청하였다.
페이팔 수수료
페이팔의 정산 수수료는 4.4% + 0.3USD로 확인했다.
포트원 수수료
포트원 공식 문서를 통해 결제 대행 수수료 외에는 별도의 추가 수수료가 없음을 확인하였다.
참고로 포트원의 공식 문서가 직관적이고 깔끔하게 정리되어 있어 매우 감탄했다.
이러한 자료 조사를 바탕으로 최종 정산 프로세스에서의 수수료 차감 로직과 관련 요구사항을 구체화하였다.
초기 요구사항은 단순히 ‘정산 기능’을 구축하는 것이었으나, 정산이라는 도메인은 상세 기획 없이 시작이 불가능했다. 소통 과정에서 점차 세부적인 요구사항이 도출되어 해당 내용을 정리하고 기획 및 설계 문서도 계속 수정했다.
자세한 요구사항과 프로세스는 생략하겠다.
1. 수출기업 대상 플랫폼 정산 시스템
2. 수수료 차감 구조
3. 환율 적용 필요성
4. 소수점 처리 방식 논의
5. 유사 사례
이러한 특성을 고려하여 정산 시스템 설계는 국제 거래 특성을 반영하고, 수수료와 환율 적용 로직을 현재는 수동적이되, 자동으로 확장 가능하고 유연하게 처리할 수 있도록 고민했다.
이 과정에서 정산 프로세스는 명확히 구분되는 단계들과 각 단계마다 철저한 검증(Validation)이 필요했다.
병렬적으로 처리 가능한 작업은 효율성을 높이기 위해 병렬로 진행하는 방향으로 수정해 나갔다.
또한 우선 초기 스타트업이기 때문에 아직 명확하지 않은 프로세스들은 수동으로 관리할 수 있도록 설계했다. 소프트웨어 개발의 최종 목적은 자동화이지만, 그 전까지는 어느정도 운영을 하며 안정화가 되고 패턴을 찾고 비즈니스를 정리하기 전까지는 수동으로 관리해야 한다는 생각이 들었다.
1. 단계적 처리
2. 병렬 처리
3. 수동 기입 및 자동화의 균형
위 내용을 토대로 최종 정산 기획 문서에는 아래와 같은 내용을 포함시켰다.
1. Status의 종류 간소화.
2. 스케줄링 적용
그러나, 수동 초기화도 남겨두었다. 스케줄링 기능이 있긴 하지만 아직 서버의 아키텍처가 Event Driven 형식이 아니기 때문에 스케줄링에 실패하면 다시 시도할 방법이 필요했다.
3. Monthly Summary 테이블 분리
해당 테이블 분리로 얻은 이점은 성능적으로도, 데이터 관리면에서도 많은 이점이 따라왔다.
4. 로그 테이블
언제 초기화가 진행이 되었는지, 정산이 완료되었는지, 누가 정산을 진행 했는지, 스케줄링을 통해 자동으로 진행된 것인지, 수동으로 진행한 것인지 등등을 기록할 로그성 테이블을 두기로 하였다. 우선은 앞서 언급한 3. MonthlySummary 테이블에 해당 로그성 데이터 컬럼들을 두기로 했다. 테이블의 볼륨이 커지고, 정합성이 의심될 때 다시 돌아와서 정규화를 진행해보려 한다.
5. 필터링 적용
서비스 특성상 각 제조사별로 필터링하거나, 정산 상태별로 필터링하여 조회할 수 있어야 한다는 생각이 들었다.
우선은 1. 제조사 2. 정산 상태 필터링만을 두고 필터링 없이도, 필터링을 중복해서도 페이징 조회가 가능하도록 기획했다.
또한 아직 환율 적용을 건당 다른 환율 적용인지 일괄 적용인지 결정내려진 것이 아니기도 했고, 환율 직접 입력이라는 요구사항이 있기도 했다.
엑셀 업로드를 통한 필수 정보 업데이트
완료된 정산 보고서 엑셀 다운로드
정산 지급 관리 기능
정산, 매출 대시보드
운송비 정산표 자동 수신 및 반영
자사 문의의 경우 다른 수수료 적용
환율기준일 선택시 환율 자동 적용(?)