Skip to content

Backend Guideline

Jeongcc edited this page Feb 18, 2021 · 3 revisions

Backend Guide 📋

Docker Containers

레포지토리를 클론하여 docker-compose up -d로 서비스를 구동하면 네 가지 컨테이너가 실행 중인 것을 확인할 수 있습니다.

# 경로: skku-coding-platform/

> docker-compose up -d
Creating coding-platform ... done
Creating judge-server ... done
Creating oj-postgres  ... done
Creating oj-redis     ... done

> docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS                    PORTS                                         NAMES
4cbee61583f6   skkunpc/coding-platform   "/bin/sh -c /app/dep…"   21 seconds ago   Up 20 seconds (healthy)   0.0.0.0:443->1443/tcp, 0.0.0.0:80->8000/tcp   coding-platform
db71de323b0c   skkunpc/judge-server      "/bin/sh -c /code/en…"   22 seconds ago   Up 21 seconds (healthy)   8080/tcp                                      judge-server
86d3d2a3a311   postgres:10-alpine        "docker-entrypoint.s…"   22 seconds ago   Up 21 seconds             5432/tcp                                      oj-postgres
542a774f06c2   redis:4.0-alpine          "docker-entrypoint.s…"   22 seconds ago   Up 21 seconds             6379/tcp                                      oj-redis

각 컨테이너의 내용이 궁금하다면 Docker Guide 글을 참고해주세요.


개발 환경 세팅

파이썬 가상환경

pip로 패키지를 설치를 하면, 설치된 패키지들은 파이썬 설치 디렉토리 안에 저장됩니다. 따라서 pip로 설치한 패키지들은 해당 패키지가 필요한 파일 뿐만 아니라, 다른 모든 파이썬 스크립트에서 사용할 수 있게됩니다. 하나의 프로젝트를 진행하는 경우에는 문제가 없지만, 여러 프로젝트를 진행하는 경우에는 패키지 간의 버전 충돌 문제가 발생할 수 있습니다.

예를 들어, 코딩 플랫폼에서 사용하는 Django의 버전은 3.0인데 다른 진행중이던 프로젝트에서는 2.0을 사용해야 하는 경우, Django 2.0과 Django 3.0이 호환되지 않는 부분에서 여러 문제가 생깁니다.

따라서 하나의 독립된 공간을 만들어주는 '가상 환경'이라는 것을 사용합니다. 즉 위의 경우에서는, 코딩 플랫폼울 위한 가상환경 A와, 그 외의 다른 프로젝트를 위한 가상환경 B(프로젝트가 여러개면 여러개의 가상환경 사용)를 만들어 줍니다. 그리고 가상환경 내에서 pip로 패키지를 설치를 하면 해당 가상환경 디렉토리 내에 패키지가 설치가 됩니다. 따라서 가상환경 A에는 Django 3.0을 설치하고 B에는 Django 2.0을 설치해서 패키지 간의 버전 충돌이 일어나는 문제를 해결합니다.

따라서 항상 코드를 실행하거나 수정할 때는 가상환경이 활성화된 상태여야 합니다.

파이썬 가상환경이 낯선 분들은 다음 글을 참고해주세요.
https://docs.python.org/ko/3/library/venv.html

파이썬 가상환경(venv) 세팅

다음 명령어로 파이썬 가상환경을 설정하고, 필요한 라이브러리를 설치합니다.

# 경로: skku-coding-platform/

> sudo apt install -y python3-venv
> python3 -m venv venv
> source venv/bin/activate
> pip3 install -r backend/deploy/requirements.txt

개발용 DB 생성

도커 컨테이너가 아닌, 로컬에서 test를 진행하려면 개발용 DB를 띄워야 합니다. init_db.sh 를 실행하면 oj-postgres-devoj-redis-dev 두 개의 DB가 도커 컨테이너로 생성되는 것을 확인할 수 있습니다.

# 경로: skku-coding-platform/backend/

> ./init_db.sh
+ [[ ! -f manage.py ]]
+ sleep 2
+ docker rm -f oj-postgres-dev oj-redis-dev
Error: No such container: oj-postgres-dev
Error: No such container: oj-redis-dev
+ docker run -it -d -e POSTGRES_DB=onlinejudge -e POSTGRES_USER=onlinejudge -e POSTGRES_PASSWORD=onlinejudge -p 127.0.0.1:5435:5432 --name oj-postgres-dev postgres:10
+ docker run -it -d -p 127.0.0.1:6380:6379 --name oj-redis-dev redis:4.0-alpine
5753d5d9e89eb6c2351aa82d026695d22697785d99285ef9f7efd7570dddd163

> docker ps
CONTAINER ID   IMAGE                 COMMAND                   CREATED           STATUS              PORTS                          NAMES
5753d5d9e89e   redis:4.0-alpine      "docker-entrypoint.s…"    20 seconds ago    Up 19 seconds       127.0.0.1:6380->6379/tcp       oj-redis-dev
e2eb7154aaa3   postgres:10           "docker-entrypoint.s…"    21 seconds ago    Up 19 seconds       127.0.0.1:5435->5432/tcp       oj-postgres-dev

Backend Test

# 경로: skku-coding-platform/backend/
> ./run_test.py

Django의 test 모듈을 이용하여 테스트합니다. 각각의 App (account, announcement 등) 은 testcase가 정의되어 있는 test.py를 포함합니다. ./run_test.py 시 정의된 testcase가 수행되며, 우리 프로젝트에서는 master branch.github/workflows를 포함하여 pull request 시 Test가 자동으로 진행됩니다.

Clone this wiki locally