RODI

다중 쇼핑몰 통합 상품 관리 시스템

프로젝트 기간: 2023.07 - 2024.04 (10개월)
개발 형태: 백엔드 엔지니어 (스타트업)
역할: 백엔드 아키텍처 설계 및 API 개발 (기여도 100%)

🎯 프로젝트 개요

RODI(Retail Order Data Integration)는 여러 온라인 쇼핑몰 플랫폼의 상품 등록과 관리를 하나의 인터페이스에서 통합적으로 처리할 수 있는 백엔드 시스템입니다.

해결하고자 한 문제:

  • 각 쇼핑몰마다 다른 상품 등록 방식과 API 연동 방식 통합
  • 다양한 마켓플레이스의 계정 연동 및 인증 처리 간소화
  • 여러 쇼핑몰에 동일한 상품 정보를 한 번에 등록하고 관리

🛠️ 기술 스택

백엔드

  • Python 3.x - 메인 개발 언어
  • FastAPI 0.103.0 - 고성능 웹 프레임워크
  • Uvicorn - ASGI 서버
  • Requests - HTTP 클라이언트 라이브러리

데이터베이스 & 스토리지

  • DynamoDB (AWS) - NoSQL 데이터베이스
  • S3 (AWS) - 클라우드 스토리지

외부 API 연동

  • 쿠팡 파트너스 API - HMAC 인증 방식
  • 네이버 스마트스토어 API - OAuth 2.0 인증
  • 11번가 API - API Key 인증 방식
  • 인터파크 API - Cite Key/Secret Key 인증

인프라 & 도구

  • Docker - 컨테이너화 배포
  • Boto3 1.28.35 - AWS SDK
  • PyYAML 6.0.1 - 설정 파일 관리
  • bcrypt - 비밀번호 해싱
  • xmltodict - XML 데이터 처리

🚀 주요 기능

1. 다중 마켓플레이스 연동

각 마켓플레이스의 서로 다른 인증 방식을 통합한 실용적 어댑터 패턴 구현:

# 쿠팡 API HMAC 인증 구현
def get_authorization(self, secretkey, accesskey, method, path) -> str:
    datetime = time.strftime('%y%m%d') + 'T' + time.strftime('%H%M%S') + 'Z'
    message = datetime + method + path
    signature = hmac.new(secretkey.encode('utf-8'), 
                        message.encode('utf-8'), 
                        hashlib.sha256).hexdigest()
    authorization = "CEA algorithm=HmacSHA256, access-key=" + accesskey + \
                    ", signed-date=" + datetime + ", signature=" + signature
    return authorization

2. 통합 상품 관리 시스템

  • 단일 인터페이스: 하나의 API로 여러 마켓에 동시 상품 등록
  • 마켓별 데이터 변환: 각 마켓의 API 요구사항에 맞는 데이터 구조 변환
  • 이미지 관리: S3 연동을 통한 상품 이미지 통합 관리

3. 인증 및 계정 관리

  • JWT 기반 사용자 인증: 보안 강화된 토큰 인증 시스템
  • 마켓별 API 키 관리: 사용자별 각 마켓플레이스 인증 정보 안전 저장
  • 동적 인증 정보 저장: DynamoDB를 통한 사용자별 마켓 연동 정보 관리

4. 상품 등록 및 관리

  • 마켓별 상품 등록: 각 마켓의 API 스펙에 맞는 상품 등록 처리
  • 이미지 업로드: S3를 통한 이미지 저장 및 마켓별 이미지 URL 생성
  • 상품 상태 관리: 등록된 상품의 상태 추적 및 관리

💡 핵심 기술 성과

1. 아키텍처 설계

실용적 어댑터 패턴 적용으로 마켓별 API 차이점을 추상화:

# 마켓별 클래스 구조
class Coupang:
    def __init__(self, config: CoupangConfig):
        self.url = config.url
    
    def register_product(self, body, images, user_vendor_id, user_access_key, user_secret_key):
        # 쿠팡 HMAC 인증 및 상품 등록 로직
        pass

class SmartStoreClient:
    def __init__(self, config: NaverSmartStoreConfig):
        self.url = config.url
    
    def register_product(self, product, image_urls, token):
        # 네이버 OAuth 인증 및 상품 등록 로직
        pass

class ElevenStreetClient:
    def __init__(self, config: ElevenStreetConfig):
        self.url = config.url
    
    def register_product(self, openapikey, product, product_image_urls, detail_image_url):
        # 11번가 API Key 인증 및 상품 등록 로직
        pass

2. 마켓별 인증 방식 통합

각 마켓의 고유한 인증 방식을 클래스 내부에 캡슐화:

# 스마트스토어 OAuth 2.0 인증
def get_auth_token(self, application_id, application_secret):
    timestamp = int(time.time() * 1000)
    password = client_id + '_' + str(timestamp)
    hashed = bcrypt.hashpw(password.encode('utf-8'), client_secret.encode('utf-8'))
    client_secret_sign = pybase64.standard_b64encode(hashed).decode('utf-8')
    # OAuth 토큰 요청 로직

# 11번가 XML 기반 API 호출
def register_product(self, openapikey, product, product_image_urls, detail_image_url):
    headers = {
        "openapikey": openapikey,
        "Content-Type": "text/xml;charset=euc-kr"
    }
    xml_bytes = dicttoxml.dicttoxml(product, encoding="EUC-KR", custom_root="Product", attr_type=True)
    # XML 변환 및 API 호출

3. 서비스 레이어 통합

마켓별 클래스를 동일한 인터페이스로 사용하는 서비스 레이어:

class RegisterItemService:
    def register_smartstore(self, body, user_email):
        smartstore_client = SmartStoreClient(self.config.naver_smart_store)
        user_auth_token = smartstore_client.get_auth_token(user_application_id, user_application_secret)
        return smartstore_client.register_product(product, image_urls, user_auth_token)
    
    def register_coupang(self, body, user_email):
        coupang_client = Coupang(self.config.coupang)
        return coupang_client.register_product(user_item_info, user_item_images, user_vendor_id, user_access_key, user_secret_key)

📋 시스템 아키텍처

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   프론트엔드     │◄──►│   FastAPI 서버   │◄──►│   DynamoDB      │
│   (관리 도구)    │    │                 │    │                 │
└─────────────────┘    └─────────────────┘    └─────────────────┘
                                │
                                │
                    ┌───────────────────────┐
                    │  마켓별 클래스 어댑터  │
                    └───────────────────────┘
                                │
        ┌───────────────────────┼───────────────────────┐
        │                       │                       │
        ▼                       ▼                       ▼
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   쿠팡 API      │    │ 스마트스토어 API │    │   11번가 API    │
│  (HMAC 인증)    │    │  (OAuth 2.0)    │    │  (API Key)      │
└─────────────────┘    └─────────────────┘    └─────────────────┘

🔧 기술적 도전과 해결

1. API 인증 방식 표준화

문제: 쿠팡(HMAC), 스마트스토어(OAuth), 11번가(API Key), 인터파크(Cite Key) 등 서로 다른 인증 방식

해결: 마켓별 클래스를 생성하여 각 마켓의 인증 로직을 캡슐화하고, 공통 메서드명으로 인터페이스 통일

결과: 새로운 마켓 추가 시 동일한 패턴으로 클래스만 구현하면 되는 확장 가능한 구조 확보

2. 데이터 형식 변환

문제: 마켓별 상이한 상품 데이터 구조와 요구사항 (JSON, XML, 특정 필드명 등)

해결: 각 마켓 클래스 내부에서 해당 마켓에 맞는 데이터 변환 로직 구현

결과: 마켓별 API 스펙에 맞는 정확한 데이터 전송 및 상품 등록 성공

3. 이미지 관리 통합

문제: 각 마켓마다 다른 이미지 업로드 방식과 URL 요구사항

해결: S3를 중앙 저장소로 활용하고, 마켓별 이미지 URL 생성 로직 구현

결과: 통합된 이미지 관리와 마켓별 호환성 확보

🔗 관련 자료

🔮 확장 계획

  • 추가 마켓 연동: 롯데온, 인터파크, 위메프 등 주요 쇼핑몰 연동
  • 대시보드 개발: 판매 통계 및 재고 관리 시각화 도구
  • 자동화 고도화: AI 기반 카테고리 분류 및 키워드 최적화

이 프로젝트를 통해 실제 비즈니스 문제를 해결하는 백엔드 시스템 설계 경험과 다양한 외부 API 통합 역량을 쌓을 수 있었습니다.