데이터를 불러오는 중입니다...
도매상과 화원 간의 실시간 화훼 거래를 지원하는 B2B 플랫폼입니다. 1인 백엔드 개발자로서 실시간 주문 상태 동기화, 구독 기반 자동 빌링(Toss 연동), 정산 파이프라인 구축 등 코어 서버 로직 전반을 단독 설계했습니다. 프론트엔드(React) 2인 팀의 초기 아키텍처 표준화도 주도하여 팀 전체의 개발 생산성과 코드 일관성을 끌어올렸습니다.
외부 지급대행 API를 통한 정산은 한 번 실행되면 되돌릴 수 없습니다. 공휴일이나 네트워크 장애 시 중복 정산되거나 누락되는 사고를 방어해야 했고, 정산 대상 데이터를 매 실행마다 DB에서 재조회할 때 발생하는 I/O 부하 문제도 동시에 해결해야 했습니다.
| 대안 | 접근 | 기각 사유 |
|---|---|---|
| DB 상태값만으로 재시도 관리 | 정산 실패 시 상태를 '실패'로 마킹, 다음 실행 시 재조회 | 실패 후 재조회 쿼리 부하 + 이중 실행 위험 잔존 |
| 정규 Outbox 테이블 + MQ | DB 트랜잭션과 메시지 발행을 분리, 메시지 큐로 재시도 | 리소스 제약 환경에서 RabbitMQ/Kafka 도입은 과도한 운영 복잡도 |
| JSON 파일 기반 간이 Outbox 패턴 | 정산 대상 데이터를 물리 JSON 파일로 저장, 성공 시 삭제 | — |
DB 상태 선점으로 중복 실행을 막고, JSON 파일을 Fallback으로 두어 실패 시 다음 영업일에 파일을 그대로 재사용하는 구조가 현재 팀 규모와 운영 환경에 가장 실용적인 타협점이었습니다.
이 챌린지의 설계 결정과 기술적 상세는 인사이트 JSON 파일을 활용한 간이 Outbox 패턴으로 정산 데이터 지키기 에서 다루고 있습니다.
도매상과 화원이 '주문 접수 ➝ 승인 ➝ 진행 ➝ 완료' 상태를 즉각적으로 공유해야 했으나, 기존의 HTTP Polling 방식은 트래픽 낭비와 서버 부하를 유발해 B2B 거래의 실시간성을 보장하기에 비효율적이었습니다.
비효율적인 Polling을 걷어내고, Socket.io의 Room(User UUID 기반) 시스템을 도입했습니다. 상태 변경 시점에만 관련 도매상과 타겟 화원에게 이벤트를 즉각적으로 Emit 하는 이벤트 파이프라인을 구축하여 서버 부하를 최소화했습니다.
과거 프로젝트에서 정형화된 아키텍처의 부재로 작업자마다 코드 스타일과 디렉터리 구조가 달라져 유지보수에 큰 어려움을 겪었던 한계가 있었습니다.
과거의 산발적인 구조를 탈피하고자, 전역 상태를 '유저 정보' 수준으로 최소화했습니다. 대신 기능(Feature) 단위로 폴더링을 모듈화하는 디렉터리 아키텍처 규약을 선제적으로 제시하여 철저히 캡슐화된 상태 관리를 리드했습니다.
Socket.io를 도입해 실시간 주문 상태 동기화를 구현했습니다. 화면이 즉각적으로 갱신되는 마법 같은 경험에 처음에는 기뻤지만, 운영 환경을 모니터링하고 트래픽 증가를 시뮬레이션하면서 현재 아키텍처가 가진 '메시지 유실 리스크' 와 '트래픽 관리의 맹점' 을 뼈저리게 인지하게 되었습니다.