λ§ν¬λμΈμμ 맀ν λ©€λ²λ€μ΄ μλ‘ ν λ§ν λ₯Ό μ£Όλ μ΄μ λ? λΌλ κΈμ μ½κ³ , μ¬λ μ΄λͺ¨μ§(Emoji)λ‘ λ©€λ²λ€μκ² μΉμ°¬
μ΄λ 리μ€ν
ν μ μλ λ¬Ένκ° μκΈ΄λ€λ©΄ μ¬λ°κΈ°λ νκ³ κ³ λ§μλ ννν μ μμ κ² κ°μμ΅λλ€.
κ·Έλμ μ΄λ° μ¬λ―Έλ κΈ°λ₯μ μ€νμμ€
λ‘ κ³΅κ°νλ©΄ μ’μ κ² κ°λ€κ³ μκ°ν΄μ ν μ΄ νλ‘μ νΈλ‘ λ§λ€μ΄ 보μμ΅λλ€.
(κ·Όλ° Nodejsλ‘ λ§λ€μ΄μ§κ² μ΄λ―Έ μμλ€μ heyburrito)
κ·Έλλ λ§λ€μ΄ 보면 μ¬λ°μ κ² κ°μμ FastAPI
λ₯Ό νλ² κ³΅λΆν΄λ³Ό κ²Έ ν΄μ μ΄νμ λ μ½μ§ νλ©΄μ λ§λ€μμ΅λλ€.π
(Djangoμ μ€λ©°λ€μ΄ μμ΄μ, μκ°λ³΄λ€ μ΄λ €μ λ€μ)
μ’ λ μ¬λ―Έλ κΈ°λ₯ + μμ±λ μλ νλ‘μ νΈ
κ° λκΈ°μν΄ μ μ§λ³΄μλ μ§μμ μΌλ‘ ν μμ μ
λλ€.πͺ
FastAPIμ ꡬ쑰λ νλ‘μ νΈ κ΄λ ¨λ μΆκ°κΈ°λ₯, κ°μ μ¬ν PR
μ μΈμ λ νμμ
λλ€!
TMI: μμ΄μ½μ μ΄λͺ¨μ§ λν¬λΌμ... κ°μκΈ° LoLλν¬κ° λ μ¬λκ³ , μ κ° κ³¨λλΌμ...π λμμΈ μνμλλΆ...κΈ°μ¬ ν΄μ£ΌμμΌ!
emoji_rank
λ Python 3.7.9
, FastAPI
λ‘ κ°λ°λμμ΅λλ€.
κ·Έ μΈ λ²μ μμ ν¨ν€μ§ λ° λμμ λν νΈνμ 보μ₯νμ§ μμ΅λλ€. (κ·Όλ° κ±°μ λ€ λ κ±°μμ python 3 μ΄μμ΄λ©΄...μλ§λ~π )
pip install -r requirements
.env
νμΌμ ν΅ν΄ νκ²½λ³μ λ±μ μΈν
ν μ μμ΅λλ€.
.env_sample
μ μ°Έκ³ νμ
μ μνμλ νμ
μ μ΄λͺ¨μ§λ±μ μΈν
ν΄ λ³΄μΈμ!
settings.py
μμ DBμΈν
λ° νκ²½λ³μλ±μ μμ ν μ μμ΅λλ€
DBλ MySQL
μ μ¬μ©ν©λλ€. λΉλκΈ° μ²λ¦¬λ₯Ό μν΄ aiomysql
μ ν¨κ» μ¬μ©ν©λλ€.
λ€λ₯Έ DB μ¬μ©νλ €λ©΄ config
μ€μ μ΄ μ‘°κΈ λ¬λΌμ§ μ μμ΅λλ€.
μ΄λ¦ | μ€λͺ |
---|---|
BEST_TYPES | emojiλ₯Ό κ°μ₯ λ§μ΄ λ°μ λ©€λ²λ₯Ό μΆμΆν λ μ¬μ©ν©λλ€. |
REACTION_LIST | reaction μΉ΄μ΄νΈ νμ©ν Emoji list |
DAY_MAX_REACTION | ν루 μ΅λ μ¬μ©ν μ μλ Reacion κ°μ (νμ¬ λ²μ μμλ μ¬μ©νμ§ μμ΅λλ€) |
HOST | DB νΈμ€νΈ |
PORT | DB ν¬νΈ |
DATABASE | DB μ΄λ¦ |
USERNAME | DB μ μ μ μ λ€μ |
PASSWORD | DB ν¨μ€μλ) |
main.pyκ° μλ rootκ²½λ‘μ κ°μ uvicornμΌλ‘ μλ²λ₯Ό μ€νμν΅λλ€.
λ°±κ·ΈλΌμ΄λλ‘ μ€ννκΈ° μν΄μλ &
λ₯Ό λ§μ§λ§μ λΆμ¬μ£ΌμΈμ.
uvicorn app.main:app --port 8080
λ§μ½ λ°±κ·ΈλΌμ΄λμμ μ€νλκ³ μλ νλ‘μΈμ€λ₯Ό μ κ±°νκ³ μΆμ κ²½μ°
1. ps aux | grep uvicorn
2. kill -9 {PID}
μλͺ»λ νλ‘μΈμ€ killμ μ£ΌμνμΈμ!
shell scriptλ‘ κ°λ¨νκ² Live 체ν¬λ₯Ό μ§ν ν μ μμ΅λλ€.. ν¬λ‘ νμ 1λΆλ§λ€ μ€ννλλ‘ λ±λ‘.
λ‘κΉ
λ μΆκ°νλ©΄ μ’μ΅λλ€.
#! /bin/bash
PYTHON_PATH=/{{ path }}/venv/bin/python
SCRIPT_PATH=/{{ path }}/emoji_rank/app
checker=`ps aux | grep -v "grep" | grep "{{ κ²μν μ΄λ¦}}" | wc -l`
if [ "$checker" == "0" ]; then
source '{{ path }}/venv/bin/activate'
cd $SCRIPT_PATH && `uvicorn main:app --port 8080 &`
fi
HOST_URL/docs
λ‘ μ μνλ©΄ Swagger
λ‘ λ§λ€μ΄μ§ web νμ΄μ§λ₯Ό νμΈν μ μμ΅λλ€. (FastAPIλ swagger, redoc μ§μ)
μ΄λ¦ | μ€λͺ |
---|---|
help | 컀λ©λ κ΄λ ¨ help |
create_user | user μμ± |
update_user | user μ 보 μ λ°μ΄νΈ |
show_user | μ μ is_display = True (λ ΈμΆ) |
hide_user | μ μ is_display = False (μ¨κΉ) |
show_best_member | ν΄λΉμ λ² μ€νΈ λ©€λ² μΆμΆ |
ex) μ€μ μ¬μ©μ '{{ }}' λ μ κ±°ν΄μ£ΌμΈμ
@μ¬λλ΄ --create_user --name={{μ΄λ¦}} --slack_id={{μ¬λID}} --avatar_url={{μ΄λ―Έμ§URL}}
λ©€λ²λΉ ν루μ 5κ°μ© μ§μ ν Emojiλ₯Ό λ€λ₯Έ λ©€λ²μκ² μ€ μ μλλ‘ νμ΅λλ€.
λ§€μΌ μμ μ λ€μ 5κ°λ‘ 리μ
νλ λ°°μΉ μ€ν¬λ¦½νΈλ₯Ό ν¬λ‘ ν
μ λ±λ‘ν©λλ€.
μ λ μμ€ν¬λ¦½νΈ
λ₯Ό λ§λ€μ΄μ ν¬λ‘ ν
μ λ±λ‘νμ΅λλ€.
#!/bin/bash
PYTHON_PATH=/{{ path }}/venv/bin/python
SCRIPT_PATH=/{{ path }}/emoji_rank/scripts/update_emoji_count.py
source '{{ path }}/venv/bin/activate'
$PYTHON_PATH $SCRIPT_PATH
https://api.slack.com/appsμ μ μνμ¬ create app λ²νΌμ ν΄λ¦ν ν,
μνλ workspace
μ app
μ μμ±ν΄μ£ΌμΈμ!
Basic Information
νμ ν΄λ¦ν νλ¨μμ appμ νλ‘ν μ΄λ―Έμ§
λ₯Ό μΆκ°νκ³ Save ν΄μ€λλ€.
μ΄κ±΄ μν΄λ λμ§λ§ νλκ² μ’μμ. μλνλ©΄ λ©μκ±°λ μπ
Add features and functionality
μμ 'Event Subscriptions'μ ν΄λ¦ν©λλ€.
Event
λ₯Ό Enable(νμ±ν) μν¨ν Requst URL
μ λ£μ΄μ μΈμ¦μ ν©λλ€.
λ‘컬μμ ν
μ€νΈ νκΈ° μν΄ ngrokμ μ¬μ©νμλ©΄ νΈν©λλ€.μ€μ prod νκ²½μμλ Nginx + uvicorn
μΌλ‘ μ€ννλ©΄ λμ!
Nginx Config μμ proxy_pass
λ§ uvicornμΌλ‘ μ€νν λ‘컬 μλ²λ‘ μ°κ²°ν΄μ£Όλ©΄ λ©λλ€!
ngrok
μ ν΅ν΄ μΈλΆλ§μμ λ‘μ»¬λ‘ μ°κ²°μ΄ λ λͺ¨μ΅
emoji_rank
λ μ¬λ λ©€λ²λ€μ reaction_added
, reaction_removed
μ΄λ²€νΈμ botμ νΈμΆνλ app_mention
μ΄λ κ² 3κ°μ§ μ΄λ²€νΈλ₯Ό λ°μ΅λλ€.
λ§μ§λ§μΌλ‘ appμ workspaceμ install νλ©΄ μ€μ ν μ΄λ²€νΈκ° μΌμ΄λ λλ§λ€ slack
μλ²μμ emoji_rank
μλ²λ‘ apiλ₯Ό νΈμΆν©λλ€.(WebHook)
κ°λ¨νκ² vue
νλ‘μ νΈμμ emoji_rank
μ apiλ₯Ό νΈμΆν΄ User listλ₯Ό 보μ¬μ£Όλλ‘ λ§λ€μ΄ λ΄€μ΅λλ€.
μ΄λͺ¨μ§ μΆκ°, μ κ±° eventμ λ°λΌ μλ²μμ count λ‘μ§μ μ²λ¦¬ν΄μ£Όλκ±Έ νμΈ ν μ μμ΅λλ€.
Emoji rank web νλ‘μ νΈλ₯Ό clone ν΄μ νμΈν΄λ³΄μΈμπ