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 생성 로직 구현
결과: 통합된 이미지 관리와 마켓별 호환성 확보
🔗 관련 자료
- 프로젝트 소개 자료: RODI 소개 PDF
🔮 확장 계획
- 추가 마켓 연동: 롯데온, 인터파크, 위메프 등 주요 쇼핑몰 연동
- 대시보드 개발: 판매 통계 및 재고 관리 시각화 도구
- 자동화 고도화: AI 기반 카테고리 분류 및 키워드 최적화
이 프로젝트를 통해 실제 비즈니스 문제를 해결하는 백엔드 시스템 설계 경험과 다양한 외부 API 통합 역량을 쌓을 수 있었습니다.