์„œ๋ก 

์ฑ„์  ์„œ๋ฒ„์—์„œ๋Š” ๋ฉ”์ธ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์ฝ”๋“œ๋ฅผ ์ฑ„์ ํ•˜๊ณ , ์ฑ„์  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค. ํ˜„์žฌ ์ฑ„์  ์„œ๋ฒ„๋Š” python๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. python๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๊ทธ ์–ธ์–ด์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์–ด๋–ค ๋А๋‚Œ์ธ์ง€ ์•Œ๊ณ  ์‹ถ์€ ํ˜ธ๊ธฐ์‹ฌ์— ์ดˆ์‹ฌ์ž๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” python๋ฅผ ์„ ํƒํ–ˆ๋‹ค.

๋ณธ๋ก 

Flask

ํŒŒ์ด์ฌ ์ง„์˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์›น ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋‹ค. ๋งˆ์ดํฌ๋กœ ๋ผ๋Š” ์›์น™์„ ๋”ฐ๋ฅด๋ฉฐ, ํŠน์ • ๋„๊ตฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉํ• ๋•Œ ๋ณ„๋„์˜ ์„ค์ •์—†์ด ํ”„๋ ˆ์ž„์›Œํฌ๋งŒ ์„ค์น˜ํ•˜๊ณ  ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, api ์š”์ฒญ์„ ๋ฐ›๊ณ  ์‘๋‹ต์„ ํ•˜๋Š” ๋“ฑ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ–ˆ๋‹ค. ๋˜ํ•œ, ํŒŒ์ด์ฌ ํŠน์„ฑ์ƒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ œ์•ฝ(?)์ด ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ์ ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์–ด์˜ ํŠน์„ฑ์„ ์ž˜ ์‚ด๋ฆฐ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

Flask๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” pip ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

PIP

ํŒŒ์ด์ฌ ์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€๋“ค์ด ์ €์žฅ๋œ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ํˆด์ด๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

pip install flask

vscode์˜ ํ„ฐ๋ฏธ๋„์—์„œ ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด flask ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋œ๋‹ค. ๊ทธ ์ „์—, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด๋ณด์ž.

๊ฐ€์ƒ ํ™˜๊ฒฝ

์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด๋‚˜ ์˜์กด์„ฑ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ์—์„œ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• virtualenv ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

ํŒŒ์ด์ฌ์˜ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์›ํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์— ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด, ๊ฐ ํ”„๋กœ์ ํŠธ์— ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ  ํ•ด๋‹น ํ™˜๊ฒฝ์—์„œ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—๋งŒ ์ ์šฉ์ด ๋˜๋Š” ๋А๋‚Œ์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ์ž๋ฐ” ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ build.gradle ์™€ ์œ ์‚ฌํ•œ ๋А๋‚Œ์ด๋‹ค.

Untitled

ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ ํ›„, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿผ ํ”„๋กœ์ ํŠธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด์ด๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฒฝ๋กœ ๋’ค์— (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