- ๋ชจ๋ ๋ฏธ์ ์ Jetbrains์ Pycharm์ ๊ธฐ์ค์ผ๋ก ๊ตฌํ๋์ด์๋ค.
- ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์
docs/README.md
์ ๊ตฌํํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌํด ์ถ๊ฐํ๋ค. -requirement.txt
์์ ์ ๊ณต๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํด์ผ ํ๋ค. - ํ์ด์ฌ ๋ฒ์ 3.7 ์ด์์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.
- ๊ธฐ๋ฅ์๊ตฌ์ฌํญ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ์ผ ํ๋ค.
- ์ ์ถ ์ ํ
์คํธ ํ์ผ์ ์๋ ๋ชจ๋ ํ
์คํธ๋ฅผ ํต๊ณผํ์ฌ์ผ ํ๋ค.
- PyCharm์์ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ
- Python unittest ๋ผ์ด๋ธ๋ฌ๋ฆฌ docs
- ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ
\test
์๋์ ๊ฐ๊ฐ ํ์ํ ์ ๋ํ ์คํธ๋ฅผ ์ํํ๋ค - ์ ๋ํ ์คํธ์ ๋ํ ์ฐธ๊ณ ์ฌํญ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ค.
- ์ด ๋ฌธ์ ํ๋จ์ ํ ์คํธ์ ๊ด๋ จ๋ ํญ๋ชฉ์ด ์กด์ฌํ๋ฏ๋ก ์ฐธ๊ณ ํ๋ค.
- ์๊ตฌ์ฌํญ์ ์๋ ๊ธฐ๋ฅ์ ์ค์ค๋ก ํ๋จํ์ฌ ๊ตฌํํ๋ค.
- ์ ์๋ ํ์ผ์๋
\week2\api_dev\.venv
์ ๊ฐ์ํ๊ฒฝ์ด ๊ตฌ์ฑ๋์ด์๋ค. - ์๋ ๋ช ๋ น์ด๋ก ๊ฐ์ํ๊ฒฝ์ ์ง์ ํ๋ค.(mac ๊ธฐ์ค)
- ์๋์ฐ์ ๊ฒฝ์ฐ ํด๋น ๋งํฌ์ ์ค๋ช ์ ๋ฐ๋ฅธ๋ค.
- ์ดํ app.py๋ฅผ ์คํ์ํค๋ฉด ์๋์ผ๋ก ์๋ฒ๊ฐ ์คํ๋ ๊ฒ์ด๋ค.
source .venv/bin/activate
- ์ฐ๋์ด์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๊ธฐ๋ฅ์ธ "ํ์"์ ์ฐ๋์ด ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ฃผ์๊ฒ ์ฐ๋ฝํ์ฌ ๋งค์ผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํ๊ณ ์๋ค.
- ์ฐ๋ํ ํ์์์ ์ด ๊ณผ์ ์ด ๋ณต์กํ๊ณ ์ง์๊ฐ๋ฅํ์ง ๋ชปํ๋ค ํ๋จํ์ฌ ์ ์ฃผ๋ค์๊ฒ ์ฐ๋์ด์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํด ์ง์ ์ ๋ก๋๋ฅผ ํ๋ ค๊ณ ํ๋ค.
- ์ฐ๋์ด์ ๋ฉ๋ด๋ฅผ ์๋ ค์ฃผ๋ ์ ์ฒด๋ "์ฐ๋ ๋ถ์", "ํ๊ณต ํธ๋", "ํฐ๋ ธ ์๋์์น"์ด๋ค.
- ์นด์นด์คํก์๋ ์ฑํ ๋ฐฉ๋ง๋ค ๊ณ ์ ํ id๋ฅผ ๋ถ์ฌํ์ฌ ์ฌ์ฉ์๋ฅผ ๊ตฌ๋ถํ๋๋ฐ ๊ฐ๋ฐ์ง์ ์์๋ก ์ด๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ๋ค.
- ๋ฉ๋ด๋ฅผ ์ ์ฅํ ์ ์ฅ์๋ ์์ง ์ ํ์ง ๋ชปํ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ฅํ๋ฉฐ, ๋์ค์ Amazon S3๋ฒํท์ผ๋ก ๋ฆฌํํ ๋ง๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ์ ์ฅ๋ ํ์ผ ๋ช
์ menu.json์ผ๋ก
repo/menu.json
์ ์ ์ฅ๋์ด ์๋ค.
/updateMenu
๋ ๋ฉ๋ด๋ฅผ ์ ๋ฐ์ดํธํ๋ ํญ๋ชฉ์ด๋ค.- ์ ์ฃผ๊ฐ ์ ๋ฐ์ดํธ ํ๋ ค๋ ๊ฐ๊ฒ๊ฐ ์ ์ฃผ์ ์์ ์ธ ๊ฒฝ์ฐ์๋ง ์ ๋ฐ์ดํธ๋ฅผ ํ์ฉํ๋ค.
- ์ ์ฒด์ ๋ฉ๋ด๊ฐ ์ ์ฅ๋ ํ์ผ์ ์ด๋ฏธ ๋ฉ๋ด๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด์ ๋ฉ๋ด๋ฅผ ๋ชจ๋ ์ญ์ ํ ๋ค ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ด๋ค.
- ๋ฎ์ด์ฐ๊ธฐ์ ์ฑ๊ณตํ๋ค๋ฉด ์ฑ๊ณต๋ฉ์์ง๋ฅผ ๋ฆฌํดํ๋ค.
.
|-- __init__.py
|-- app.py
|-- docs
| `-- README.md
|-- lib
| |-- __init__.py
| `-- frozen_json.py
|-- repo
| `-- menu.json
`-- tests
|-- __init__.py
|-- data
| |-- correction_test.json
| |-- diff_botid_test.json
| |-- incorrect_store_name_test.json
| `-- permission_test.json
`-- test_app.py
- ์ ํ์ผ ๊ตฌ์กฐ๋
api_dev
์ ํ์ผ ๊ตฌ์กฐ์ด๋ค. app.py
: Flask์๋ฒ๋ฅผ ๋์ฐ๋ ์ํธ๋ฆฌํฌ์ธํธ์ด๋ค.\docs
: ์์ฑํด์ผํ๋ ๊ฐ๋ฐ๋ฌธ์๊ฐ ํฌํจ๋์ด์๋ค.\lib
: ์ฌ์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค์ด์๋ค.\repo
: ๋ฏธ์ ์์ ์๊ตฌํ๋ ํ์ผ๋ก, json์ด ์ ์ฅ๋๋ ์ผ์ข ์ db ํ์ผ์ด๋ค.\tests
: ํ ์คํธ ํ์ผ๊ณผ ํ ์คํธ์ผ์ด์ค๋ค์ด ๋ค์ด์์ผ๋ฉฐ, ๋ฏธ์ ์ ์ถ์ test_app.py๋ฅผ ์คํ์์ผ ์ฑ๊ณต์์ผ์ผ ํ๋ค.
- ๋ด ์์ด๋ ๋ชฉ๋ก
์ฐ๋ ๋ถ์ : 5e0d180affa74800014bd33d
ํ๊ณต ํธ๋ : 3c0f223affa74800024ac31c
ํฐ๋
ธ ์๋์์น : s2134a85n8021d1w87it3c3h
{
"bot": {
"id": "5e0d180affa74800014bd33d",
"name": "์ฐ๋์ด"
},
"action": {
"name": "jp1j2gy39h",
"clientExtra": null,
"params": {
"store_name": "์ฐ๋ ๋ถ์",
"lunch_menu": "๋ก๋ณถ์ด, ์๋, ํ๊น",
"dinner_menu": "์ง์ฅ๋ฉด, ์งฌ๋ฝ๊ตญ, ํ์์ก"
},
"id": "bwjfe6fxc96ngv9ra6dddzah"
}
}
bot.id๊ฐ ๋ฐํํ ์ฌ์ฉ์์ ์์ด๋์ด๋ค. ๋ํ ์ ๋ ฅ์ POST๋ก api์ ์ ๋ฌ๋๋ค.
{
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "์ฑ๊ณต์ ์ผ๋ก ์ ์ฅํ์์ต๋๋ค.",
"text": "[ERROR] ์ค๋ฅ์ํฉ์ ๋ง๋ ๋ฉ์์ง ์ถ๋ ฅ"
}
}
]
}
}
{
"store" : [
{
"name": "์ฐ๋ ๋ถ์",
"menu" : {
"lunch" : ["๋ก๋ณถ์ด", "์๋", "ํ๊น"],
"dinner" : ["์ง์ฅ๋ฉด", "์งฌ๋ฝ๊ตญ", "ํ์์ก"]
}
},
{
"name": "ํ๊ณต ํธ๋",
"menu" : {
"lunch" : ["๋ผ๋ฉด", "๊น๋ฐฅ", "์ฃผ๋จน๋ฐฅ"],
"dinner" : ["์๋นต", "๋ธ๊ธฐ์ผ", "์ฐ์ "]
}
},
{
"name": "ํฐ๋
ธ ์๋์์น",
"menu" : {
"lunch" : ["์ดํ๋ฆฌ์ ์๋์์น", "๋ถ๊ณ ๊ธฐ ์๋์์น"],
"dinner" : ["์น์ฆ ์๋์์น, ํซ๋๊ทธ"]
}
},
],
}
simpleText ์์ text๋ ์ฑ๊ณต๊ณผ ์คํจ์ ๊ฐ๊ฐ ์ถ๋ ฅํ ๋ฌธ๊ตฌ์ด๋ค. ๋ ์ค ํ๋๋ง ์ถ๋ ฅํ๋ฉด ๋๋ค.
- ์ต๊ทผ ํ์ฌ์ ๋ณด์ ์ ๊ทผํ๊ธฐ ํ๋ค๋ค๋ ํ์ฐ๋ค์ ์๊ฒฌ์ ๋ฐ์ํ์ฌ ์ฐ๋์ด์์ ํ์ฌ ๊ณต์ง ์ค ์ฃผ์ ๊ณต์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ ํ๋ค.
- ํ์ฌ ๊ณต์ง๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์๋ค.
- ์ฃผ์๊ณต์ง๋ ์๋ ์ด๋ฏธ์ง์ฒ๋ผ ๋ฒํธ์ ๋ง์ดํฌ๋ชจ์์ด ์๋๊ฒ์ ์๋ฏธํ๋ค.
- ํ์ํ ์ ๋ณด๋
์ ๋ชฉ, ์์ฑ์, ์์ฑ์ผ
์ด๋ฉฐ, ํด๋ฆญ์ ํด๋น ๊ฒ์๊ธ๋ก ๊ฐ ์ ์๋๋ก ๊ฒ์๊ธ์ ํ์ดํผ๋งํฌ๋ ํ์ํ๋ค. - ์์ธํ ์ฌํญ์ ์ ์ถ๋ ฅ ์์๋ฅผ ๋ฐ๋ฅธ๋ค.
- ์์๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ ๋ฐฉ๋ฒ์ ์ฐพ๋๋ค. ์๋ฅผ๋ค๋ฉด URL๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋ฐ๋ก constant.py์ ์ ์ ํ ๋ค ์ฌ์ฉํ๋ค
week2/business_dev/main.py
ํ์ผ์ run ํ์ผ์ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. (ํจ์์ ์ด๋ฆ์ ์์ ํด์ ์๋๋ค.)- ์ด์ธ์ ํ์ผ๋ค์ ์์ ๋กญ๊ฒ ์์ฑํด๋ ๋๋ค.
.
โโโ __init__.py
โโโ docs
โย ย โโโ README.md
โโโ lib
โย ย โโโ __init__.py
โย ย โโโ frozen_json.py
โโโ main.py
โโโ tests
โโโ __init__.py
โโโ test_main.py
- ์ ํธ๋ฆฌ์ ์์๋ business_dev์ ํ์ผ๊ตฌ์กฐ์ด๋ค.
\docs
: ๊ฐ๋ฐ์ ์งํํ๋ฉด์ ์์ฑํ ๊ฐ๋ฐ๋ฌธ์์ด๋ค.\lib
: ํ์ํ๋ค๋ฉด ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.\tests
: ํ ์คํธ ํ์ผ์ด ์กด์ฌํ๋ค. ๊ณผ์ ์ ์ถ ์ test_main.py๋ฅผ ์คํ์์ผ ๋ชจ๋ ํ ์คํธ๋ฅผ ํต๊ณผํด์ผ ํ๋ค.main.py
: ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์ run()์ด ์กด์ฌํ๋ค. ์ฆ, ์ต์ข ํ๋ก๊ทธ๋จ์ ์์ฑ์ ํด๋น ํ์ผ์์ ๊ฐ๋ฐํ๋ค.
์๋ ํ์ดํผ๋งํฌ์์ ์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค
> https://www.tukorea.ac.kr/tukorea/1096/subview.do
{"informations": [
{
"title": "[์ฌํ๋ด์ฌ๊ต๊ณผ๋ชฉ] 2024-1ํ๊ธฐ ์ฌํ๋ด์ฌ ๊ต๊ณผ๋ชฉ ์๊ฐ์ ์ฒญ ์๋ด",
"author": "์ฌํ๋ด์ฌ์ง์์ผํฐ",
"date": "2024.01.26",
"link": "/bbs/tukorea/107/51544/artclView.do"
},
{
"title": "๊ธฐ์ด๊ต๊ณผ, ๊ณ์ด๊ธฐ์ด(1ํ๋
์ ์
์ ๊ต๊ณผ) ์๊ฐ์ ์ฒญ ์๋ด(์ฌํ์, ์ ์
์)",
"author": "๊ต์๊ต์ก์ด์์ผํฐ",
"date": "2024.01.25",
"link": "/bbs/tukorea/107/51534/artclView.do"
}
]}
์ถ๋ ฅ ์์์๋ 2๊ฐ์ ๊ฒ์๋ฌผ๋ง ํฌํจํ์์ง๋ง 1ํ์ด์ง์ ์๋ ๋ชจ๋ ๊ณต์ง ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์จ๋ค. link์๋ root url์ ์ ์ธํ ์ธ๋ถ ๋๋ ํฐ๋ฆฌ ์ฃผ์๋ง ํฌํจํด๋ ๋๋ค.
- ์ ์ถ ๋ง๊ฐ ๊ธฐํ์ 2์ 2์ผ ๊ธ์์ผ ์คํ 17:00๊น์ง์ด๋ค.
- ์์ธํ ์ ์ถ๋ฐฉ๋ฒ์ ๋ค์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
- ์ฃผ์ด์ง ์ฝ๋๋ pycharm์์ ๋์ํ๋๋ก ์ค๊ณ๋์ด ์์ผ๋ฉฐ, pycharm์์ ํด๋น ์์ค๋ก ์ด๋ ํ ์คํ์ ์๋์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ๋๋ก ๋์ด์์ต๋๋ค.
- ๋ง์ฝ ์ฝ์์์ ํ
์คํธ๋ฅผ ์งํํ๊ณ ์ถ๋ค๋ฉด ์๋ ์ฌํญ์ ๋ฐ๋ผ ํ
์คํธ ์ฝ๋๋ฅผ ์ผ๋ถ ์์ ํด์ผํฉ๋๋ค.
- ์ฝ์์์ ํ์ผ์ ์คํ์ํค๋ ์์น๋
/week2
์ ๋๋ค. - ModuleNotFoundError ๋๋ ImportError๋ฐ์์ import ๊ตฌ๋ฌธ์ ์๋์๊ฐ์ด ์์ ํฉ๋๋ค.
- ์ฝ์์์ ํ์ผ์ ์คํ์ํค๋ ์์น๋
from unittest import TestCase
from ..main import run
๋๋ working directory๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ ์๋ ๊ณผ์ ์ ๋ฐ๋ฅธ๋ค. ๋จ, pycharm ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๋ค.
- ๋ฉ๋ด > ์คํ > ๊ตฌ์ฑ ํธ์ง
- ์ผ์ชฝ์ ์คํ์ํฌ ํ
์คํธ ํ์ผ ์ ํ ํ ์์
๋๋ ํฐ๋ฆฌ๋ฅผ
\week2
๋ก ์ค์
ํ ์คํธ ํ ์ฑ๊ณต ์คํจ ์ฌ๋ถ ํ์ธ ์์์๋ถํฐ (์คํจ, ์ฑ๊ณต)
api_dev/์ ์์น์์ flask run์ ์คํํ๋ค.
๋ง์ฝ "Youย didย notย provideย theย "FLASK_APP"ย environmentย variable"๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฐ์์ ํ๊ฒฝ๋ณ์ ์ค์ (ํ๋จ)์ ๋ฐ๋ฅธ๋ค
- ํ์ด์ฌ์์ JSON์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ (์ ์๋)๋ผ์ด๋ธ๋ฌ๋ฆฌ
content = json.loads(f)
print(content['status'])
content = FacadeJSON(json.loads(f))
print(content.status)