Docker logo (source: https://www.docker.com/company/newsroom/media-resources/)

환경구성

개발 환경은 하기와 같이 진행하기로 했었습니다.

  • 서버 구성 방식
    • Docker container 사용 - Backend, Frontend, DB, Server(Nginx)를 각각의 컨테이너로 구동
    • Nginx를 프록시 방식으로 구동 (Nginx 컨테이너만 외부에 노출되도록 진행)
  • 레포 구성 방식
    • 메인 레포에서 서브모듈로 백엔드, 프론트엔드, env, docker 파일 레포 연결
    • env, docker파일 레포의 경우 private 레포로 생성해 외부에 코드 유출되지 않도록 진행

 

깃헙

협업을 위해 GitHup에 organization을 하나 생성하고, 팀원을 member로 등록했습니다.

그리고 하기와 같이 총 다섯 개의 레포지토리(메인 레포 1개, 서브모듈 4개)를 생성했습니다.

# 레포지토리 역할 공개 여부
1 matcha 메인 레포지토리
- Makefile로 Docker 실행 및 Container 빌드 자동화
public
2 frontend FE 소스코드 public
3 backend BE 소스코드 public
4 service docker compose, docker file 및 DB용 private
5 env 환경변수 저장용 private

 

서브모듈 세팅은 팀원이 한 거여서 정확히 어떻게 세팅하는 지는 모르지만,

사용해보니 환경변수 등 외부에 공개하고 싶지 않은 내용을 내부적으로 공유하기에 편하더라구요.

언젠가를 위해 배워둬야겠다고 생각했습니다.

 

메인 레포에서 make를 실행하면 하기와 같은 내용이 순차적으로 진행되도록 Makefile을 구성했습니다.

(메인 레포인 matcha 레포지토리에는 사실상 Makefile만 있는 셈입니다.)

  1. 각각의 서브모듈 레포 깃 풀
  2. service 레포에 database 저장용 폴더 생성
  3. env 레포의 환경변수 파일을 service 레포로 복사 (service 레포에는 .gitignore로 .env가 등록돼있어 올라가지 않습니다)
  4. (도커가 실행중이지 않은 경우) 도커 실행
  5. service 레포에 있는 docker-compose 파일 기반으로 빌드

 

도커 컨테이너 구성

서버(nginx), 프론트, 백, DB 총 4개의 컨테이너가 필요합니다.

각각의 컨테이너 빌드를 위해 Dockerfile을 작성하고, 컨테이너를 한 번에 빌드하기 위해 docker-compose 파일을 만들었습니다.

42과제 중 Inception에서 배웠던 도커 구성법을 되짚어보면서 volume, network까지 세팅해줍니다.

 

하기는 backend의 Dockerfile입니다.

python3, flask, uwsgi를 다운로드하고 uwsgi를 백그라운드로 실행하는 이미지입니다.

FROM	python:3.12

WORKDIR /usr/app/srcs

RUN     apt-get update \
        && apt-get -y upgrade \
        && apt-get -y install python3-pip \
        && pip install flask \
        && pip install uwsgi \
        && ln -s /usr/local/bin/uwsgi /usr/bin/uwsgi

CMD [ "uwsgi", "uwsgi.ini" ]

 

 

프론트 컨테이너는 팀원이 Dockerfile을 작성할 예정이고, DB 변경 이슈가 있어 (PostgreSQL 대신 MongoDB를 사용해보려고 합니다) 아직 docker-compose 파일은 완성본이 나오지 않았습니다만, 업데이트가 되면 이 글에도 업로드할 수 있도록 하겠습니다.

 

source: https://pixabay.com/ko/photos/%EC%97%AC%EC%84%B1-%EC%83%89%EC%A2%85%EC%9D%B4-%EC%A1%B0%EA%B0%81-%EB%B0%98%EC%A7%9D%EC%9E%84-6318447/

협업 방식

(함께 개발한 경험이 있는) 두 명이 진행하는 작은 프로젝트여서 중간에 변화가 생겼을 경우 원활한 공유가 가능하지만,

킥오프 미팅을 포함한 개발 초기 단계에 원거리에서 프로젝트 진행 예정이어서 기본적인 부분은 협의를 이루어두고 진행하기로 했습니다.

  • 취합 일정을 공통으로 정해두고, 그 전까지 마무리해야하는 부분은 각자 맞춰서 끝내는 방식
    • 코드 관리: GitHub
    • 팀 일정 관리: Slack
    • 협업 문서 관리: Swagger
  • git 관련 추가 내용
    • issue를 생성하고 관련 commit에 tag하면서 관리
    • commit 메시지 한 줄로 표현할 수 있는 작은 단위의 commit size 유지
  • 공통 목표: 일일 사용 유저 30명의 서비스
  • 개인 목표: 포트폴리오 용 프로젝트, git 활용 연습, Python 웹 개발 및 프레임워크(Flask, Django) 연습, 클라우드 배포

 

기술 스택

제가 담당하는 백엔드는 하기와 같은 스택으로 진행하기로 했습니다.

  • 언어: Python
  • 프레임워크: Flask (과제 제출 이후 Django로 리팩토링 목표!)
  • 웹서버: Nginx
  • DB: PostgreSQL, Redis
  • 실시간 통신: web socket

 

환경 구성

  • 서버 구성 방식
    • Docker container 사용 - Backend, Frontend, DB, Server(Nginx)를 각각의 컨테이너로 구동
    • Nginx를 프록시 방식으로 구동 (Nginx 컨테이너만 외부에 노출되도록 진행)
  • 레포 구성 방식
    • 메인 레포에서 서브모듈로 백엔드, 프론트엔드, env, docker파일 레포 연결
    • env, docker파일 레포의 경우 private 레포로 생성해 외부에 코드 유출되지 않도록 진행
    • 브랜치 방식을 사용하지 않고 다른 레포로 관리하기 때문에 브랜치/commit 간 충돌이 나지 않는 장점이 있음

 

앞으로 진행 내용

Python으로 함수와 클래스까지는 만들어봤지만 웹은 처음이어서, 그리고 Flask도 처음이어서 일단 그 공부를 해야겠습니다.

그리고 Docker 컨테이너를 올려야겠죠!

프론트 컨테이너까지는 아니더라도 백엔드 컨테이너(python-flask-uWSGI)와 DB(postgreSQL), 서버(Nginx) 컨테이너를 docker-compose 파일을 통해 한 번에 올리고 nginx를 통해 flask로 연결이 되는 것까지 진행을 해 볼 예정입니다.

Swagger를 어떻게 이식할 수 있는지, Jenkins를 통한 CI/CD는 가능할지, 서비스를 위해 DB 스키마는 어떻게 구성할지도 찾아보고 고민해봐야겠습니다.

source: https://pixabay.com/ko/photos/%EC%B0%A8-%EC%BB%B5-%EB%A7%88%EC%8B%9C%EB%8B%A4-%ED%85%8C%EC%9D%B4%EB%B8%94-3190241/

Matcha project

42서울 아우터 Web 과제 중 Matcha project를 진행 중에 있습니다.

과제의 목표는 소셜 매칭 애플리케이션을 개발하는 것입니다.(과제에는 dating website라고 표기돼있지만 저의 목표는 좀 다릅니다)

과제를 위한 여러 조건이 있지만 가장 포인트가 되는 부분은 "micro-framework"를 사용하는 것입니다.

이와 관련해서 ORM, validators, or a User Account Manager가 포함되지 않는 프레임워크를 사용할 수 있다는 제한 조건이 있습니다.

저는 백엔드 담당으로, 평소에 코딩테스트와 취미용으로 자주 사용한 언어이지만 web 개발은 해보지 않은 Python과 Flask 프레임워크로 개발을 진행하기로 결정했습니다.

 

 

 

Why to write

어느 정도의 인원이 어느 정도의 시간을 투자해야 소셜 매칭 웹 사이트를 개발하는 프로젝트가 잘 돌아갈까요? (잘 돌아간다는건 뭘까요?)

디자이너도 UI/UX 전문가도 없이 개발자 두 명이서 머리에 있는 생각을 이야기하고 개발하는 과정에서 얼마나 많은 난관을 겪고 또 헤쳐나가게 (혹은 피해가게) 될까요?

이런 시련들과 해결하거나 피해가는 과정을 기록해두면 언젠가의 누군가에게 도움이 되지 않을까요?

비슷한 프로젝트를 진행하는 분들이 아니더라도 그냥 이런 프로젝트를 진행하면서 어떤 점을 생각해야 하는지에 대한 청사진을 그리는 데에 도움이 되었으면 좋겠습니다.

 

2023.12.01 킥오프 미팅을 시작으로, 출발합니다🚀

+ Recent posts