YMBP — 의약품 B2B 도매 커머스
2026.07 –Java 21 · Spring Boot 3.5 · JPA/QueryDSL · MySQL · MSSQL · Redis · Meilisearch · Next.js 15 (App Router) · React 19 · TypeScript · Tailwind · Turborepo · Python (PaddleOCR · FastAPI) · Docker · GitHub Actions
백엔드 1 + 프론트엔드 4 + 자동화 3, 단독 운영
-
결제·수금 체계 설계·구현 — 외상 거래를 카드 기반으로 전환. 카드 미등록 시 주문을 막는 게이트와 월말 수금 구조를 확정했습니다.
PG가 빌링키도 0원 승인도 지원하지 않아, 1만원을 승인하고 즉시 전액 취소하는 방식으로 카드 유효성을 검증했습니다. 주문 차단은 잘못 켜지면 전 회원이 주문을 못 하므로, 게이트를 DB 설정값으로 두어 재배포 없이 전환하고 설정 조회 실패 시 열리도록 했습니다. -
사업자등록증 OCR 자동입력 — 가입 시 수기 입력하던 등록증을 자동으로 채웁니다. 524초 → 0.6~5.8초
CPU 추론이 건당 524초로 사용이 불가능해, GPU 추론과 상주 워커로 요청마다 모델을 다시 올리던 구조를 없앴습니다. OCR 서버는 사내망, 서비스는 클라우드에 있어 네트워크가 닿지 않았는데, 등록증은 개인정보라 TLS가 필수인 반면 고정 IP·인증서 발급에 제약이 있었습니다. 공인망을 여는 대신 SSH 역터널을 택해 인바운드 개방·TLS·유동 IP를 한 번에 피했고, 프로세스를 강제 종료해 15초 내 자동 복구를 확인했습니다. OCR이 실패하거나 꺼져 있어도 직접 입력으로 넘어가 가입 자체는 막히지 않습니다. -
외부 유통 ERP 원장 기준 마진 집계 배치 — 외부 ERP의 매출 원장과 자사 상품을 대조해 마진을 산출합니다. 전체 기간 매칭률 100%
초기 전제였던 품목코드 조인이 실제로는 무의미하다는 것을 데이터로 확인하고(코드 보유 건이 소수) 품목명과 규격의 복합 키로 바꿨습니다. 마진율 대신 분자와 분모를 저장해 재집계 때 평균의 평균으로 값이 왜곡되는 문제를 없앴고, 정답 대조군을 만들어 채점하는 방식으로 오매칭을 걸러냈습니다. 이 과정에서@Transactionalself-invocation으로 재집계분이 통째로 유실되던 결함을 찾아 고쳤습니다 — 최초 실행은 INSERT라 정상으로 보이고 재실행에서만 드러나는 종류였습니다. -
운영 보안 문제 해결 — 로그인할 때 사용자 ID와 이메일이 외부로 나가고 있던 것을 찾아 차단했습니다.
에러 트래킹 도구를 점검하다 퇴사자 개인 계정으로 4개월간 운영 에러가 수집되고 있었고, 그와 별개로 레이아웃에 남아 있던 서드파티 로깅 스크립트가 개인정보를 전송하고 있었습니다. 자사 계정으로 옮기면서 전송 전 스크럽·헤더/쿠키/본문 미수집·세션 리플레이 마스킹을 적용하고, 스크립트를 제거한 뒤 운영 페이지에서 전송 0건을 확인했습니다. 그 밖에 무인증으로 열려 있던 관리 API를 차단하고(외부 200 → 403 실측), 타인 게시글이 조회되던 취약점을 고쳤습니다. -
배포 파이프라인 개선 — 프론트엔드 3종의 빌드를 별도 러너로 분리하고 산출물만 전달하도록 바꿨습니다. 2.5~3.5분 → 30~40초
self-hosted runner 한 대를 여러 저장소가 공유해 배포가 직렬로 밀리던 문제였습니다.
그 외 — 의약외품 이커머스(셀러 정산·배송비·프로모션·기획전), 회원 유형·권한 체계(JWT 클레임 기반 경로 차단), 서비스 간 계정 연동(SSO-lite, 서버 간 HMAC 검증), 반품 한도 제도(정책값 5종을 DB 설정으로 분리), 운영자 도구 구축