๐Ÿงญ LangGraph ์™„์ „ ์ •๋ณต โ‘ง โ€” ์‹ค์ „ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ & Best Practice

okorionยท2025๋…„ 10์›” 4์ผ

โ€œํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์ด ๋œ๋‹ค.โ€
๋Œ€ํ˜• ์›Œํฌํ”Œ๋กœ์šฐ ์„ค๊ณ„, ์„ฑ๋Šฅ ์ตœ์ ํ™”, ์—๋Ÿฌ ํ•ธ๋“ค๋ง, ์šด์˜ ์ „๋žต ์ด์ •๋ฆฌ.


โš™๏ธ 1. ์™œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€

LangGraph๋Š” ๋‹จ์ˆœํžˆ โ€œLLM ํ๋ฆ„ ์ œ์–ด ๋„๊ตฌโ€๊ฐ€ ์•„๋‹ˆ๋ผ, LLM ์‹œ์Šคํ…œ์˜ ์ œ์–ด ๋ ˆ์ด์–ด(Orchestration Layer) ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ œ ์„œ๋น„์Šค์—์„  ๋‹ค์Œ์ด ๋ฐ˜๋“œ์‹œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

โœ… ์—ฌ๋Ÿฌ ๋…ธ๋“œ์˜ ๋ณ‘๋ ฌ ์‹คํ–‰
โœ… ์ƒํƒœ(State)์™€ ์บ์‹œ ๊ด€๋ฆฌ
โœ… ์˜ค๋ฅ˜ ๋ณต๊ตฌ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
โœ… ๋Œ€๊ทœ๋ชจ ๊ทธ๋ž˜ํ”„์˜ ๊ตฌ์กฐํ™”
โœ… ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ฐฐํฌ ์ „๋žต

์ด์ œ ์ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ์„ค๊ณ„ํ•ด๋ด…์‹œ๋‹ค.


๐Ÿงฉ 2. ์‹ค์ „ ๊ตฌ์กฐ ๊ฐœ์š”

๐Ÿ“Š ๋Œ€ํ˜• LangGraph ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ:

์ด ๊ตฌ์กฐ๋Š” ๋‹จ์ผ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋ธŒ๊ทธ๋ž˜ํ”„(SubGraph) ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋‰˜์–ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ SubGraph๋Š” โ€œ๊ธฐ๋Šฅ ๋ชจ๋“ˆโ€์ฒ˜๋Ÿผ ์žฌ์‚ฌ์šฉ๋˜๊ณ , ์ƒ์œ„ ๊ทธ๋ž˜ํ”„์—์„œ orchestration ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿง  3. ๋ณต์žกํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ (SubGraph)

โœ… ์˜ˆ์‹œ: ๊ฒ€์ƒ‰ + ์ƒ์„ฑ + ํ‰๊ฐ€ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ SubGraph๋กœ

from langgraph.graph import StateGraph, SubGraph

class RAGState:
    query: str
    docs: list[str]
    answer: str

# --- SubGraph ์ •์˜ (๊ฒ€์ƒ‰ + ์ƒ์„ฑ) ---
rag_graph = StateGraph(RAGState)

def retrieve(state): ...
def generate(state): ...

rag_graph.add_node("retrieve", retrieve)
rag_graph.add_node("generate", generate)
rag_graph.add_edge("retrieve", "generate")
rag_graph.set_entry_point("retrieve")
rag_graph.set_finish_point("generate")

rag_module = SubGraph(rag_graph)

# --- ๋ฉ”์ธ ๊ทธ๋ž˜ํ”„์—์„œ ์žฌ์‚ฌ์šฉ ---
main_graph = StateGraph(RAGState)
main_graph.add_node("RAGPipeline", rag_module)
main_graph.add_node("Evaluator", lambda s: print("ํ‰๊ฐ€ ์™„๋ฃŒ"))
main_graph.add_edge("RAGPipeline", "Evaluator")

โœ… ์žฅ์ 

  • ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
  • ํŒ€ ๋‹จ์œ„๋กœ ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  • ํ…Œ์ŠคํŠธ ๋ฐ ๋กœ๊น… ๋…๋ฆฝ

โšก๏ธ 4. ๋ณ‘๋ ฌ ์‹คํ–‰(Parallel Flow) ์„ค๊ณ„

LangGraph๋Š” ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๋™์‹œ์— ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๋ชจ๋ธ์„ ๋™์‹œ์— ๋น„๊ต ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์ฃ .

from langgraph.graph import StateGraph
import asyncio

class MultiState:
    news: str
    weather: str
    fx: str

async def get_news(state): ...
async def get_weather(state): ...
async def get_fx(state): ...

graph = StateGraph(MultiState)
graph.add_node("news", get_news)
graph.add_node("weather", get_weather)
graph.add_node("fx", get_fx)

graph.set_entry_point("news")
graph.add_edge("news", "weather")
graph.add_edge("news", "fx")

app = graph.compile()
asyncio.run(app.ainvoke({}))

๐Ÿ’ก ํŒ:

  • async def๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋…ธ๋“œ ๋‹จ์œ„ ๋น„๋™๊ธฐ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ์—ฌ๋Ÿฌ Tool ํ˜ธ์ถœ ์‹œ asyncio.gather()๋กœ ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™”

๐Ÿ”„ 5. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ (Error Handling & Fallback Flow)

LangGraph์—์„œ๋Š” ๋…ธ๋“œ ์‹คํŒจ ์‹œ ๋Œ€์ฒด ๊ฒฝ๋กœ(Fallback)๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

def critical_tool(state):
    raise ValueError("API ์˜ค๋ฅ˜ ๋ฐœ์ƒ")

def fallback_node(state):
    print("์˜ค๋ฅ˜ ๋ฐœ์ƒ โ†’ ๋Œ€์ฒด ํ๋ฆ„ ์‹คํ–‰")
    return state

def handle_error(state):
    try:
        return critical_tool(state)
    except Exception:
        return fallback_node(state)

๐Ÿ“Š ๊ตฌ์กฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด:

์ด๋Ÿฐ ์˜ˆ์™ธ ์—ฃ์ง€(Error Edge) ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์‹คํŒจํ•œ ๋…ธ๋“œ๋ฅผ ์ž๋™ ๊ฐ์ง€ํ•ด ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ˆ 6. ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต

ํ•ญ๋ชฉ์„ค๋ช…๊ตฌํ˜„ ํŒ
LLM ํ˜ธ์ถœ ์บ์‹ฑ๋™์ผ ์ž…๋ ฅ ์žฌ์‚ฌ์šฉLangChain InMemoryCache ์‚ฌ์šฉ
Tool ํ˜ธ์ถœ ๋น„๋™๊ธฐํ™”I/O ๋Œ€๊ธฐ ์ตœ์†Œํ™”async def + await
State ์ตœ์†Œํ™”๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ@dataclass(slots=True)
Mermaid ์‹œ๊ฐํ™”๋””๋ฒ„๊น…์šฉ ๊ทธ๋ž˜ํ”„ ์‹œ๊ฐํ™”graph.visualize("graph.png")
Batch ์ฒ˜๋ฆฌ๋‹ค์ค‘ ์š”์ฒญ ์ผ๊ด„ ์‹คํ–‰์—ฌ๋Ÿฌ ์ž…๋ ฅ์„ ํ•˜๋‚˜์˜ state list๋กœ ๋ฌถ๊ธฐ
๋กœ๊น… ๋ถ„๋ฆฌ์‹คํ–‰ ๋กœ๊ทธ / ๊ฒฐ๊ณผ ๋กœ๊ทธ ๋ถ„๋ฆฌCallbackManager๋กœ ๋ถ„๋ฆฌ ๋กœ๊น…

๐Ÿงพ 7. ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์กฐ

LangGraph๋Š” ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๊น…์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from langgraph.callbacks.base import CallbackManager

def on_start(node_name, state):
    print(f"[Start] {node_name}")

def on_end(node_name, state):
    print(f"[End] {node_name}")

logger = CallbackManager(on_node_start=on_start, on_node_end=on_end)
app = graph.compile(callbacks=logger)

์ด ๊ตฌ์กฐ๋ฅผ Prometheus, ELK Stack, Datadog ๋“ฑ๊ณผ ์—ฐ๋™ํ•˜๋ฉด
๋…ธ๋“œ๋ณ„ ์‹คํ–‰ ์ง€ํ‘œ, ์‹คํŒจ์œจ, latency๊นŒ์ง€ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โ˜๏ธ 8. LangServe + LangGraph ๋ฐฐํฌ ์ „๋žต

์‹ค์ œ ์šด์˜ ๋‹จ๊ณ„์—์„œ๋Š” LangGraph๋ฅผ API ์„œ๋น„์Šค ํ˜•ํƒœ๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

โœ… LangServe ํ†ตํ•ฉ ์˜ˆ์‹œ

from langserve import LangServe
from fastapi import FastAPI

app = FastAPI()
rag_app = graph.compile()
LangServe(app, "/rag", rag_app)

# ์‹คํ–‰: uvicorn main:app --reload

์ด์ œ LangGraph ์ „์ฒด ํ๋ฆ„์ด /rag ์—”๋“œํฌ์ธํŠธ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ†’ ํ”„๋ก ํŠธ์—”๋“œ / ๋‹ค๋ฅธ ์„œ๋น„์Šค์—์„œ ์ง์ ‘ ํ˜ธ์ถœ ๊ฐ€๋Šฅ.


๐Ÿ” 9. ๋ณด์•ˆ & ์šด์˜ ๊ณ ๋ ค์‚ฌํ•ญ

ํ•ญ๋ชฉ๋‚ด์šฉ
์ธ์ฆJWT / API Key๋กœ LangServe ์ ‘๊ทผ ์ œ์–ด
๋ฐ์ดํ„ฐ ๋ณด์•ˆ์ƒํƒœ(State) ๊ฐ์ฒด ๋‚ด ๋ฏผ๊ฐ์ •๋ณด ์•”ํ˜ธํ™”
์—๋Ÿฌ ์ถ”์ Sentry / Slack Alert ์—ฐ๊ฒฐ
๋ฒ„์ „ ๊ด€๋ฆฌ๊ทธ๋ž˜ํ”„ ๋ฒ„์ „๋ณ„ Git Commit ๊ด€๋ฆฌ
๋ฐฑ์—…MemorySaver ์ฒดํฌํฌ์ธํŠธ ์ฃผ๊ธฐ์  ๋คํ”„

๐Ÿงญ 10. LangGraph ์‹ค์ „ ์„ค๊ณ„ ์›์น™

์„ค๊ณ„ ์›์น™์„ค๋ช…
1. ์ž‘๊ฒŒ ์ชผ๊ฐœ๋ผ๋…ธ๋“œ๋Š” ์ž‘๊ณ  ๋ช…ํ™•ํ•ด์•ผ ํ•จ (1 Node = 1 ์—ญํ• )
2. ์ƒํƒœ๋Š” ๋ถˆ๋ณ€์ฒ˜๋Ÿผ ๋‹ค๋ค„๋ผReducer ํŒจํ„ด์œผ๋กœ ์ผ๊ด€์„ฑ ์œ ์ง€
3. ๋ชจ๋“  ์—ฃ์ง€์—” ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋ฌดํ•œ๋ฃจํ”„ยท๋…ผ๋ฆฌ์˜ค๋ฅ˜ ๋ฐฉ์ง€
4. ๋ณ‘๋ ฌ ๊ฐ€๋Šฅํ•œ ๊ฑด ๋ณ‘๋ ฌ๋กœ ๋Œ๋ ค๋ผ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•ต์‹ฌ
5. ์‹œ๊ฐํ™”๋ฅผ ์Šต๊ด€ํ™”ํ•˜๋ผgraph.visualize()๋กœ ๋ฌธ์„œํ™”
6. ์‹คํŒจ๋ฅผ ์˜ˆ์ƒํ•˜๊ณ  ๋Œ€๋น„ํ•˜๋ผError/Fallback Flow ์„ค๊ณ„ ํ•„์ˆ˜

๐Ÿงฉ 11. ๋Œ€๊ทœ๋ชจ ๊ทธ๋ž˜ํ”„ ์˜ˆ์‹œ (์š”์•ฝ ๋‹ค์ด์–ด๊ทธ๋žจ)

์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ํ•˜๋‚˜์˜ โ€œAI ํŒŒ์ดํ”„๋ผ์ธ ์—”์ง„โ€์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
LangGraph๋Š” ๋‹จ์ˆœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, AI Workflow OS๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŽ“ 12. ๋” ๊นŠ์ด ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ๊ณ ๊ธ‰ ํ™•์žฅ ํ•™์Šต ๊ฐ€์ด๋“œ

์ฃผ์ œํ•™์Šต ์ด์œ ์ถ”์ฒœ ํ•™์Šต ๋ฐฉํ–ฅ
Workflow Orchestration๋Œ€๊ทœ๋ชจ LLM ์‹œ์Šคํ…œ ๊ตฌ์กฐํ™”LangGraph + Airflow ๋น„๊ต ํ•™์Šต
LangGraph + MCP Protocol๋ชจ๋ธ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ ํ™•์žฅModel Context Protocol (MCP) ์‹ค์Šต
SubGraph ์ปดํฌ์ง€์…˜ํŒ€ ๋‹จ์œ„ ํ˜‘์—… ๊ฐœ๋ฐœ๋ชจ๋“ˆ์‹ ๊ทธ๋ž˜ํ”„ ์„ค๊ณ„ ํŒจํ„ด
LLM Observability Stack์šด์˜/๋ชจ๋‹ˆํ„ฐ๋ง ์ฒด๊ณ„ ๊ตฌ์ถ•Langfuse, PromptLayer, Weights&Biases
Advanced RAG Evaluation์‘๋‹ต ํ’ˆ์งˆ ์ž๋™ ํ‰๊ฐ€ ๋ฃจํ”„Faithfulness, Factuality Metric
Hybrid ArchitectureLangGraph + CrewAI + LangServe ํ†ตํ•ฉMulti-agent workflow ๋น„๊ต

๐Ÿ“š ํ•ต์‹ฌ ์š”์•ฝ

  • LangGraph์˜ ์‹ค์ „ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ชจ๋“ˆํ™”, ๋ณ‘๋ ฌํ™”, ์˜ค๋ฅ˜ ๋ณต๊ตฌ, ์‹œ๊ฐํ™”๋ฅผ ํ•ต์‹ฌ์œผ๋กœ ํ•œ๋‹ค.
  • SubGraph๋กœ ๋‚˜๋ˆ„๊ณ , Callback๊ณผ LangServe๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง/๋ฐฐํฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋ผ.
  • ๊ทธ๋ž˜ํ”„๋Š” ๋” ์ด์ƒ ์‹คํ—˜์šฉ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์šด์˜ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ์„ค๊ณ„๋„๋‹ค.

๐Ÿ’ก LangGraph๋ฅผ ๋งˆ์Šคํ„ฐํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๋‹น์‹ ์€ LLM์„ โ€œํ”„๋กฌํ”„ํŠธ๋กœ ์กฐ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒโ€์ด ์•„๋‹ˆ๋ผ โ€œ์‹œ์Šคํ…œ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ์—”์ง€๋‹ˆ์–ดโ€๋‹ค.


๐Ÿ ์‹œ๋ฆฌ์ฆˆ ์™„๊ฒฐ โ€“ โ€œLangChain & LangGraph ์™„์ „ ์ •๋ณตโ€ ํšŒ๊ณ 

LangChain

ํšŒ์ฐจ์ฃผ์ œํ•ต์‹ฌ ํฌ์ธํŠธ๋ชฉ์ 
LangChain 1ํŽธLangChain์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ํ”„๋กฌํ”„ํŠธ โ†’ ์ฒด์ธ โ†’ ์—์ด์ „ํŠธ๋กœ ์ด์–ด์ง€๋Š” ๊ตฌ์กฐ์ฒ ํ•™์  ๊ธฐ๋ฐ˜ ์ดํ•ด
LangChain 2ํŽธ์ฒด์ธยท๋ฉ”๋ชจ๋ฆฌยท์—์ด์ „ํŠธ ์‹ค์ „ ์˜ˆ์ œLLMChain, Memory, Tool, AgentExecutor์‹ค์ „ ๊ฐ๊ฐ
LangChain 3ํŽธLangChain์˜ ํ•œ๊ณ„์™€ LangGraph๋กœ์˜ ์ „ํ™˜LCEL, Runnable, ํ•œ๊ณ„ ์ •๋ฆฌLangGraph๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ

LangGraph

ํšŒ์ฐจ์ฃผ์ œํ•ต์‹ฌ ํฌ์ธํŠธ
LangGraph โ‘ LangGraph๋ž€ ๋ฌด์—‡์ธ๊ฐ€๊ตฌ์กฐ ์ค‘์‹ฌ ์‚ฌ๊ณ 
LangGraph โ‘ก๋…ธ๋“œ์™€ ์—ฃ์ง€add_node, add_edge, ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ
LangGraph โ‘ขReducer & MessageGraph์ƒํƒœ/ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„
LangGraph โ‘ฃTool ํ†ตํ•ฉToolNode, Runnable
LangGraph โ‘คReAct ๊ทธ๋ž˜ํ”„Reason โ†’ Act โ†’ Observe
LangGraph โ‘ฅRAG(Graph)๊ฒ€์ƒ‰ยท์ƒ์„ฑยทํ‰๊ฐ€ ๋ฃจํ”„
LangGraph โ‘ฆUI ํ†ตํ•ฉGradio/Streamlit
LangGraph โ‘ง์‹ค์ „ ์„ค๊ณ„ & Best Practice์„ฑ๋Šฅ/๋ฐฐํฌ/ํ™•์žฅ ์ „๋žต

โœจ ๋งˆ์ง€๋ง‰ ์กฐ์–ธ

LangGraph๋Š” ์•„์ง ์ง„ํ™” ์ค‘์ธ ์ƒํƒœ๊ณ„์ง€๋งŒ, LLM ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์˜ ํ‘œ์ค€ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋˜์–ด๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โ€œLangChain์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ–ˆ๋‹ค๋ฉด, LangGraph๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ฒŒ ํ•œ๋‹ค.โ€

์ด ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์™„๋…ํ–ˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์ด์ œ ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ AI Workflow ์—”์ง€๋‹ˆ์–ด์ž…๋‹ˆ๋‹ค. ๐Ÿš€๐Ÿš€๐Ÿš€

profile
okorion's Tech Study Blog.

0๊ฐœ์˜ ๋Œ“๊ธ€