인프라 개요
이 문서는 Thinvent 공개 웹사이트를 구동하는 인프라에 대한 포괄적인 개요를 제공합니다. 웹 서버부터 데이터베이스 계층까지 완전한 기술 스택을 다루며, 모든 구성 요소가 어떻게 함께 작동하여 빠르고 안정적이며 확장 가능한 전자상거래 경험을 제공하는지 설명합니다.
웹 애플리케이션 스택
Flask - 기반
우리 웹사이트는 가볍고 유연한 Python 웹 프레임워크인 Flask를 기반으로 구축되었습니다. Flask는 핵심 라우팅, 요청/응답 처리 및 애플리케이션을 모듈식 구성 요소로 구성하는 블루프린트 시스템을 제공합니다.
우리가 사용하는 주요 Flask 기능:
-
Blueprints: 애플리케이션을 논리적 모듈(웹, API, 장바구니, 제품 등)로 구성
-
Jinja2 템플릿: 템플릿 상속을 통한 서버 측 HTML 생성
-
Request context: HTTP 요청 및 세션의 자동 처리
-
Werkzeug: 개발 서버 및 유틸리티 함수
Flask 애플리케이션은 다음을 수행하는 웹 모듈에서 초기화됩니다:
-
웹 블루프린트 생성
-
국제화를 위한 Babel 초기화
-
Valkey 세션 저장소 구성
-
템플릿 변수를 위한 컨텍스트 프로세서 설정
Gunicorn - 프로덕션 서버
프로덕션 환경에서는 Python WSGI HTTP 서버인 Gunicorn (Green Unicorn)을 사용합니다. Gunicorn은 여러 작업자 프로세스로 Flask 애플리케이션을 실행합니다.
Gunicorn은 충돌 또는 서버 재부팅 시 자동으로 재시작되도록 보장하는 systemd에 의해 관리됩니다. 이를 통해 수동 개입 없이 높은 가용성을 확보합니다.
Nginx - 리버스 프록시 및 로드 밸런서
Nginx는 우리의 리버스 프록시 및 로드 밸런서 역할을 합니다. Gunicorn 앞에 위치하여 다음을 처리합니다:
-
SSL/TLS 종료: HTTPS 암호화/복호화
-
정적 파일 제공: CSS, JavaScript, 이미지 (디스크에서 직접 제공)
-
리버스 프록시: 동적 요청을 Gunicorn으로 전달
-
속도 제한: 악용으로부터 보호
-
요청 압축: 더 빠른 전송을 위한 Gzip 압축
Ubuntu - 운영 체제
모든 EC2 인스턴스는 우리가 선택한 Linux 배포판인 Ubuntu를 실행합니다. 가능한 경우 pip보다 Ubuntu python 패키지를 사용하는 것을 선호합니다.
일반적인 요청 흐름은 다음과 같습니다:
flowchart LR
A[클라이언트 브라우저] -->|HTTPS 요청| B[Nginx]
B -->|프록시| C[Gunicorn]
C -->|WSGI| D[Flask 앱]
D -->|쿼리| E[Valkey 캐시]
E -->|미스| F[DynamoDB]
F -->|응답| E
E -->|히트| G[응답]
G --> B
B -->|응답| ACloudFront - 콘텐츠 전송 네트워크
CloudFront는 우리의 CDN으로 다음을 제공합니다:
-
DDoS 보호: 분산 공격에 대한 내장 보호
-
Origin shielding: 트래픽 급증으로부터 원본 서버 보호
우리의 CloudFront 배포에는 두 개의 오리진이 있습니다:
-
백엔드 서버: 백엔드 Flask 앱
-
S3: 정적 자산용 S3 버킷
구성된 캐시 동작:
-
/s/*- 정적 자산 (CSS, JS, 이미지), 24시간 TTL -
/ds/*.pdf- 데이터시트, 24시간 TTL -
/api/*- API 엔드포인트, 캐싱 없음 -
/cart- 장바구니, 24시간 TTL -
/set-language- 캐싱 없음 (동적)
데이터 계층
DynamoDB - 기본 데이터베이스
우리는 기본 데이터베이스로 Amazon DynamoDB를 사용합니다. DynamoDB는 NoSQL 데이터베이스입니다.
우리의 DynamoDB 테이블에는 다음이 포함됩니다:
-
추천사항: AI 생성 제품 추천
-
제품 설명: 여러 언어로 된 제품 설명
-
쿼리 페이지: SEO를 위한 파싱된 쿼리 페이지
우리는 DynamoDB를 위한 Pythonic ORM인 PynamoDB를 사용하며, 이는 다음을 제공합니다:
- 모델 정의: 데이터베이스 테이블을 위한 Python 클래스
Valkey - 인메모리 캐시
Valkey (Redis의 포크)는 우리의 인메모리 캐시 계층으로 다음을 제공합니다:
-
세션 저장소: 30일 슬라이딩 만료 기간의 사용자 세션
-
자주 액세스하는 데이터: 제품 수, 인기 쿼리
-
자동 완성 캐시: 검색 제안
-
이미지 매니페스트: 제품 이미지 위치
Valkey는 상당한 성능 이점을 제공합니다:
-
읽기 작업에서 DynamoDB보다 100배 빠름
-
데이터베이스 부하 감소: 캐시 히트로 인한 DynamoDB 쿼리 회피
-
세션 지속성: 요청 간 Valkey 지원 세션
우리는 Valkey를 다음 용도로 사용합니다:
-
세션: 사용자 로그인 상태, 장바구니 데이터
-
캐싱: 인기 쿼리, 자동 완성 제안
-
카운터: 제품 재고 수 (성능을 위해 캐시됨)
-
큐: 백그라운드 작업 처리
S3 - 객체 저장소
Amazon S3는 우리의 객체 저장소 서비스입니다.
우리는 S3를 다음 용도로 사용합니다:
-
제품 이미지: 고해상도 제품 사진
-
데이터시트: PDF 제품 사양서
-
정적 자산: CSS, JS, 이미지
DNS 및 라우팅
Route53 - 도메인 관리
Route53은 우리의 DNS 관리를 처리합니다:
- 도메인 등록: thinvent.in 및 관련 도메인
Nginx 라우팅
Nginx는 URL 패턴에 따라 요청을 라우팅합니다:
-
/→ Flask 앱 (홈, 제품, 장바구니, 결제) -
/q/→ Flask 앱 (쿼리 페이지, 검색 결과) -
/api/→ Flask 앱 (API 엔드포인트) -
/static/→ CloudFront/S3 (정적 자산)
검색 및 AI 인프라
검색 서비스
검색 기능을 위해 독립 실행형 Flask 애플리케이션을 운영합니다. 이 서비스는 다음을 제공합니다:
-
벡터 검색: 관련 쿼리에 대한 의미적 유사성
-
자동 완성: 접두사 기반 검색 제안
-
인기 쿼리: 가장 많이 검색된 용어
-
필터 추출: 패싯을 위한 검색 쿼리 파싱
검색 서비스는 다음을 사용합니다:
-
Valkey RediSearch: 벡터 유사성 검색
-
SentenceTransformer: 임베딩 생성
-
구문 매핑: 부분 문자열 매칭을 통한 필터 추출
AI 제공자
다양한 작업에 여러 AI 제공자를 사용합니다:
DeepSeek
-
모델: deepseek-chat
-
사용 사례: 제품 설명, 쿼리 페이지 콘텐츠, 번역
-
API: Together.ai 폴백이 있는 DeepSeek API
-
캐싱: 프롬프트 캐싱 효율성을 위한 시스템 프롬프트
Gemini
-
모델: Gemini (특정 모델)
-
사용 사례: 콘텐츠 생성
-
통합: 직접 API 호출
Amazon Bedrock
-
모델: Nova Pro
-
사용 사례: 내부 채팅
-
통합: boto3 SDK
Amazon Bedrock
-
모델: Nova Lite
-
사용 사례: 고객 챗봇
-
통합: boto3 SDK
완전한 요청 흐름
일반적인 요청이 우리의 인프라를 통해 어떻게 흐르는지 설명합니다:
flowchart TD
A[클라이언트 브라우저] -->|DNS 쿼리| B[Route53]
B -->|IP 주소| C[CloudFront]
C -->|캐시 확인| D{캐시 히트?}
D -->|예| E[캐시된 콘텐츠 반환]
D -->|아니오| F[Nginx]
F -->|프록시| G[Gunicorn]
G -->|WSGI| H[Flask 앱]
H -->|캐시 확인| I[Valkey]
I -->|히트| J[캐시된 데이터 반환]
I -->|미스| K[DynamoDB]
K -->|쿼리| L[데이터 반환]
L --> I
J --> M[응답 구성]
E --> M
M --> N[클라이언트로 전송]모니터링 및 상태 확인
UptimeRobot - 외부 모니터링
모든 공개 엔드포인트의 외부 모니터링을 위해 UptimeRobot을 사용합니다:
-
백엔드 서버: 백엔드 웹사이트
-
www.thinvent.in: 공개 웹사이트
상태 확인
-
Gunicorn: systemd가 재시작 관리
-
Flask:
/health엔드포인트가 상태 반환 -
Valkey: 연결 상태 모니터링
-
DynamoDB: 지연 시간 및 처리량 모니터링
로깅
-
애플리케이션 로그: Gunicorn error.log
-
액세스 로그: Gunicorn access.log
-
이메일: Python 트레이스백이 포함된 중요 이벤트에 대한 실시간 알림
요약
우리의 인프라는 다음을 위해 설계되었습니다:
-
성능: 다중 캐싱 계층, CDN, 최적화된 쿼리
-
확장성: 자동 확장 데이터베이스, 로드 밸런싱
-
비용 효율성: 사용량 기반 과금, 데이터베이스 부하 감소를 위한 캐싱
Flask, Gunicorn, Nginx, Ubuntu, DynamoDB, Valkey, CloudFront 및 UptimeRobot의 조합은 우리의 전자상거래 플랫폼을 위한 강력하고 확장 가능한 기반을 제공합니다.
관련 문서
-
Analytics Architecture - 우리의 하이브리드 분석 접근 방식에 대해 알아보기
-
SEO Pipeline - 검색 쿼리가 제품 페이지가 되는 과정 이해하기
-
Search Service Architecture - 우리의 검색 인프라 살펴보기
-
Caching Strategy - 모든 계층에서의 캐싱 탐구하기
-
Deployment Architecture - 시스템이 배포되는 방식 보기
-
Security Considerations - 보안 조치 검토하기