sales-1

이지예·2026년 9월 17일

개발

목록 보기
23/58

series: 멀티클라우드 견적 자동화 시스템

왜 만들었나

이전에 다루던 도메인은 VMware·Citrix·Nutanix 같은 온프레미스 멀티벤더 오케스트레이션이었습니다. 벤더마다 API가 다르고, 스펙 표현 방식이 다르고, 인증 방식도 제각각인 환경에서 "하나의 통일된 인터페이스로 여러 벤더를 다룬다"는 문제를 계속 마주쳤습니다.

이 경험을 클라우드 영업 도메인으로 옮겨보면 어떨까 생각했습니다. 영업/기획 담당자가 고객에게 클라우드 견적을 낼 때 실제로 하는 일은:

  1. AWS 콘솔 가격 계산기 열기
  2. Azure 가격 계산기 열기
  3. 두 결과를 엑셀에 손으로 옮겨 적기
  4. 스펙이 바뀔 때마다 1~3 반복

이 반복을 없애는 게 목표였습니다. 워크로드 스펙(vCPU·RAM·스토리지·리전·OS)을 한 번 입력하면, AWS·Azure·GCP의 실제 공개 가격 API를 조회해서 벤더별 월 비용을 자동으로 비교해주는 서비스를 만들기로 했습니다.

중요한 제약을 하나 걸었습니다: 하드코딩된 가격표를 쓰지 않는다. 클라우드 가격은 계속 바뀌는데, 정적 테이블을 유지보수하는 건 결국 "며칠 지난 틀린 견적"을 내는 것과 같습니다. 그래서 반드시 벤더가 공개한 실제 가격 API를 연동하는 것을 전제로 잡았습니다.

핵심 기능 (MVP 기준)

  1. 워크로드 스펙 입력 → 벤더별 견적 자동 계산
  2. AWS / Azure 가격 비교 테이블 + 차트
  3. 견적 저장 및 이력 조회
  4. 가격 데이터 주기적 캐싱 (스케줄러, 매일 1회 동기화)

이후 GCP 연동, PDF 견적서 내보내기, 조건별 필터, Docker 배포 구성까지 단계적으로 확장했습니다.

기술 스택

구분기술
BackendJava 17, Spring Boot 3.3, Spring Data JPA, Spring Scheduler, Spring Validation
FrontendReact 18, TypeScript, Vite, Axios, Recharts
DBH2(로컬 개발) / MySQL 8(Docker·운영)
외부 연동Azure Retail Prices API, AWS Price List Query API(SDK v2), GCP Cloud Billing Catalog API
그 외OpenPDF(견적서), springdoc(Swagger), JUnit 5·PDFBox·Playwright(테스트)

Backend는 익숙한 스택이라 큰 고민이 없었지만, Frontend는 SPA + REST 조합이 이 프로젝트의 핵심(비교 테이블·차트·필터 상호작용)을 표현하기에 적합하다고 판단해 React + TypeScript로 정했습니다.

전체 아키텍처

[React] ──REST──▶ [Spring Boot] ──▶ [H2 / MySQL]
                        ▲              Vendor / PriceSnapshot
                        │              QuoteRequest / QuoteItem
              PriceSyncScheduler (매일 1회)
                        │
                        ├─(HTTP)──────────▶ Azure Retail Prices API      (인증 없음)
                        ├─(AWS SDK/SigV4)─▶ AWS Price List Query API     (IAM 자격증명)
                        └─(HTTP + API Key)▶ GCP Cloud Billing Catalog API (기본 비활성)

여기서 가장 먼저 정한 설계 원칙이 하나 있습니다.

견적 요청이 들어올 때마다 벤더 API를 직접 호출하지 않는다.

대신 스케줄러가 주기적으로 가격을 수집해서 PriceSnapshot 테이블에 캐싱하고, 견적 API는 이 캐시만 조회합니다. 이렇게 나눈 이유는 세 가지입니다.

  • Azure·GCP는 페이지당 최대 1,000건 응답이라, 요청마다 전체를 스캔하면 응답 시간이 초 단위로 늘어납니다.
  • AWS Price List Query API는 SigV4 서명 호출 자체에 레이턴시가 있습니다.
  • 가장 중요한 이유 — 외부 API가 장애가 나도 서비스는 마지막 캐시로 계속 동작해야 합니다. 영업 미팅 중에 "가격 API가 죽어서 견적이 안 나온다"는 상황은 만들고 싶지 않았습니다.

이 시리즈에서 다룰 것

이후 편에서는 이 아키텍처를 구현하면서 실제로 부딪힌 문제들을 다룹니다.

  • 2편: 인증 방식도, 응답 구조도, 페이지네이션도 다른 벤더 3사를 하나의 인터페이스로 묶은 방법
  • 3편: Azure가 vCPU·메모리를 안 주는 문제를 SKU 이름 파싱으로 해결한 과정
  • 4편: 한 벤더가 실패해도 나머지는 살아남는 동기화 설계
  • 5편: 한글 PDF 견적서를 만들면서 겪은 트레이드오프
  • 6편: 실제 화면에서만 드러난 null vs undefined 버그
  • 7편: 배포를 준비하며 정리한, 아직 검증하지 못한 것들

기능을 나열하기보다 왜 그렇게 만들었는지, 그 과정에서 무엇이 틀렸고 어떻게 고쳤는지를 위주로 쓸 예정입니다.

profile
github: @dlwldP

0개의 댓글