시리즈: 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)가 실제로 실행되는 것을 확인해보겠습니다. 🚀

 

+ Recent posts