์ฐ๋ฆฌ๋ ํจ๊ป ์ฝ๋์ ์์ด๋์ด๋ฅผ ๋๋๋ฉฐ ๋ ๋์ ๋ฐ์ดํฐ ํ๊ฒฝ์ ๋ง๋ค๊ธฐ ์ํ ์คํ์์ค ์ฌ์ ์ ๋ ๋ฉ๋๋ค. ๐๐ก
"๋ชจ๋๊ฐ ๋ ๊ฐ์น ์๋ ์ผ์ ์ง์คํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค."
Lang2SQL์ ์์ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํ๋ SQL ๋ฌธ์ผ๋ก ๋ณํํ๋ ์คํ์์ค ๋๊ตฌ์ ๋๋ค. LangGraph์ DataHub ํตํฉ์ผ๋ก ๊ตฌ์ถ๋์ด, ๋ณต์กํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ํ ๊น์ ์ง์ ์์ด๋ ๋ฐ์ดํฐ ์ฌ์ฉ์๋ค์ด ํจ์จ์ ์ธ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ค๋๋ค.
- ๐ฃ๏ธ ์์ฐ์ด๋ฅผ SQL๋ก ๋ณํ: ์ผ์ ์ธ์ด๋ฅผ ์ ํํ SQL ์ฟผ๋ฆฌ๋ก ๋ณํ
- ๐ ์ค๋งํธ ํ ์ด๋ธ ๋ฐ๊ฒฌ: ์๋ฏธ๋ก ์ ๊ฒ์์ ์ฌ์ฉํ์ฌ ๊ด๋ จ ํ ์ด๋ธ์ ์๋์ผ๋ก ์ฐพ๊ธฐ
- ๐ ์คํค๋ง ์ธ์: DataHub ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ ์ ํํ ์ปฌ๋ผ ๋งคํ
- ๐ ๏ธ ์น ์ธํฐํ์ด์ค: ๋ํํ Streamlit ์ฑ์ ํตํ ์ฌ์ฉ
- ๐ ์๊ฐํ: ์์ฑ๋ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ํ ์ฐจํธ์ ๊ทธ๋ํ๋ก ์๊ฐํํ์ฌ ๋ฐ์ดํฐ ์ธ์ฌ์ดํธ๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์
- ๐๏ธ ์ ์ฐํ VectorDB: FAISS(๋ก์ปฌ)์ pgvector(PostgreSQL) ์ค ์ ํ ๊ฐ๋ฅํ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์
์๋ก์ด ๋ฐ์ดํฐํ ๊ตฌ์ฑ์๋ค์ด ์์ฃผ ์ง๋ฉดํ๋ ๋ฌธ์ ๋ค:
- ๐คฏ "ํ ์ด๋ธ์ด ๋๋ฌด ๋ง์! ์ด๋์๋ถํฐ ์์ํ์ง?"
- ๐ง "์ด JOIN์ด ๋ง๋์?"
- ๐ "์ด ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด ๊ด์ฐฎ์๊น์?"
- ๐ฐ "์ด๋ป๊ฒ ์๋ฏธ์๋ ์ธ์ฌ์ดํธ๋ฅผ ์ถ์ถํ์ง?"
Lang2SQL์ ๋ค์์ ์ ๊ณตํ์ฌ ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค:
- โ ์์ฐ์ด ์ ๋ ฅ โ ํ ์ด๋ธ ์ถ์ฒ
- โ ์ ์ ํ ์ปฌ๋ผ ์กฐํฉ์ผ๋ก ์๋ SQL ์์ฑ
- โ ๋ชจ๋ฒ ์ฌ๋ก ๊ธฐ๋ฐ ์ฑ๋ฅ ์ต์ ํ
# pip
pip install lang2sql
# uv
uv venv --python 3.11
source .venv/bin/activate
uv add lang2sql# ์์ค ํด๋ก
git clone https://github.com/CausalInferenceLab/lang2sql.git
cd lang2sql
# (๊ถ์ฅ) uv ์ฌ์ฉ
# uv ์ค์น๊ฐ ๋์ด ์๋ค๋ฉด ์๋ ๋ ์ค๋ก ๊ฐ๋ฐ ๋ชจ๋ ์ค์น
uv venv --python 3.11
source .venv/bin/activate
uv pip install -e .
# (๋์) pip ์ฌ์ฉ
python -m venv .venv
source .venv/bin/activate
pip install -e .Streamlit ์น ์ธํฐํ์ด์ค ์คํ:
lang2sql run-streamlit์ฌ์ฉ์ ์ ์ ํฌํธ๋ก ์คํ:
lang2sql run-streamlit -p 8888์ฐธ๊ณ :
- Streamlit ์๋ฒ๋
0.0.0.0์ผ๋ก ๋ฐ์ธ๋ฉ๋์ด ์ธ๋ถ์์ ์ ์ ๊ฐ๋ฅํฉ๋๋ค. --datahub_server์ต์ ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค(deprecated). DataHub ์ค์ ์ UI์ ์ค์ > ๋ฐ์ดํฐ ์์ค ํญ์์ ๊ด๋ฆฌํ์ธ์.
Streamlit ์ฑ์ ๋ฉํฐ ํ์ด์ง ๊ตฌ์กฐ์ ๋๋ค. ์ข์ธก ๋ค๋น๊ฒ์ด์ ์์ "Graph Builder" ํ์ด์ง๋ฅผ ์ด์ด LangGraph ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ํ๋ฆฌ์ ์ ํ: "๊ธฐ๋ณธ" ๋๋ "ํ์ฅ"
- ์ปค์คํ
์ต์
:
PROFILE_EXTRACTION,CONTEXT_ENRICHMENT,QUERY_MAKERํฌํจ ์ฌ๋ถ ํ ๊ธ - ์ ํ์ด ๋ฐ๋๋ฉด ๊ทธ๋ํ๊ฐ ์ฆ์ ์ปดํ์ผ๋์ด ์ธ์ ์ ์ ์ฉ๋ฉ๋๋ค
- "์ธ์ ๊ทธ๋ํ ์๋ก๊ณ ์นจ" ๋ฒํผ์ผ๋ก ์๋ ์ฌ์ ์ฉ ๊ฐ๋ฅ
QUERY_MAKER๋ฅผ ๋นํ์ฑํํ๋ฉด ํ ์ด๋ธ ๊ฒ์ ์ ๋ณด๋ง ํ์๋ฉ๋๋ค
์ฐธ๊ณ : CLI ๋ ๋ฒจ์ --vectordb-type ๋ฐ --vectordb-location ์ต์
์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค(deprecated). Streamlit ์คํ ์ VectorDB ์ค์ ์ UI์ ์ค์ > ๋ฐ์ดํฐ ์์ค ํญ์์ ๊ด๋ฆฌํ์ธ์.
query ๋ช
๋ น์ด์์๋ VectorDB ์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
# FAISS ์ฌ์ฉ (๊ธฐ๋ณธ๊ฐ)
lang2sql query "์ง๋ฌธ" --vectordb-type faiss
# pgvector ์ฌ์ฉ
lang2sql query "์ง๋ฌธ" --vectordb-type pgvector
# ์์น ์ง์ ์์
# FAISS: ์ธ๋ฑ์ค ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก ์ง์
lang2sql query "์ง๋ฌธ" --vectordb-type faiss --vectordb-location ./dev/table_info_db
# pgvector: ์ฐ๊ฒฐ ๋ฌธ์์ด ์ง์
lang2sql query "์ง๋ฌธ" --vectordb-type pgvector --vectordb-location "postgresql://user:pass@host:5432/db"์ฐธ๊ณ : DataHub ์์ด๋ ๋ฏธ๋ฆฌ ์ค๋น๋ VectorDB(FAISS ๋๋ ํ ๋ฆฌ ํน์ pgvector ์ปฌ๋ ์ )๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธํ ์ค๋น ๋ฐฉ๋ฒ์ DataHub ์์ด ์์ํ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
ํํ ๋ฆฌ์ผ ๋ณธ๋ฌธ์ด ๊ธธ์ด์ ธ ๋ณ๋ ๋ฌธ์๋ก ๋ถ๋ฆฌ๋์์ต๋๋ค. ์๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
# ๊ธฐ๋ณธ ์ฌ์ฉ (FAISS, clickhouse, ๊ธฐ๋ณธ ๊ฒ์๊ธฐ)
lang2sql query "๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ํฌํ ์ ์ ์๋ฅผ ์นด์ดํธํ๋ ์ฟผ๋ฆฌ"
# ์ต์
์ฌ์ฉ ์์
lang2sql query "๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ํฌํ ์ ์ ์๋ฅผ ์นด์ดํธํ๋ ์ฟผ๋ฆฌ" \
--database-env clickhouse \
--retriever-name ๊ธฐ๋ณธ \
--top-n 5 \
--device cpu \
--use-enriched-graph \
--vectordb-type faiss \
--vectordb-location ./dev/table_info_db
# pgvector ์ฌ์ฉ ์์
lang2sql query "๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ํฌํ ์ ์ ์๋ฅผ ์นด์ดํธํ๋ ์ฟผ๋ฆฌ" \
--vectordb-type pgvector \
--vectordb-location "postgresql://postgres:postgres@localhost:5432/postgres"์ฃผ์ ์ต์ ์ค๋ช :
--database-env: ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ฒฝ (๊ธฐ๋ณธ๊ฐ: clickhouse)--retriever-name: ํ ์ด๋ธ ๊ฒ์๊ธฐ ์ด๋ฆ (๊ธฐ๋ณธ๊ฐ: ๊ธฐ๋ณธ)--top-n: ๊ฒ์๋ ์์ ํ ์ด๋ธ ์ ์ ํ (๊ธฐ๋ณธ๊ฐ: 5)--device: LLM ์คํ์ ์ฌ์ฉํ ๋๋ฐ์ด์ค (๊ธฐ๋ณธ๊ฐ: cpu)--use-enriched-graph: ํ์ฅ๋ ๊ทธ๋ํ(ํ๋กํ์ผ ์ถ์ถ + ์ปจํ ์คํธ ๋ณด๊ฐ) ์ฌ์ฉ ์ฌ๋ถ--vectordb-type: ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ("faiss" ๋๋ "pgvector", ๊ธฐ๋ณธ๊ฐ: faiss)--vectordb-location: VectorDB ์์น (FAISS: ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก, pgvector: ์ฐ๊ฒฐ ๋ฌธ์์ด)
.envํ์ผ์ ์์ฑํ์ฌ ์ค์ ์ ๊ด๋ฆฌํฉ๋๋ค. (์์ ํ์ผ์ด ์๋ค๋ฉด ์ฐธ์กฐ)- ๋๋ CLI ์ต์
์ผ๋ก ํ๊ฒฝ์ ์ง์ ํ ์ ์์ต๋๋ค:
--env-file-path: ํ๊ฒฝ ๋ณ์ ํ์ผ ๊ฒฝ๋ก ์ง์ --prompt-dir-path: ํ๋กฌํํธ ํ ํ๋ฆฟ(.md) ๋๋ ํ ๋ฆฌ ์ง์ --datahub_server: [Deprecated] DataHub GMS ์๋ฒ URL ์ง์ . ์ด์ ๋ UI์ ์ค์ > ๋ฐ์ดํฐ ์์ค ํญ์์ ๊ด๋ฆฌํ์ธ์.
Lang2SQL์ LangGraph๋ฅผ ์ฌ์ฉํ ๋ค๋จ๊ณ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฆ ๋๋ค:
- ๐ ์์ฐ์ด ์ฒ๋ฆฌ: ์ฌ์ฉ์ ์๋ ํ์ฑ ๋ฐ ํต์ฌ ์ํฐํฐ ์ถ์ถ
- ๐ ํ ์ด๋ธ ๊ฒ์: ์๋ฏธ๋ก ์ ์ ์ฌ์ฑ์ ์ฌ์ฉํ ๊ด๋ จ ํ ์ด๋ธ ์ฐพ๊ธฐ (Vector Search)
- โ๏ธ SQL ์์ฑ: ์ต์ ํ๋ SQL ์ฟผ๋ฆฌ ์์ฑ
- ๐ ์ฟผ๋ฆฌ ์๊ฐํ: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํ ํฉ๋๋ค.
- LangGraph: LLM ์ํฌํ๋ก์ฐ ์ค์ผ์คํธ๋ ์ด์
- DataHub: ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐ ํ์ฉ
- Streamlit: ๋ํํ ์น ์ธํฐํ์ด์ค
- Docker๋ฅผ ํ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์ปจํ
์ด๋ํํ๊ณ ,
pip install lang2sql์ค์น ํ ๋จ์ผ ๋ช ๋ น์ด๋ก ์คํ ๊ฐ๋ฅํ๋๋ก ๊ฐ์ ํฉ๋๋ค. - CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ๋ฐ ์๋ํ๋ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ๊น์ง ํ์ฅํ ์ ์๋ ์์ ์ ๋๋ค.
- ์ฟผ๋ฆฌ ์์ฑ ๊ณผ์ ์ ์์ด์ ํฑํ๊ฒ ๊ฐ์ ํ์ฌ ๋์ฑ ์ง๋ฅ์ ์ด๊ณ ์์จ์ ์ธ SQL ์์ฑ์ด ๊ฐ๋ฅํ๋๋ก ๊ฐ๋ฐํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋์ค์ปค๋ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ฐํํ์ฌ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฐพ์ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
- ํ์ฌ Datahub์ Glossary์ ์ฟผ๋ฆฌ ์์๋ฅผ ์ฝ๋๋ก ์กฐํํ๋ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
- ์ด๋ฌํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ ์์ฑ ๊ณผ์ ์ ๋์ฑ ๊ธด๋ฐํ๊ฒ ํตํฉํ์ฌ ์ปจํ ์คํธ ๊ธฐ๋ฐ์ ์ ํํ SQL ์์ฑ์ ์ง์ํ๋ ์์ ์ ๋๋ค.
- ํ์ฌ๋ Datahub๋ฅผ ํตํด ๋ก์ปฌ์ FAISS VectorDB๋ฅผ ์์ฑํด์ผ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์กฐ์ ๋๋ค.
- ์ด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ Datahub ์์ด๋ ๊ธฐ์กด์ ์ค๋น๋ VectorDB๋ง ์์ผ๋ฉด ๋ฐ๋ก ํ์ฉํ ์ ์๋๋ก ์ํคํ ์ฒ๋ฅผ ๊ฐ์ ํ๋ ์์ ์ ๋๋ค.
- ํ๋ก์ ํธ ์ฌ์ฉ ํจํด๊ณผ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ , ์์ธํ ๋ก๊น ์์คํ ์ ๊ตฌ์ถํฉ๋๋ค.
- ์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง ๋ฐ ๋ถ์ ํ๋ก์ธ์ค๋ฅผ ํตํด ์ง์์ ์ธ ๊ฐ์ ์ด ๊ฐ๋ฅํ ๊ธฐ๋ฐ์ ๋ง๋ จํ๋ ์์ ์ ๋๋ค.
- ํ๋ก์ ํธ ๊ธฐ์ฌ ์ฅ๋ฒฝ์ ๋ฎ์ถ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๋ฌธ์ํ ์์ ์ ๋๋ค.
- ๊ฐ๋ฐ์ ๊ฐ์ด๋, ํํ ๋ฆฌ์ผ ๋ฑ์ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ์ฌ ์๋ก์ด ๊ธฐ์ฌ์๋ค์ด ์ฝ๊ฒ ์ฐธ์ฌํ ์ ์๋ ํ๊ฒฝ์ ์กฐ์ฑํฉ๋๋ค.
ํ๋ฐํธ์์๋ LLM ํธ์ถยทํค๋ฅผ ์ ๊ฑฐํ๊ณ ๋ด๋ถ ๋ฐฑ์๋ API๋ก ์์ํด ๋ณด์ยท๊ถํยท๋ชจ๋ํฐ๋ง์ ์ค์ํํฉ๋๋ค.
์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! ์ฌ๋ฌ๋ถ์ด ๋์ธ ์ ์๋ ๋ฐฉ๋ฒ๋ค:
- ์ ์ฅ์ ํฌํฌํ๊ธฐ
- ํฌํฌ ํด๋ก :
git clone https://github.com/YOUR_USERNAME/lang2sql.git - ์์กด์ฑ ์ค์น:
pip install -r requirements.txt - ๊ธฐ๋ฅ ๋ธ๋์น ์์ฑ:
git checkout -b feature/amazing-feature - ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐ:
git commit -m 'Add amazing feature' - ๋ธ๋์น์ ํธ์:
git push origin feature/amazing-feature - Pull Request ์ด๊ธฐ
๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๊ฑฐ๋ ๊ธฐ๋ฅ ์์ฒญ์ด ์์ผ์ ๊ฐ์? ๋ค์ ์ ๋ณด์ ํจ๊ป ์ด์๋ฅผ ์ด์ด์ฃผ์ธ์:
- ๋ฌธ์ /๊ธฐ๋ฅ์ ๋ํ ๋ช ํํ ์ค๋ช
- ์ฌํ ๋จ๊ณ (๋ฒ๊ทธ์ ๊ฒฝ์ฐ)
- ์์ ๋์ vs ์ค์ ๋์
- ํ๊ฒฝ ์ธ๋ถ์ฌํญ
- pre-commit ํ์ฑํ
- ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ ์์ฑ
- ํ์์ ๋ฌธ์ ์ ๋ฐ์ดํธ
- ์์์ ์ด๊ณ ์ ์ค๋ช ๋ ์ปค๋ฐ ์ ์ง
- ๋ชจ๋๋ฅผ ์ํ ๊ฒ์ ๋ฐ์ดํฐ ๊ฒ์ ์์คํ / if(kakaoAI)2024
- AI ๋ฐ์ดํฐ ๋ถ์๊ฐ '๋ฌผ์ด๋ณด์' ๋ฑ์ฅ โ 1๋ถ. RAG์ Text-To-SQL ํ์ฉ
- ํ ๋๋ ธํธ LangGraph
- DataHub ๋ฌธ์
- Vanna.ai
uv build
UV_PUBLISH_TOKEN=$PYPI_API_TOKEN uv publish --token $UV_PUBLISH_TOKEN์ฌ์ ์ค๋น: GitHub Secrets์ PYPI_API_TOKEN ๋ฑ๋ก
# 1) ๋ฒ์ ์
๋ฐ์ดํธ
# - ๋ฒ์ ํ์ผ: version.py ์ __version__ = "X.Y.Z"
git add version.py
git commit -m "chore: bump version to X.Y.Z"
# 2) ํ๊ทธ ์์ฑ/ํธ์ (v* ํ์์ด ํธ๋ฆฌ๊ฑฐ)
git tag vX.Y.Z
git push origin HEAD
git push origin vX.Y.Z์ค๋ช
: v* ํ๊ทธ๊ฐ ํธ์๋๋ฉด .github/workflows/pypi-release.yml์ด ์คํ๋์ด uv๋ก ๋น๋/๋ฐฐํฌํฉ๋๋ค.
uv build
UV_PUBLISH_TOKEN=$TEST_PYPI_API_TOKEN \
uv publish --repository-url https://test.pypi.org/legacy/ --token $UV_PUBLISH_TOKENLang2SQL์ ๊ฐ์ง์ฐ๊ตฌ์์ ์ธ๊ณผ์ถ๋ก ํ์์ ๊ฐ๋ฐ์ค์ธ ํ๋ก์ ํธ์ ๋๋ค.
- This project is licensed under the MIT License.
๊ฐ์ง์ฐ๊ตฌ์๋ ๋จธ์ ๋ฌ๋๊ณผ AI ๊ธฐ์ ๋ฐ์ ์ ์ค์ ์ ๋ ๋น์๋ฆฌ ์กฐ์ง์ ๋๋ค. ๊ณต์ , ๋๊ธฐ๋ถ์ฌ, ๊ทธ๋ฆฌ๊ณ ํ์ ์ ๊ธฐ์จ์ด๋ผ๋ ํต์ฌ ๊ฐ์น๋ฅผ ๋ฐํ์ผ๋ก ์ํฅ๋ ฅ ์๋ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๊ฐ๋๋ค.
์ ์ธ๊ณ 5,000๋ช ์ด์์ ์ฐ๊ตฌ์๋ค๊ณผ ํจ๊ป, ์ฐ๋ฆฌ๋ AI ์ง์์ ๋ฏผ์ฃผํ์ ์ด๋ฆฐ ํ์ ์ ํตํ ํ์ ์ด์ง์ ์ ๋ ํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ์ธ์:
- ๐ฌ Discord
โญ ์ด ์ ์ฅ์๊ฐ ๋์์ด ๋์ จ๋ค๋ฉด ์คํ๋ฅผ ๋๋ฌ์ฃผ์ธ์!
"์ฐ๋ฆฌ๋ ํจ๊ป ์ฝ๋์ ์์ด๋์ด๋ฅผ ๋๋๋ฉฐ ๋ ๋์ ๋ฐ์ดํฐ ํ๊ฒฝ์ ๋ง๋ค๊ธฐ ์ํ ์คํ์์ค ์ฌ์ ์ ๋ ๋ฉ๋๋ค. ๐๐ก"