-
Notifications
You must be signed in to change notification settings - Fork 2
Backend Guideline
레포지토리를 클론하여 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
다음 명령어로 파이썬 가상환경을 설정하고, 필요한 라이브러리를 설치합니다.
# 경로: skku-coding-platform/
> sudo apt install -y python3-venv
> python3 -m venv venv
> source venv/bin/activate
> pip3 install -r backend/deploy/requirements.txt도커 컨테이너가 아닌, 로컬에서 test를 진행하려면 개발용 DB를 띄워야 합니다. init_db.sh 를 실행하면 oj-postgres-dev 와 oj-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# 경로: skku-coding-platform/backend/
> ./run_test.pyDjango의 test 모듈을 이용하여 테스트합니다. 각각의 App (account, announcement 등) 은 testcase가 정의되어 있는 test.py를 포함합니다. ./run_test.py 시 정의된 testcase가 수행되며, 우리 프로젝트에서는 master branch의 .github/workflows를 포함하여 pull request 시 Test가 자동으로 진행됩니다.