B2B / Order & Payment

PHAROS B2B 수발주 플랫폼

Period
2025.05 - 2025.06
Company
Finger
Role
백엔드 개발 리드 / 아키텍처·공통부·3채널 인증 설계 및 발주·결제 도메인 개발
Team
2개월 · 팀 7명 (기획 2, 프론트 2, 백엔드 3)
  • Java 21
  • Spring Boot 3.4
  • Spring Security
  • Spring Data Redis
  • Redisson
  • MyBatis
  • PostgreSQL
  • NHN Cloud NAS

Overview

Pharos ERP · 하이웍스 Pharos ERP · Stella ERP 3개 채널을 동시에 지원하는 B2B 수발주 플랫폼을 신규 구축했습니다. 기업 간 거래를 견적·발주·결제까지 하나의 플랫폼에서 처리할 수 있도록 개발했으며, 기존 오프라인·메신저 중심 업무를 디지털화하는 데 초점을 맞췄습니다. 설계 초기부터 채널 간 데이터 격리, 멀티 서버 동시성 제어, 크로스 시스템 상태 동기화가 핵심 과제였습니다.

Problem

  • 3개 ERP 채널을 하나의 B2B 플랫폼에서 지원하면서 채널별 거래처 데이터 격리와 인증 위임이 필요했습니다.
  • 멀티 서버 환경에서 동일 기관 중복 발주와 동일 주문 이중 결제를 방지해야 했습니다.
  • B2B와 ERP 간 발주, 출고, 결제 상태가 양방향으로 동기화되어야 했습니다.

My Ownership

  • 백엔드 개발 리드로 아키텍처, 공통 인증, 분산락, 발주·결제 도메인을 담당했습니다.
  • AES-256 링크키 기반 채널 인증과 JWT 페이로드 기반 데이터 접근 범위를 설계했습니다.
  • Redisson 분산락과 결제 수단별 전략 구조를 공통 컴포넌트로 구성했습니다.

Key Decisions

멀티 채널 인증AES-256 링크키 기반 3단계 인증

거래처 링크 내용 은닉과 채널별 인증 위임을 동시에 만족시키기 위해 링크키 복호화 후 채널 서버로 인증을 위임했습니다.

동시성 제어Redis + Redisson 분산락

멀티 서버 확장성과 TTL 기반 데드락 방지를 고려해 DB 락보다 분산락 템플릿을 우선 적용했습니다.

결제 처리전략 + 템플릿메서드 패턴

신용카드 즉시 완료와 가상계좌 콜백 처리 차이를 구현체로 분리해 결제 수단 확장성을 확보했습니다.

이미지 공유NHN Cloud NAS 마운트

ERP 6대와 B2B 1대, 총 7대 WAS 간 파일 공유를 별도 스토리지 레이어 없이 단순화했습니다. 단일 장애 포인트 리스크는 있으나 신규 오픈 서비스에서는 구성 단순성을 우선했습니다.

Implementation

3채널 멀티 테넌시

채널 서버가 거래처 정보를 AES-256으로 암호화해 링크를 발급하고, B2B 서버가 링크키를 복호화해 채널 식별 후 인증을 위임했습니다.

분산락 공통 컴포넌트

기관 ID 기반 발주 락과 주문 ID 기반 결제 락을 분리하고, AOP 기반 락 템플릿으로 비즈니스 로직과 락 처리를 분리했습니다.

크로스 시스템 상태 동기화

발주 확정·취소, 수주 부분출고, 결제 완료 이벤트를 B2B와 Pharos ERP 양방향 상태 전파 흐름으로 구성했습니다.

Detailed Notes

3채널 멀티 테넌시 인증

Pharos, Hiworks, Stella 3개 ERP 채널을 단일 B2B 플랫폼에서 지원하기 위해 AES-256으로 암호화한 링크키로 채널별 진입점을 구분하고, B2B 서버가 링크키를 복호화해 채널을 식별한 뒤 해당 채널 서버로 인증을 위임했습니다.

  • 채널 서버와 B2B 서버가 각각 AES Secret Key를 환경변수로 보유하고, 채널 ID와 거래처 정보를 AES-256 암호화 후 Base64URL 인코딩했습니다.
  • JWT 페이로드에 채널 ID를 포함해 모든 요청에서 채널별 데이터 접근 범위를 제한했습니다.
  • Redis 기반 토큰 상태 관리로 로그아웃 즉시 무효화했습니다.
  • 내부 시스템 호출은 Authorization Key 기반으로 인증하고, 허용 엔드포인트 패턴 매칭으로 접근을 제어했습니다.
  • 필터 체인 내 인증 예외를 단일 필터에서 일괄 포착해 일관된 에러 응답을 반환했습니다.

Redis + Redisson 분산락

  • 발주 락은 기관 ID 기반 락으로 동일 기관 동시 발주를 방지하고, 서로 다른 기관은 독립 락 키로 불필요한 대기를 줄였습니다.
  • 결제 락은 주문 ID 기반 락을 공유해 결제 시작과 수동 결제 저장 간 충돌 및 이중 결제를 방지했습니다.
  • @DistributedLock AOP 공통 컴포넌트로 비즈니스 로직과 락 처리를 분리했습니다.
  • 락 획득 성공/실패/인터럽트, 예외 발생 시 락 해제 보장, 다중 락 부분 획득 실패 시 획득한 락 전체 해제를 단위 테스트로 검증했습니다.
  • CountDownLatch 기반 동시성 통합 테스트로 동일 기관/주문 순차 처리, 서로 다른 기관/주문 독립 처리, 외부 API·DB 오류 후 락 해제와 다음 요청 정상 처리를 검증했습니다.

결제 수단과 상태 동기화

  • 공통 결제 흐름은 추상 클래스에 정의하고, 수단별 세부 처리는 구현체에서 담당하도록 했습니다.
  • 신용카드는 PG 결제 완료 시 즉시 결제완료 상태로 처리하고, 가상계좌는 결제 시작 시 입금대기 후 Pharos 콜백으로 완료·실패를 처리했습니다.
  • 발주 확정은 수주 확정으로, 발주 취소는 수주 취소로, 수주 부분출고는 Pharos에서 B2B로 역방향 동기화했습니다.
  • 결제 완료 시 도메인 이벤트를 발행해 Pharos ERP 결제 상태를 전파했습니다.
  • 매출 전표 발행 후 취소 불가 처리로 회계 장부 데이터 정합성을 보호했습니다.

NAS 이미지 공유와 알림 트랜잭션 격리

  • ERP 6대와 B2B 1대, 총 7대 WAS 간 NHN Cloud NAS 마운트로 파일 공유를 구성했습니다.
  • Thumbnailator 기반으로 목록용 50×50, 상세용 320×320 다중 해상도 썸네일을 생성해 이미지 로딩 속도를 최적화했습니다.
  • 수주 등록, 발송 이력 등록, 포인트 차감, 메시지 발송 흐름에서 알림 서버 장애나 포인트 부족이 발생해도 수주 등록은 완료되도록 REQUIRES_NEW 트랜잭션으로 격리했습니다.

Result / Impact

  • Pharos·Hiworks·Stella 3개 채널별 독립 인증 서버 연동과 AES-256 링크키로 채널 간 데이터 격리 및 URL 추측 공격 차단 구조를 구축했습니다.
  • 멀티 서버 환경에서 동일 기관 중복 발주와 동일 주문 이중 결제를 분산락으로 방지하고, AOP 공통 컴포넌트로 락 처리를 분리했습니다.
  • B2B ↔ Pharos ERP 양방향 상태 동기화로 발주 확정·취소·부분출고·결제 완료까지 일관된 흐름을 확보했습니다.
  • 포인트 부족·알림 서버 장애 시에도 수주 등록은 정상 처리되도록 알림 발송 트랜잭션을 격리했습니다.
  • 목록용 50×50, 상세용 320×320 다중 해상도 썸네일 생성으로 용도별 최적 크기를 제공했습니다.