Skip to content

Commit

Permalink
feat: 코드정리 (변수 네이밍, 리드미 수정)
Browse files Browse the repository at this point in the history
  • Loading branch information
JAY-Chan9yu committed Jan 2, 2023
1 parent b52814d commit c8790db
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 68 deletions.
8 changes: 4 additions & 4 deletions .env_sample
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
ENV="dev"
ALLOW_ORIGINS=["*"]

HOST="heymoji-db"
PORT=3306
DB_HOST="heymoji-db"
DB_PORT=3306
DATABASE="heymoji"
USERNAME="root"
PASSWORD="root"
DB_USERNAME="root"
DB_PASSWORD="root"

DAY_MAX_REACTION=1000
REACTION_LIST=["pray", "heart", "eye_shaking", "+1", "기도", "기쁨", "kkkk"]
Expand Down
82 changes: 38 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,28 @@
<img src="https://user-images.githubusercontent.com/24591259/210239909-7dab9b9a-f796-4495-a58d-091d25e0dc7c.png"/>
</p>

# 🤩 Hey + Emoji = Heymoji 🏆
# Hey + Emoji = Heymoji
### 개발자의 한마디 👨🏻‍💻
링크드인에서 <a href="https://medium.com/mathpresso/%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-mathpresso%EC%9D%98-backend-web-%ED%8C%80%EC%97%90%EC%84%9C-backend-engineer%EB%A1%9C-%EC%9D%BC%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94-dan%EC%9E%85%EB%8B%88%EB%8B%A4-c7a0641333e8">매프 멤버들이 서로 토마토를 주는 이유는?<a/> 라는 글을 읽고, 슬랙 이모지(Emoji)로 멤버들에게 ``칭찬``이나 ``리스펙`` 할 수 있는 문화가 생긴다면 재밌기도 하고 고마움도 표현할 수 있을 것 같았습니다.<br/>

그래서 이런 재미난 기능은 ``오픈소스`` 공개하면 좋을 것 같다고 생각해서 토이 프로젝트로 만들어 보았습니다.<br/>
그래서 이런 재미난 기능은 오픈소스로 공개하면 좋을 것 같다고 생각해서 토이 프로젝트로 만들어 보았습니다.<br/>
(근데 Nodejs로 만들어진게 이미 있었네요 <a href="https://github.com/chralp/heyburrito">heyburrito</a>)<br/><br/>
좀 더 ``재미난 기능 + 완성도 있는 프로젝트``가 되기위해 유지보수는 지속적으로 할 예정입니다.💪<br/>
FastAPI에 구조나 프로젝트 관련된 추가기능, 개선사항 ``PR``은 언제나 환영입니다! <br/>
좀 더 `재미난 기능 + 완성도 있는 프로젝트`가 되기위해 유지보수는 지속적으로 할 예정입니다.💪<br/>
FastAPI에 구조나 프로젝트 관련된 추가기능, 개선사항 `PR`은 언제나 환영입니다! <br/>

<br/>

## 👋 개요
``Heymoji````Python 3.7.9``, ``FastAPI`` 로 개발되었습니다.<br/>
그 외 버전에서 패키지 및 동작에 대한 호환은 보장하지 않습니다. (근데 거의 다 될거에요 python 3 이상이면...아마두~😁 )<br/>
<img width="2247" alt="헤이모지" src="https://user-images.githubusercontent.com/24591259/210266806-1782cc63-7303-4f85-804f-f6d6fbe81647.png">

`Heymoji` API서버는 `Python 3.10`, `FastAPI` 로 개발되었습니다.<br/>
그 외 버전에서 패키지 및 동작에 대한 호환은 보장하지 않습니다. (근데 거의 다 될거에요 python3.7 이상이면...아마두~😁 )<br/>
프론트엔드는 `vuejs`를 사용해서 간단히 만들어 봤습니다!

<br/>

## 🛠 프로젝트 구조
처음 Heymoji를 개발할때는 DDD 구조가 아니었습니다. <br/>
처음 `Heymoji` 개발할때는 DDD 구조가 아니었습니다. <br/>
DDD에 대한 스터디를 위해 구조를 변경했으며 https://github.com/Ermlab/python-ddd 를 참고하였습니다.<br/>
다소 복잡할 수 있으니 추후 유지보수와 여러 상태변경이 일어나는 경우 DDD가 좀 더 유연할 거라고 생각했습니다😁
```
Expand All @@ -47,42 +50,42 @@ DDD에 대한 스터디를 위해 구조를 변경했으며 https://github.com/E
├── seed_work (프로젝트에서 기본적으로 제공해야하는 작업, 코드)
├── alembic.ini
├── requirements.txt
├── .env_sample
├── docker-compose.yaml
├── Dockerfile
├── web.Dockerfile
├── .env_sample
└── frontend (heymoji 웹페이지 관련 코드)
```

<br/>

## 💾 세팅
``.env_sample``을 참고해서 ``.env``파일을 생성합니다.<br/>
`.env_sample`을 참고해서 `.env`파일을 생성합니다.<br/>
원하시는 세팅으로 환경변수들을 세팅합니다.<br/>
DB는 ``MySQL``을 사용합니다. 비동기 처리를 위해 ``aiomysql`` 함께 사용합니다.<br/>
DB는 `MySQL`을 사용하며 비동기 처리를 위해 `aiomysql`라이브러리를 함께 사용합니다.<br/>
다른 DB 사용하려면 `config` 설정이 조금 달라질 수 있습니다.

|이름|설명|
|----|----|
|ENV|배포환경 정의|
|REACTION_LIST|웹훅 리액션으로 허용된 이모지(reaction)들을 정의합니다.|
|ALLOWED_EMOJI_TYPES|핸들링할 이모지들을 정의합니다.|
|DAY_MAX_REACTION|하루 최대 사용할 수 있는 Reaction 개수 (optinal)|
|SLACK_TOKEN|슬랙 토큰|
|BOT_NAME|슬랙봇 이름|
|ERROR_CHANNEL|슬랙 에러 리포팅 채널|
|HOST|DB 호스트|
|PORT|DB 포트|
|DATABASE|DB 이름|
|USERNAME|DB 접속 유저네임|
|PASSWORD|DB 패스워드|
|DEFAULT_AVATAR_URL|기본 프로필 이미지 URL)|
| 이름 |설명|
|---------------------|----|
| ENV |배포환경 정의|
| REACTION_LIST |웹훅 리액션으로 허용된 이모지(reaction)들을 정의합니다.|
| ALLOWED_EMOJI_TYPES |핸들링할 이모지들을 정의합니다.|
| DAY_MAX_REACTION |하루 최대 사용할 수 있는 Reaction 개수 (optinal)|
| SLACK_TOKEN |슬랙 토큰|
| BOT_NAME |슬랙봇 이름|
| ERROR_CHANNEL |슬랙 에러 리포팅 채널|
| DB_HOST |DB 호스트|
| DB_PORT |DB 포트|
| DATABASE |DB 이름|
| DB_USERNAME |DB 접속 유저네임|
| DB_PASSWORD |DB 패스워드|
| DEFAULT_AVATAR_URL |기본 프로필 이미지 URL)|

<br/>

## 🐳 Docker-Compose 실행
``.env``파일을 생성한뒤 `docker-compose up -d` 를 실행합니다.<br/>
몇분후 api, web, db 컨테이너가 모두 실행 된 후 http://127.0.0.1:8080 에 접속하여 동작을 확인합니다.<br/>
`.env`파일을 생성한뒤 `docker-compose up -d` 를 실행합니다.<br/>
몇분 후 api, web, db 컨테이너가 모두 실행 된 후 http://127.0.0.1:8080 에 접속하여 동작을 확인합니다.<br/>

<img width="352" alt="스크린샷 2023-01-02 오후 10 54 35" src="https://user-images.githubusercontent.com/24591259/210240727-139572eb-5874-4fb9-8cd5-fdbc4761cea7.png">

Expand Down Expand Up @@ -180,10 +183,6 @@ $PYTHON_PATH $SCRIPT_PATH
<br/>

# 🤖 Slack Bot 설정
<img width="400" alt="스크린샷 2023-01-02 오후 10 12 32" src="https://user-images.githubusercontent.com/24591259/210241355-8add5de3-b9ea-4156-a500-682b04a4040b.png">

위 화면에서 슬랙토큰을 copy하여 ``.env`` 파일에 추가합니다.

<img src="https://user-images.githubusercontent.com/24591259/114943304-bf743a80-9e80-11eb-85ad-30cb26591ea3.png" width="400px"/>

https://api.slack.com/apps 에 접속하여 create app 버튼을 클릭한 후, <br/>
Expand All @@ -196,17 +195,20 @@ https://api.slack.com/apps 에 접속하여 create app 버튼을 클릭한 후,

<img src="https://user-images.githubusercontent.com/24591259/114944994-84bfd180-9e83-11eb-9ee8-f6c8929dd099.png" width="400px"/>

`Add features and functionality`에서 'Event Subscriptions'을 클릭합니다.
`Add features and functionality`에서 `Event Subscriptions`을 클릭합니다.

<img src="https://user-images.githubusercontent.com/24591259/114944379-71603680-9e82-11eb-84fc-3f0aacfb1890.png" width="400px"/>

``Event``를 Enable(활성화) 시킨후 ``Requst URL``을 넣어서 인증을 합니다. <br/>
로컬에서 테스트 하기 위해 <a href="https://dashboard.ngrok.com/get-started/setup">ngrok<a/>을 사용하시면 편합니다.실제 prod 환경에서는 `Nginx + uvicorn`으로 실행하면 되요!
<br/>Nginx Config 에서 `proxy_pass` 만 uvicorn으로 실행한 로컬 서버로 연결해주면 됩니다!<br/>
`Event`를 Enable(활성화) 시킨후 `Requst URL`을 넣어서 인증을 합니다. <br/>

<img width="400" alt="스크린샷 2023-01-02 오후 10 12 32" src="https://user-images.githubusercontent.com/24591259/210241355-8add5de3-b9ea-4156-a500-682b04a4040b.png">

위 화면에서 슬랙토큰을 copy하여 ``.env`` 파일에 추가합니다.

<img src="https://user-images.githubusercontent.com/24591259/114944830-45918080-9e83-11eb-9bfa-01c86bd8f9bd.png" width="400px"/>

`ngrok`을 통해 외부망에서 로컬로 연결이 된 모습
로컬에서 테스트 하기 위해 <a href="https://dashboard.ngrok.com/get-started/setup">ngrok<a/>을 사용하시면 편합니다.실제 prod 환경에서는 `Nginx + uvicorn`으로 실행하면 되요!
<br/>Nginx Config 에서 `proxy_pass` 만 uvicorn으로 실행한 로컬 서버로 연결해주면 됩니다!<br/>

<img src="https://user-images.githubusercontent.com/24591259/114946460-2811e600-9e86-11eb-8cc5-bbb8bcf7db42.png" width="400px"/>

Expand All @@ -218,11 +220,3 @@ https://api.slack.com/apps 에 접속하여 create app 버튼을 클릭한 후,
슬랙봇과 DM을 통해 명령어를 실행하기 위해서는 `message.im`을 선택하고 Message Tab 기능을 on 시켜주셔야 합니다.<br/>

마지막으로 `app``workspace`에 설치(install)하면 설정한 이벤트가 일어날때마다 `slack`에서 `Heymoji`서버로 웹훅 api를 호출합니다.

<br/>

# 웹페이지 📲
<img width="2189" alt="스크린샷 2023-01-02 오후 11 03 36" src="https://user-images.githubusercontent.com/24591259/210241714-9ccd6cdc-5eaa-41d3-ac82-b9de99f6ea6e.png">

간단하게 ``vue``프로젝트에서 `Heymoji`의 api를 호출해 **User list**를 보여주도록 만들어 봤습니다.<br/>
이모지 추가, 제거 event에 따라 서버에서 count 로직을 처리해주는걸 확인 할 수 있습니다.
12 changes: 6 additions & 6 deletions app/Infrastructure/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ def on_startup():
global _db_connection

_async_db_connection = create_async_engine(
f'mysql+aiomysql://{settings.config.USERNAME}:{settings.config.PASSWORD}'
f'@{settings.config.HOST}:{settings.config.PORT}/{settings.config.DATABASE}',
echo=True if settings.config.ENV != settings.EmojiRankEnv.PROD.value else False,
f'mysql+aiomysql://{settings.config.DB_USERNAME}:{settings.config.DB_PASSWORD}'
f'@{settings.config.DB_HOST}:{settings.config.DB_PORT}/{settings.config.DATABASE}',
echo=True if settings.config.ENV != settings.HeymojiEnv.PROD.value else False,
future=True
)

_db_connection = create_engine(
f'mysql+pymysql://{settings.config.USERNAME}:{settings.config.PASSWORD}'
f'@{settings.config.HOST}:{settings.config.PORT}/{settings.config.DATABASE}',
echo=True if settings.config.ENV != settings.EmojiRankEnv.PROD.value else False,
f'mysql+pymysql://{settings.config.DB_USERNAME}:{settings.config.DB_PASSWORD}'
f'@{settings.config.DB_HOST}:{settings.config.DB_PORT}/{settings.config.DATABASE}',
echo=True if settings.config.ENV != settings.HeymojiEnv.PROD.value else False,
# connect_args={"check_same_thread": False}
)

Expand Down
4 changes: 2 additions & 2 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ def start_application():
@app.on_event("startup")
async def startup_event():
on_startup()
print("startup EmojiRank")
print("startup Heymoji")


@app.on_event("shutdown")
def shutdown_event():
on_shutdown()
print("shutdown EmojiRank")
print("shutdown Heymoji")
14 changes: 7 additions & 7 deletions conf/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@
from pydantic import BaseSettings, Field


class EmojiRankEnv(Enum):
class HeymojiEnv(Enum):
PROD = 'prod'
STAGE = 'stage'
DEV = 'dev'


class BaseConfig(BaseSettings):
ENV: str = Field(env="ENV", default=EmojiRankEnv.DEV.value)
ENV: str = Field(env="ENV", default=HeymojiEnv.DEV.value)
ALLOW_ORIGINS: list = Field(env="ALLOW_ORIGINS", default=['*'])

HOST: str = Field(env="HOST", default="127.0.0.1")
PORT: int = Field(env="PORT", default="3306")
DATABASE: str = Field(env="DATABASE", default="emojirank_db")
USERNAME: str = Field(env="USERNAME")
PASSWORD: str = Field(env="PASSWORD")
DB_HOST: str = Field(env="DB_HOST", default="127.0.0.1")
DB_PORT: int = Field(env="DB_PORT", default="3306")
DATABASE: str = Field(env="DATABASE", default="heymoji")
DB_USERNAME: str = Field(env="DB_USERNAME")
DB_PASSWORD: str = Field(env="DB_PASSWORD")

DAY_MAX_REACTION: int = Field(env="DAY_MAX_REACTION", default=1000)
REACTION_LIST: list = Field(env="REACTION_LIST", default=['heart'])
Expand Down
4 changes: 2 additions & 2 deletions migrations/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
if not config.get_main_option('sqlalchemy.url'):
config.set_main_option(
'sqlalchemy.url',
f'mysql+pymysql://{settings.config.USERNAME}:{settings.config.PASSWORD}'
f'@{settings.config.HOST}:{settings.config.PORT}/{settings.config.DATABASE}'
f'mysql+pymysql://{settings.config.DB_USERNAME}:{settings.config.DB_PASSWORD}'
f'@{settings.config.DB_HOST}:{settings.config.DB_PORT}/{settings.config.DATABASE}'
)


Expand Down
6 changes: 3 additions & 3 deletions scripts/update_emoji_count.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@


connection = pymysql.connect(
host=settings.config.HOST,
user=settings.config.USERNAME,
password=settings.config.PASSWORD,
host=settings.config.DB_HOST,
user=settings.config.DB_USERNAME,
password=settings.config.DB_PASSWORD,
db=settings.config.DATABASE
)

Expand Down

0 comments on commit c8790db

Please sign in to comment.