Skip to content

Backend

Jaemin Choi edited this page Feb 16, 2021 · 7 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-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

Backend Test

> ./run_test.py

์žฅ๊ณ ์˜ test ๋ชจ๋“ˆ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ App(account, announcement ๋“ฑ)์—๋Š” tests.py ํŒŒ์ผ์ด ์žˆ๊ณ , testcase๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

github action๋ฅผ ํ†ตํ•ด Test๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ  ์žˆ๊ณ , master branch์˜ .github/workflows๋ฅผ ํฌํ•จํ•˜์—ฌ pr ์‹œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.