[플레이데이터 SK네트웍스 Family AI 캠프 10기] 17주차 회고

문승기·2025년 5월 4일
0

📝 SK네트웍스 Family AI캠프 10기 17주차 회고록

📅 기간: 25.04.28 ~ 25.05.02


📌 이번 주는 어땠는지 돌아보며

  • Docker Compose를 이용해서 MySQL, Django(Gunicorn), Nginx를 하나의 환경으로 구성했고, 정적 파일 공유랑 초기 마이그레이션 자동화까지 구현했다.
  • AWS EC2 인스턴스에서 Docker 컨테이너를 실행하고 고정 IP(EIP)를 설정하는 방법을 공부하면서, 실제 배포 환경에서의 인프라 이해도를 높일 수 있었다.
  • 마지막 미니프로젝트 팀이 드디어 결성됐고, 내가 팀장을 맡아 팀을 이끌기로 했다. 잘할 수 있을지 걱정도 되지만, 할 수 있는 최선을 다해보려고 한다.

📚 학습 내용 요약

📌 Docker 기반 웹 서비스 통합 및 EC2 환경 학습

✅ Docker Compose로 Django, MySQL, Nginx 연동

  • docker-compose.yml을 작성해 Django(Gunicorn), MySQL, Nginx를 하나의 서비스로 묶었다.
  • 각 컨테이너는 compose_net이라는 브리지 네트워크로 연결돼서 서로 내부 통신이 가능하도록 했다.
  • Django 컨테이너는 entrypoint.sh 스크립트를 만들어서 컨테이너 시작 시 자동으로 마이그레이션, static 파일 수집, superuser 생성까지 수행하도록 했다.
  • Gunicorn을 이용해서 Django 앱을 WSGI 서버로 돌렸고, Nginx는 이걸 proxy_pass로 연결해서 외부 요청을 처리하게 했다.
  • 정적 파일은 Docker 볼륨을 이용해서 Django에서 Nginx로 넘겨 Nginx가 직접 서빙하게 했다.
  • MySQL 컨테이너는 초기 DB와 사용자 계정을 환경 변수로 자동 설정하고 데이터는 볼륨으로 영속화했다.

✅ AWS EC2와 고정 IP(EIP) 학습

  • Ubuntu 기반 EC2 인스턴스를 만들어서 Docker와 Docker Compose를 설치하고 로컬 환경과 동일하게 구성했다.
  • 고정 IP(EIP)를 할당해서 외부에서 언제든지 접근 가능한 상태로 설정했다.
  • 보안 그룹을 통해서 22번(SSH), 80번(HTTP), 8000번(Gunicorn 테스트용) 포트를 개방했고 접근 제어까지 설정했다.
  • SSH 키 등록과 퍼미션 설정으로 원격 접속을 안전하게 관리했고 컨테이너 상태를 계속 확인했다.

🛠️ 트러블 슈팅

문제 1: Django 컨테이너가 MySQL보다 먼저 실행돼서 DB 연결 에러 발생

  • docker-compose up 실행할 때, depends_on 설정만으로는 MySQL 컨테이너가 완전히 준비되기 전에 Django 컨테이너가 실행될 수 있었다.
  • 그래서 Django가 MySQL에 접속하려고 시도하면 아직 MySQL이 준비되지 않아서 아래 같은 에러가 발생했다:
django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'mysql_server'")

👉 depends_on은 실행 순서만 보장할 뿐, 서비스가 완전히 준비됐는지까지는 보장하지 않는다.


🔧 해결 방법

Django 컨테이너가 DB 준비가 끝날 때까지 기다리게 .sh 스크립트를 수정했다

#!/bin/sh

# DB가 시작될 때까지 잠시 기다림
sleep 10

# 마이그레이션 및 정적 파일 수집
python manage.py makemigrations --no-input
python manage.py migrate --no-input
python manage.py collectstatic --no-input

# 슈퍼유저 자동 생성
DJANGO_SUPERUSER_PASSWORD=$SUPER_USER_PASSWORD python manage.py createsuperuser \
  --username $SUPER_USER_NAME \
  --email $SUPER_USER_EMAIL \
  --noinput

# Gunicorn WSGI 서버 실행
gunicorn config.wsgi:application --bind 0.0.0.0:8000

✅ 이 스크립트를 DockerfileENTRYPOINT로 등록해서 Django 컨테이너가 MySQL 준비가 끝난 뒤 실행되도록 했다.


✅ 요약

  • depends_on은 실행 순서만 보장하고 실제 서비스 준비 상태는 보장하지 않음
  • 일단 sleep으로 간단히 대기하는 방법을 사용했는데, 간단하고 효과적이긴 하다.
  • 앞으로는 ncwait-for-it.sh를 써서 더 정교하게 준비 상태를 체크하는 방법도 고려할 수 있다.

🔄 KPT 회고 (17주차)

✅ Keep

  • Docker Compose와 Nginx, Gunicorn, Django, MySQL을 한 환경에서 잘 구성하고 구현까지 마쳤다.
  • AWS EC2라는 낯선 환경에서도 끝까지 포기하지 않고 배포까지 진행했다.
  • 문제가 생기면 바로바로 검색하고 문서를 확인하면서 해결하려고 노력했다.

❌ Problem

  • AWS EC2, EIP 같은 개념이 처음이라 낯설었고, 보안 그룹이나 키 등록, 포트 설정 등이 조금 어려웠다.
  • Docker 컨테이너 간의 의존성 문제 때문에 실행 오류가 많이 발생해서 디버깅에 시간이 꽤 걸렸다.
  • 미니 프로젝트, 정처기 준비, 최종 프로젝트 압박이 동시에 몰리면서 집중하기 쉽지 않았다.

💡 Try

  • EC2 같은 클라우드 환경에서 경험한 인프라 구성을 기반으로, 다음엔 CI/CD 자동화를 단계별로 실습해볼 계획이다.
  • 장고 프로젝트를 Nginx와 함께 Docker 이미지로 만드는 것부터 시작해서 AWS에 직접 배포하는 것까지 실습해보고 싶다.
  • 정처기 시험 대비는 별도의 시간을 정해서 효율적으로 준비할 생각이다.

✅ 마무리

  • 이번 주는 부트캠프가 거의 끝나간다는 게 실감나면서 부담이 커졌던 한 주였다.
  • AWS처럼 낯선 클라우드 환경은 처음이라 장벽처럼 느껴졌고, 도커 서비스가 제대로 안 돌아갈 때마다 좌절감이 들었다.
  • 미니 프로젝트 리딩과 정처기 준비까지 겹치니까 "할 수 있을까?" 싶은 의문도 들었다.
  • 그래도 포기하지 않고 계속 도전하고 있다는 것 자체가 성취라고 생각한다.
  • 지금은 좀 느리고 힘들어 보일 수 있어도 하나씩 도장 깨듯 해결하면서 끝까지 나아가려 한다.
  • 작은 성취들이 쌓이면 결국 큰 성장으로 이어진다는 걸 믿으면서 다음 주도 열심히 나아가보겠다.
profile
AI 모델을 개발하여 이를 활용한 서비스를 개발하고 운영하는 개발자가 되기 위해 꾸준히 노력하겠습니다!

0개의 댓글