Portfolio

위밋 Roouty — 고객사 커스텀 SaaS (SAP·EPOD)

2026.01 ~ 현재

B2B 물류 TMS에서 고객사 SAP 거래명세서 연동과 전자 인수증(EPOD) 도메인을 단독 설계·구현. 사내 AI 운영 어시스턴트도 직접 구축.

Node.jsKoaMySQLMongoDBRedisAWS S3Playwright

회사 비공개 코드이므로 구현 세부·기밀을 제외한 직무·설계·성과 중심 요약입니다.

문제 · 맥락

물류 운송에서 인수증(EPOD, Electronic Proof of Delivery)은 배송 완료의 법적·정산 근거입니다. 발급은 (1) 데이터 정합성(필수 필드·해시)을 단계별로 보장해야 하고, (2) 다수 서버(pod)에서 동시에 자동 발행돼도 중복이 없어야 하며, (3) 수령인이 앱 없이도 서명할 수 있어야 합니다.

핵심 설계 결정

고객사 SAP ↔ 루티 TMS 거래명세서 연동 (고객사 커스텀)

  • 고객사 SAP로 송신할 거래명세서 데이터를 루티 TMS 데이터와 매핑하는 처리 추가, SAP 송신 실패 응답 구조 개선.

  • SAP 수신 데이터를 (company_id, LINE2, LINE3) 키로 배치 조회·재분류하는 납품처(master_order) 분류·검증 룰을 고도화.

  • 대기업 고객사 정산 흐름에 맞춘 B2B 커스텀 SaaS 기능으로, 인수증/거래명세서가 정산 근거로 안전하게 흐르도록 보장.

인수증 상태머신 + 비동기 발행 파이프라인

  • CREATED → DRAFT → SIGN_PENDING → SEALED → ISSUED 전이 검증.

  • 단계별 필수 필드(문서 해시·최종 해시·PDF 키)를 강제하고, 비동기 PDF 워커 완료 후 저장 키를 채워 갱신.

  • 트랜잭션 일관성 판단을 코드 내 결정 로그(ADR 주석)로 문서화.

서버 사이드 PDF 렌더링 엔진

  • Chromium 풀 + DOM 측정 기반 페이지네이션으로 프론트엔드 PDF 디자인을 백엔드에서 동일하게 재현.

  • 일반(단가 노출 O/X)·통합 등 인수증 타입별 분기 렌더링.

멀티 pod 자동 발행 스케줄러 — Redis 분산락

  • Redis SET NX 분산락으로 cron 동시 발화 시 단 하나의 pod만 통과, TTL로 중복 실행 차단.

  • Redis 장애 시 보수적 fallback + 다음 cron 자연 회복으로 발행 중복을 원천 차단.

토큰 기반 원격 서명(매직링크)

  • 서명 토큰 발급·기존 토큰 무효화·만료 관리, 서명 완료 시 PDF를 S3 업로드하고 메일/알림톡으로 발송하는 end-to-end 플로우 구현.

주문 목록 조회 API v2 재설계 — 1~5분(OOM) → 666ms

  • 문제(v1): 단일 findAll에 다단계 1:N hasMany를 전부 JOIN으로 묶고 페이징이 없어, 결과 행이 카르테시안 곱으로 폭증. 전체를 메모리에 적재하다 5,187건 조회 시 1~5분 + 서버 OOM.

  • 개선(v2): 메인 쿼리에서 1:N을 별도 IN 쿼리로 분리(곱셈 폭증 제거), count(distinct)·페이징 목록·전체 ID를 Promise.all로 병렬 조회, BE 페이징으로 페이지 단위 고정.

  • 효과: 동일 5,187건 조회 기준 1~5분·OOM → 666ms. 응답이 데이터량·연관 행 수와 무관하게 일정.

  • 향후: 30건+ 정렬·대용량 안정 지원을 위해 테이블 구조 개편, 종료 주문 핫/콜드 분리(아카이브 이관), 정렬·필터 경로 ORM → 네이티브 쿼리 전환을 검토 중.

BE 배포 브랜치 전략 개선 — force-push·reset --hard 제거

  • 문제: hotfix를 stage에서 cherry-pick으로 반영하는데, 커밋 해시가 달라져 rebase + force-push가 필요하고, 팀원 전원이 pull 전 git reset --hard(작업 중이면 stash 왕복)를 매번 수행해야 했음.

  • 개선(역방향 머지): main에 배포된 변경을 back-merge/날짜 브랜치로 떠 stage→develop PR 머지로 상위(배포)에서 하위(개발)로 전파. 머지라 해시가 정합되어 force-push 불필요, 불필요한 재배포는 [skip ci]로 차단.

  • 효과: 공유 히스토리 재작성이 사라져 force-push·reset --hard 전면 제거, 팀원은 origin pull만. 2026-02 도입 → 2026-05 -s ours SHA 흡수 패턴 확립 → 팀 표준 정착.

사내 AI 운영 어시스턴트(Roouty Ops Assistant) 직접 구축

  • 회사 개발 운영을 자동화하는 AI 에이전트 도구를 직접 구축(Node/TS)

    규칙 준수 감시 에이전트, 상용 DB 5-Layer 방어 체계, 감독 에이전트 + 워크플로우 자동 개선, PostToolUse 검증.

  • 개인 하네스의 사고방식을 프로덕션 조직 맥락에서 실제로 적용한 사례.

  • Node.js → Kotlin/Spring 멀티모듈 WAS 전환 개발에도 참여

    공통 엔티티·보안 모듈 분리, OpenFeign 연동 라이브러리, 이벤트 기반 비동기(@Async/@EventListener/REQUIRES_NEW), CQRS형 서비스 분리.

성과 · 지표

  • EPOD · SAP 연동 도메인 단독 오너

    SAP 거래명세서 연동, 인수증 상태머신, PDF 렌더러, 원격 서명, 주문 목록을 직접 설계·구현.

  • 본인 작성 모듈에 대해 다수의 Jest 테스트를 함께 작성해 회귀 방어.

  • 사내 AI 운영 어시스턴트(Roouty Ops Assistant)를 별도로 구축해 팀 개발 운영을 자동화.

한 줄 요약

물류 TMS에서 고객사 SAP ↔ 루티 TMS 거래명세서 연동과 전자 인수증(EPOD) 도메인을 단독 설계·구현 — 상태머신·Chromium 서버 PDF·Redis 분산락 자동발행·매직링크 원격서명, 주문 조회 API v2 재설계로 카르테시안·N+1 제거(1~5분·OOM → 666ms). 사내 AI 운영 어시스턴트까지 직접 구축.

← 다른 프로젝트 보기