Flask
์๋ก
์ฑ์ ์๋ฒ์์๋ ๋ฉ์ธ ์๋ฒ์์ ๋ฐ์ ์ฝ๋๋ฅผ ์ฑ์ ํ๊ณ , ์ฑ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผํ๋ค. ํ์ฌ ์ฑ์ ์๋ฒ๋ python๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ค. python๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋ฐ์ ํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ๊ทธ ์ธ์ด์ ํ๋ ์์ํฌ๋ ์ด๋ค ๋๋์ธ์ง ์๊ณ ์ถ์ ํธ๊ธฐ์ฌ์ ์ด์ฌ์๋ค์ด ๋ง์ด ์ฌ์ฉํ๋ python๋ฅผ ์ ํํ๋ค.
๋ณธ๋ก
Flask
ํ์ด์ฌ ์ง์์์ ์ฌ์ฉํ๋ ์น ํ๋ ์ ์ํฌ์ด๋ค. ๋ง์ดํฌ๋ก ๋ผ๋ ์์น์ ๋ฐ๋ฅด๋ฉฐ, ํน์ ๋๊ตฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ฉํ์ง ์๋๋ค๊ณ ํ๋ค. ์ค์ ๋ก ์ฌ์ฉํ ๋ ๋ณ๋์ ์ค์ ์์ด ํ๋ ์์ํฌ๋ง ์ค์นํ๊ณ ์ฝ๋๋ง ์์ฑํ๋๋ฐ, api ์์ฒญ์ ๋ฐ๊ณ ์๋ต์ ํ๋ ๋ฑ ์ฌ์ฉํ๊ธฐ ํธํ๋ค. ๋ํ, ํ์ด์ฌ ํน์ฑ์ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ์ ์ฝ(?)์ด ๋ค๋ฅธ ์ธ์ด์ ๋นํด ์ ๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ํน์ฑ์ ์ ์ด๋ฆฐ ํ๋ ์ ์ํฌ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
Flask๋ฅผ ์ค์นํ๊ธฐ ์ํด์๋ pip ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
PIP
ํ์ด์ฌ ์คํ์์ค ํจํค์ง๋ค์ด ์ ์ฅ๋ ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ํด์ด๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
pip install flask
vscode์ ํฐ๋ฏธ๋์์ ํด๋น ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด flask ํจํค์ง๊ฐ ์ค์น๋๋ค. ๊ทธ ์ ์, ๊ฐ์ ํ๊ฒฝ์ ์ค์ ํด๋ณด์.
๊ฐ์ ํ๊ฒฝ
์ฌ๋ฌ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ํจํค์ง ๋ฒ์ ์ด๋ ์์กด์ฑ ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ด์ฌ์์๋ ํจํค์ง๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ virtualenv ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
ํ์ด์ฌ์ ๊ฒฝ์ฐ ํจํค์ง๋ฅผ ์ค์นํ๋ฉด ๋ชจ๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ํ์ง ์๋ ํจํค์ง์ ์ํฅ์ ๋ฐ์ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฐฉํด๊ฐ ๋ ์ ์๋ค. ์ด๋ฅผ ๋ง๊ธฐ ์ํด, ๊ฐ ํ๋ก์ ํธ์ ๊ฐ์ ํ๊ฒฝ์ ์ค์ ํ๊ณ ํด๋น ํ๊ฒฝ์์ ์ค์น๋ ํจํค์ง๋ ํด๋น ํ๋ก์ ํธ์๋ง ์ ์ฉ์ด ๋๋ ๋๋์ผ๋ก ์ดํดํ๋ค. ์๋ฐ ์คํ๋ง ๋ถํธ์ build.gradle ์ ์ ์ฌํ ๋๋์ด๋ค.


ํฐ๋ฏธ๋์ ์ด๊ณ ํ๋ก์ ํธ์ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ ํ, ๊ฐ์ ํ๊ฒฝ์ ์์ฑํด์ฃผ๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค. ๊ทธ๋ผ ํ๋ก์ ํธ์ ๋ค์๊ณผ ๊ฐ์ ํ์ผ๋ค์ด ์์ฑ๋จ์ ํ์ธํ ์ ์๋ค.
๊ฐ์ํ๊ฒฝ์ ํ๋ก์ ํธ์ ์ ์ฉ์ํค๊ธฐ ์ํด์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ผ ํ๋ค๊ณ ํ๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค๊ธฐ ์ํ ๋ช ๋ น์ด์ด๋ค.

๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๊ฒฝ๋ก ๋ค์ (env) ์ด ๋ถ์์ ํ์ธํ ์ ์๊ณ , code . ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ vscode๋ฅผ ์คํํ๋ค. ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ์๋์ผ๋ก ์คํ๋๋ค.

vscode์ ๋ค์ด์ค๋ฉด, ํ์๊ธฐ์ ํ์ผ์ ํ์ธํ ์ ์๊ณ ํฐ๋ฏธ๋์ ์ด์ด์ ๊ฐ์ํ๊ฒฝ์ ๋ค์ด์๋์ง ํ์ธํ๋ค. (env)๊ฐ ๋ถ์ด ์์ผ๋ฉด ์ค์ ์ด ์ ๋ ๊ฒ์ด๋ค.



์ค์น
๊ฐ์ํ๊ฒฝ์ ๋ค์ด์จ ํ๋ก์ ํธ์ ํฐ๋ฏธ๋์์ pip ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ Flask ํจํค์ง๋ฅผ ์ค์นํ๋ค.


์ค์น๊ฐ ์๋ฃ๋๋, pip๋ฅผ ์ ๋ฐ์ดํธ ํ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋์์ ์งํํด์คฌ๋ค.
ํ ์คํธ
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
app.py ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์ฒ์ ์ ํด๋ณธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- app = Flask(name) : Flask ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. name์๋ ํ์ฌ ํ์ผ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ค๊ณ ํ๋ค.
- @app.route(โ/โ) : ์คํ๋ง๋ถํธ์ @RequestMapping์ ๋๋์ด๋ค.
์์ฑ์ด ์๋ฃ๋๋ฉด ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ flaks๋ฅผ ์คํํ๋ค.

ํฐ์ผ์ 8080ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, flask์ 5000ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค. ํด๋น ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋์จ๋ค.

์คํ๋ง์ GetMapping, PostMappig์ ๊ฐ์ด flask์์๋ ์ค์ ํ ์ ์๋ค.
@app.route('/judge', methods=['POST'])
์์ฒญ ๋ฐ๊ธฐ
๋ฉ์ธ ์๋ฒ์ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด์๋ flask ํจํค์ง์์ request๋ฅผ importํด์ผ ํ๋ค.
from flask import Flask, request
@app.route('/judge', methods=['POST'])
def judge():
data = request.json
source_code = data['source_code']
language = data['language']
test_cases = data['test_cases']
memory_limit = data['memory_limit']
time_limit = data['time_limit']
request ๊ฐ์ฒด์์ ์์ฒญ ๋ฉ์์ง์ ๋ํ ์ ๊ทผ์ ํ ์ ์๋ค. ์ฌ๊ธฐ์ ์์ฒญ ๋ฉ์์ง์์ ์ ๊ทผํด์ผํ ๋ด์ฉ์ ๋ฐ๋์ ์๋ json ๋ฐ์ดํฐ์ด๋ค. request.json ๋ฅผ ํตํด ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๊ฐ์ ธ์จ json์์ ๊ฐ์ ์ถ์ถํ๊ธฐ ์ํด์๋ ["key ๊ฐ"] ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
์๋ต ๋ณด๋ด๊ธฐ
return {'status': 'COMPILER_ERROR', 'memory': 0, 'runtime': 0, 'codeLen': code_len, 'error_message': e.stderr}
์ ์ ํ ์ถฉ๊ฒฉ์ด์๋ค. ์๋ต ๋ฉ์์ง๊ฐ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ณด๋ผ ์ ์๋๊ฑฐ์๋..
jsonify ๋ฅผ ์ฌ์ฉํด์ Json ์๋ต์ ๋ง๋ค ์ ์๋ค๊ณ ํ๋, ๊ธฐ๋ณธ์ ์ผ๋ก Flask์์๋ ๋์
๋๋ฆฌ(ํ์ด์ฌ์ ๋งต์ด๋ผ ๋ณด๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค)๋ฅผ Json์ผ๋ก ๋ณํํ๋ค๊ณ ํ๋ค.
๋ง๋ฌด๋ฆฌ
python์ ๋ฌด๊ฑฐ์ด ์ธ์ด๋ผ๋ ์ธ์์ด ์์ด, ๋ฐฑ์๋๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง ๊ถ๊ธํ๋ค. ์ด๋ฒ ๊ธฐํ์ Flask ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด์ ์ด๋ฐ ๊ถ๊ธ์ฆ์ด ํด๊ฒฐ๋๋ค. python์ ๋ฌธ๋ฒ ํน์ง์ ์ ์ด๋ฆฐ ํ๋ ์์ํฌ์์ ์๊ฒ ๋๊ณ , ๊ธฐํ๊ฐ ๋๋ค๋ฉด ๋ ์ฌ๋์๊ฒ ํ์ตํด๋ณด๊ณ ์ถ๋ค.
์ฐธ๊ณ ๋ฌธํ
[Python Flask] ํ๋ผ์คํฌ๋? [์น ์ฑํ๋ก๊ทธ๋๋ฐ] ํ์ด์ฌ(python for windows) ์ค์น ํ vs code ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ [์น ์ฑํ๋ก๊ทธ๋๋ฐ] ๋ ๋ฆฝ๋ ํ์ด์ฌ(python) ๊ฐ์ํ๊ฒฝ(venv) [์น ์ฑํ๋ก๊ทธ๋๋ฐ] ํ์ด์ฌ ํ๋ผ์คํฌ(Python Flask) ์ค์น ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ (Web Application) ์์ [Flask] ์์ฒญ(Request) ๋ฐ์ดํฐ ์ ๊ทผ [Flask] 2์ผ์ฐจ. Flask REST API