[Hot Item] #1. 한정판 선착순 구매 시스템, 프로젝트 환경부터 제대로 잡기
시리즈: Hot Item 프로젝트 구축기
태그: Python Django PostgreSQL Redis Docker Docker Compose
이 글에서 다루는 내용
- Hot Item 프로젝트가 무엇인지, 왜 만들었는지
- 어떤 기술 스택을 선택했고, 왜 그 기술인지
- Docker로 깔끔한 개발 환경을 구성하는 방법
requirements.txt,Dockerfile,docker-compose.yml파일을 직접 만들어보기
1. Hot Item 프로젝트란?
여러분, 이런 경험 있으신가요?
"한정판 스니커즈 출시 날, 새벽 6시에 일어나서 새로고침을 반복했는데 이미 품절이었다 😢"
이런 상황을 서버 입장에서 생각해보면 어떨까요?
수천 명의 사용자가 동시에 "구매하기" 버튼을 누릅니다. 재고는 딱 100개. 이 상황에서 서버가 제대로 처리하지 못하면 두 가지 문제가 생깁니다.
- 초과 판매: 재고가 100개인데 150개가 팔리는 상황
- 서버 다운: 몰리는 트래픽을 감당하지 못하고 서버가 죽는 상황
Hot Item은 바로 이 문제를 해결하는 프로젝트입니다. 수량이 한정된 상품을 동시에 많은 사람이 구매하려 할 때, 안전하고 공정하게 처리하는 시스템을 만드는 것이 목표입니다.
2. 어떤 기술을 쓰나요?
| 기술 | 역할 | 선택 이유 |
|---|---|---|
| Python + Django | 백엔드 서버 | 빠른 개발, 강력한 ORM |
| PostgreSQL | 메인 데이터베이스 | 안정성, 트랜잭션 지원 |
| Redis | 대기열 & 캐싱 | 초고속 인메모리 처리 |
| Docker | 컨테이너화 | 환경 일관성 보장 |
| Docker Compose | 멀티 컨테이너 관리 | 서비스 간 연결 자동화 |
앞으로 시리즈를 진행하면서 각 기술이 어떤 문제를 해결하는지 하나씩 다뤄볼 예정입니다. 오늘은 먼저 개발 환경 세팅에 집중합니다.
3. 왜 Docker로 시작하나요?
"그냥 로컬에 Python이랑 PostgreSQL 설치하면 되지 않나요?"
맞아요, 가능합니다. 하지만 이런 문제가 생길 수 있습니다.
- 내 Mac에서는 되는데, 다른 컴퓨터에서는 안 된다
- 이미 설치된 PostgreSQL 버전이 달라 충돌이 난다
- 프로젝트 끝나고 설치한 것들을 깔끔하게 지우기가 번거롭다
Docker를 쓰면 이 모든 문제가 사라집니다. 로컬 환경에 아무것도 설치하지 않고, 프로젝트에 필요한 모든 것이 컨테이너 안에서만 실행됩니다. 프로젝트를 삭제할 때는 컨테이너만 내리면 끝입니다.
4. 프로젝트 폴더 구성하기
터미널(iTerm2)을 열고 프로젝트 폴더를 만들겠습니다.
# 프로젝트 폴더 생성
mkdir HotItem
cd HotItem
# 필요한 파일들 생성
touch requirements.txt
touch Dockerfile
touch docker-compose.yml
mkdir은 폴더(디렉토리)를 만드는 명령어이고, touch는 빈 파일을 만드는 명령어입니다. nano를 이용하면 터미널에서 바로 파일 내용을 편집할 수 있습니다.
# nano로 파일 편집 (저장: Ctrl+O → Enter, 종료: Ctrl+X)
nano requirements.txt
지금은 파일 구조만 잡아두고, 내용은 다음 단계에서 채워나갈 예정입니다.
5. 세 파일의 역할 이해하기
📄 requirements.txt — "장보기 목록"
Python 프로젝트에서 필요한 외부 라이브러리 목록을 적어두는 파일입니다.
# 예시
Django==4.2
psycopg2-binary==2.9.9 # PostgreSQL 연결
redis==5.0.1 # Redis 연결
마치 요리 전에 재료 목록을 적어두는 것처럼, 이 파일 하나만 있으면 어떤 환경에서든 pip install -r requirements.txt 명령어로 동일한 라이브러리들을 한 번에 설치할 수 있습니다.
🐳 Dockerfile — "나만의 서버 설계도"
Docker 이미지를 어떻게 만들지 정의하는 파일입니다. 이 파일을 보면 "이 서버는 어떻게 만들어졌는지"를 한눈에 알 수 있습니다.
# 예시 구조
FROM python:3.11 # 어떤 기반 이미지를 사용할지
WORKDIR /app # 컨테이너 안에서의 작업 폴더
COPY requirements.txt . # 파일 복사
RUN pip install -r requirements.txt # 라이브러리 설치
COPY . . # 전체 코드 복사
레시피처럼 위에서 아래로 순서대로 실행됩니다.
🎼 docker-compose.yml — "여러 서버를 한 번에 지휘하는 악보"
Hot Item 프로젝트는 Django 서버 하나만 있는 게 아닙니다. PostgreSQL, Redis도 함께 실행되어야 합니다. 이 세 개의 서비스를 한꺼번에 관리하는 파일이 docker-compose.yml입니다.
# 예시 구조
services:
web: # Django 서버
build: .
ports:
- "8000:8000"
db: # PostgreSQL
image: postgres:15
redis: # Redis
image: redis:7
docker-compose up 명령어 하나로 세 서비스가 모두 실행됩니다. 서비스 간 네트워크 연결도 자동으로 설정해줍니다.
6. 앞으로의 여정 — 이런 기술들을 배웁니다
오늘은 프로젝트의 뼈대를 잡는 과정을 살펴봤습니다. 앞으로 이 프로젝트를 통해 다루게 될 핵심 기술들을 미리 소개합니다.
🔴 Redis Sorted Set으로 대기열 만들기
은행 창구에서 번호표를 뽑고 기다리는 것처럼, Redis가 사용자들에게 순서를 부여합니다. 먼저 접속한 사람(Timestamp가 낮은 사람)이 먼저 처리됩니다.
🔒 Pessimistic Locking으로 동시성 제어하기
화장실 문을 잠그는 것과 같습니다. 한 사람이 들어가면(FOR UPDATE) 그 사람이 나올 때까지 다른 사람은 기다립니다. Django의 select_for_update()를 이용합니다.
7. 정리
오늘 배운 것을 요약하면:
- Hot Item은 한정판 선착순 구매 시스템으로, 동시 접속 트래픽과 재고 정합성 문제를 해결합니다
- Docker를 쓰면 로컬 환경을 건드리지 않고 깔끔한 개발 환경을 구성할 수 있습니다
requirements.txt→ 필요한 라이브러리 목록Dockerfile→ 서버 이미지 설계도docker-compose.yml→ 여러 서비스를 한 번에 관리
다음 포스트에서는 세 파일의 실제 내용을 채우고, docker-compose up 명령어로 세 서비스(Django + PostgreSQL + Redis)가 실제로 실행되는 것을 확인해보겠습니다. 🚀