๊ณ„๋ž€์†Œ๋…„ 2025. 6. 24. 16:14

Fast API&MySQL

 

from sqlalchemy.orm import Session
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

# 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ์ƒ์„ฑ
DATABASE_URL = "mysql+pymysql://user:password@localhost:3306/db_name"
engine = create_engine(DATABASE_URL)

# 2. ๋ฒ ์ด์Šค ํด๋ž˜์Šค ์ƒ์„ฑ
Base = declarative_base()

# 3. ๋ชจ๋ธ ์ •์˜ (DB ํ…Œ์ด๋ธ” ๋งคํ•‘)
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(100))

# 4. ํ…Œ์ด๋ธ” ์ƒ์„ฑ
Base.metadata.create_all(bind=engine)

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •

  • DATABASE_URL: MySQL ์—ฐ๊ฒฐ ์ •๋ณด (์‚ฌ์šฉ์ž: user, ๋น„๋ฐ€๋ฒˆํ˜ธ: password, DB: db_name)
    • mysql+pymysql: SQLAlchemy์—๊ฒŒ MySQL์„ ์‚ฌ์šฉํ•˜๊ณ , ํ†ต์‹ ์— pymysql ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•จ์„ ์•Œ๋ฆผ
  • engine: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ์ƒ์„ฑ
  • Base: ORM ๋ชจ๋ธ ๋ฒ ์ด์Šค ํด๋ž˜์Šค, declarative_base()=๋ชจ๋“  ๋ชจ๋ธ์ด ์ƒ์†๋ฐ›์•„์•ผํ•˜๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค

 

ํ…Œ์ด๋ธ” ์ž๋™ ์ƒ์„ฑ

  • ์ •์˜๋œ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์œผ๋กœ DB ํ…Œ์ด๋ธ” ์ž๋™ ์ƒ์„ฑ
  • SQLAlchemy์˜ ๋ชจ๋ธ ํด๋ž˜์Šค๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜
  • ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์กด์žฌ ์‹œ ๋ฌด์‹œํ•จ. ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ

 

์„ธ์…˜

from sqlalchemy.orm import sessionmaker

# ์„ธ์…˜ ํŒฉํ† ๋ฆฌ ์ƒ์„ฑ
SessionLocal = sessionmaker(
    autocommit=False,  # ์ž๋™ ์ปค๋ฐ‹ ๋น„ํ™œ์„ฑํ™”
    autoflush=False,    # ์ž๋™ ํ”Œ๋Ÿฌ์‹œ ๋น„ํ™œ์„ฑํ™”
    bind=engine
)

# ์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์„ธ์…˜ ๊ด€๋ฆฌ ํ•จ์ˆ˜
def get_db():
    db = SessionLocal()
    try:
        yield db  # ์š”์ฒญ ์ฒ˜๋ฆฌ ๋™์•ˆ ์„ธ์…˜ ์‚ฌ์šฉ
    finally:
        db.close()  # ์š”์ฒญ ์ข…๋ฃŒ ์‹œ ์„ธ์…˜ ๋ฐ˜ํ™˜
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜ ๊ด€๋ฆฌ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด "์„ธ์…˜"์ด ํ•„์š”ํ•˜๋‹ค.
  • ์„ธ์…˜์€ ์ผ์ข…์˜ ์—ฐ๊ฒฐ ํ†ต๋กœ๋กœ, ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ณ , ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑํ•˜๋Š” ์—ญํ• 
  • SQLAlchemy์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด. ๋”ฐ๋ผ์„œ, CRUD๋ฅผ ์œ„ํ•ด์„œ๋Š” ์„ธ์…˜์ด ํ•„์š”ํ•˜๋‹ค.
  • 2๊ฐ€์ง€ ๋ฐฉ์•ˆ์ด ์กด์žฌํ•œ๋‹ค. (Depends, sessionMaker)

 

Depends

 

FastAPI์˜ Depends ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜์„ ์ž๋™์œผ๋กœ ์—ด๊ณ , ์š”์ฒญ์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ซ์•„์ค€๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•œ DB ์„ธ์…˜ ๊ด€๋ฆฌ

์š”์ฒญ ์™„๋ฃŒ ์‹œ ์„ธ์…˜ ์ž๋™ ์ข…๋ฃŒ

db = Session(bind=engine): ์ƒˆ ์„ธ์…˜(์—ฐ๊ฒฐ)์„ ์ƒ์„ฑ
try:
    yield db: ์ด ์„ธ์…˜์„ FastAPI ์—”๋“œํฌ์ธํŠธ ํ•จ์ˆ˜์— ์ „๋‹ฌ
finally: 
    db.close(): ์š”์ฒญ์ด ๋๋‚˜๋ฉด(์ •์ƒ/์—๋Ÿฌ ๋ชจ๋‘) ์„ธ์…˜์„ ๋‹ซ์•„ ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€

 

ํŒŒ์ด์ฌ์—์„œ yield๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ "์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜"๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ

์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜์—์„œ return์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์„ ํ•œ ๋ฒˆ๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ง€๋งŒ, yield๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์„ ํ•˜๋‚˜ ๋ฐ˜ํ™˜ํ•œ ๋’ค ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋ฉˆ์ถ”๊ณ , ๋‹ค์Œ์— ๋‹ค์‹œ ํ˜ธ์ถœ๋˜๋ฉด ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ์‹คํ–‰์„ ์ด์–ด๊ฐ„๋‹ค.

์ฆ‰, yield๋Š” ๊ฐ’์„ "ํ•˜๋‚˜์”ฉ" ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ž ์‹œ ๋ฉˆ์ท„๋‹ค๊ฐ€, ๋‹ค์Œ์— ๋˜ ์‹คํ–‰๋˜๋ฉด ๋ฉˆ์ท„๋˜ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ด์–ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ํ•จ์ˆ˜(์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜)๋Š” ๋ฐ˜๋ณต์ž(iterator)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๋ฉด์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

FastAPI์—์„œ get_db() ํ•จ์ˆ˜์— yield๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ์—”๋“œํฌ์ธํŠธ ํ•จ์ˆ˜๊ฐ€ DB ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๊ณ , ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด finally ๋ธ”๋ก์—์„œ ์„ธ์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ซ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, yield๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ ์ฝ”๋“œ๋Š” "์„ธ์…˜์„ ์—ด์–ด์„œ ์—”๋“œํฌ์ธํŠธ์— ์ „๋‹ฌ"ํ•˜๋Š” ์—ญํ• , yield ๋’ค์ชฝ finally ์ฝ”๋“œ๋Š” "์š”์ฒญ์ด ๋๋‚˜๋ฉด ์„ธ์…˜์„ ๋‹ซ๋Š” ์ •๋ฆฌ ์ž‘์—…"์„ ๋‹ด๋‹น

 

Pydantic ๋ชจ๋ธ

# MemoCreate: ๋ฉ”๋ชจ ์ƒ์„ฑ์šฉ ํ•„์ˆ˜ ํ•„๋“œ. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‘ ํ•„๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ณด๋‚ด์•ผ ํ•˜๋ฉฐ, ํƒ€์ž…์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜
# MemoUpdate: ๋ฉ”๋ชจ ์ˆ˜์ •์šฉ ์„ ํƒ์  ํ•„๋“œ. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณด๋‚ด๋„ ๋˜๊ณ , ๋‘˜ ๋‹ค ๋ณด๋‚ด๋„ ๋˜๊ณ , ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณด๋‚ด๋ฉด ์•„๋ฌด ๋ณ€ํ™”๋„ ์—†๋‹ค. -> PATCH

class MemoCreate(BaseModel):
    title: str
    content: str

class MemoUpdate(BaseModel):
    title: Optional[str] = None
    content: Optional[str] = None

 

Pydantic์˜ BaseModel์„ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“  ํด๋ž˜์Šค๋Š” "๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ"์™€ "์ž๋™ ๋ฌธ์„œํ™”"๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

FastAPI๋Š” API ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ, body์— ๋‹ด๊ธด JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ด BaseModel๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ํƒ€์ž…๊ณผ ํ•„์ˆ˜/์„ ํƒ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ๋ณด์•ˆ: ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ DB์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰์Œ
  • ์ž๋™ ๋ฌธ์„œํ™”: API ๋ฌธ์„œ(Swagger ๋“ฑ)์— ์ž๋™ ๋ฐ˜์˜
  • ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”: ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋กœ์ง์„ ์ผ์ผ์ด ์ž‘์„ฑํ•  ํ•„์š” ์—†๋‹ค.

 

์˜์กด์„ฑ ์ฃผ์ž… ์„ค์ •

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ UserSchema๋ชจ๋ธ๋กœ ๋ฐ›๋„๋ก ์„ค์ •, Depends(get_db)๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•œ ์˜์กด์„ฑ ํ•จ์ˆ˜ get_dbํ•จ์ˆ˜๋ช…์„ ๋„ฃ์Œ. ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด Session ๊ฐ์ฒด์ด๋ฏ€๋กœ, ํƒ€์ž…์€ Session์œผ๋กœ ์ž‘์„ฑ๊ฐ€๋Šฅ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ: new_user=User(): User ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜์— ๊ฐ์ฒด ์ถ”๊ฐ€: db.add(new_user): ์ƒ์„ฑ๋œ User์ธ์Šคํ„ด์Šค๋ฅผ ํ˜„์žฌ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜์— ์ถ”๊ฐ€
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ปค๋ฐ‹: db.commit(): ํ…Œ์ด๋ธ” ๊ฐ์ฒด ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋ฉด db.commit()ํ˜ธ์ถœํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜
  • ๊ฐ์ฒด์ •๋ณด ๊ฐฑ์‹ : db.refresh(new_user): db.refresh()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ปค๋ฐ‹๋œ ์ƒˆ๋กœ์šด user์ธ์Šคํ„ด์Šค์˜ ์ •๋ณด๋ฅผ ์ตœ์‹ ์ƒํƒœ๋กœ ๊ฐฑ์‹ 
    • commit์€ ํŒŒ์ด์ฌ์—์„œ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์„ DB์— ์ €์žฅํ•˜๋Š” ๋™์ž‘. ์ฆ‰, ํŒŒ์ด์ฌ → DB 
    • refresh๋Š” DB์— ์ด๋ฏธ ์ €์žฅ๋œ(์ปค๋ฐ‹๋œ) ๊ฐ’์„ DB์—์„œ ํŒŒ์ด์ฌ ๊ฐ์ฒด๋กœ ๋‹ค์‹œ ์ฝ์–ด์˜ค๋Š” ๋™์ž‘. ์ฆ‰, DB → ํŒŒ์ด์ฌ 

 

์ด๋ฅผํ†ตํ•ด ๊ฐ ์š”์ฒญ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋™์•ˆ DB ์„ธ์…˜์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ. Pydantic๋ชจ๋ธ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ๊ณผ SQLAlchemey๋ชจ๋ธ์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

Dependsํ†ตํ•ด ์ฃผ์ž…๋œ get_db()ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์œ ์ง€ํ•˜๊ณ , ๋ชจ๋“  ์ฒ˜๋ฆฌ ์™„๋ฃŒ ํ›„ ํ•ด๋‹น ์—ฐ๊ฒฐ ์ข…๋ฃŒ

 

CRUD

from fastapi import Depends

# Create
@app.post("/users")
def create_user(user_data: UserSchema, db: Session = Depends(get_db)):
    new_user = User(name=user_data.name, email=user_data.email)
    db.add(new_user)
    db.commit()  # ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ
    db.refresh(new_user)  # DB์—์„œ ์ƒˆ๋กœ๊ณ ์นจ
    return new_user

# Read
@app.get("/users/{user_id}")
def get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    return user

# Update
@app.put("/users/{user_id}")
def update_user(user_id: int, update_data: UserUpdate, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    user.name = update_data.name
    db.commit()
    db.refresh(user)
    return user

# Delete
@app.delete("/users/{user_id}")
def delete_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    db.delete(user)
    db.commit()
    return {"message": "User deleted"}

 

 

1. ๋ฉ”๋ชจ ์ƒ์„ฑ (POST)

 

๋™์ž‘: ์ƒˆ ๋ฉ”๋ชจ ์ƒ์„ฑ → DB ์ €์žฅ → ์ƒ์„ฑ๋œ ๊ฐ์ฒด ๋ฐ˜ํ™˜

๋ฐ˜ํ™˜๊ฐ’: ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ์˜ ID, ์ œ๋ชฉ, ๋‚ด์šฉ

 

db: Depends(get_db)๋กœ DB ์„ธ์…˜์ด ์ž๋™ ์ฃผ์ž…

์—ญํ• : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ๊ฐ์ฒด

์–ด๋–ป๊ฒŒ ์ฑ„์›Œ์ง€๋‚˜?

Depends(get_db)๋Š” FastAPI์˜ ์˜์กด์„ฑ ์ฃผ์ž… ๊ธฐ๋Šฅ

FastAPI๊ฐ€ get_db() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ, ๋ฐ˜ํ™˜๋œ db ์„ธ์…˜์„ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ž๋™์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค.

 

db.commit(): ์‹ค์ œ๋กœ DB์— ์ €์žฅ

db.refresh(new_memo): DB์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ์˜ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ์ฝ์–ด์˜ด(์˜ˆ: id)

'''

 

5. Pydantic ์Šคํ‚ค๋งˆ

์—ญํ• ๊ณผ ํ•„์š”์„ฑ
Pydantic์˜ BaseModel์„ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“  ํด๋ž˜์Šค๋Š” "๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ"์™€ "์ž๋™ ๋ฌธ์„œํ™”"๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
FastAPI๋Š” API ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ, body์— ๋‹ด๊ธด JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ด BaseModel๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ํƒ€์ž…๊ณผ ํ•„์ˆ˜/์„ ํƒ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์™œ ํ•„์š”ํ•œ๊ฐ€?
๋ณด์•ˆ: ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ DB์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰์Œ
์ž๋™ ๋ฌธ์„œํ™”: API ๋ฌธ์„œ(Swagger ๋“ฑ)์— ์ž๋™ ๋ฐ˜์˜
์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”: ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋กœ์ง์„ ์ผ์ผ์ด ์ž‘์„ฑํ•  ํ•„์š” ์—†์Œ

MemoCreate: ๋ฉ”๋ชจ ์ƒ์„ฑ์šฉ ํ•„์ˆ˜ ํ•„๋“œ. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‘ ํ•„๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ณด๋‚ด์•ผ ํ•˜๋ฉฐ, ํƒ€์ž…์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜
MemoUpdate: ๋ฉ”๋ชจ ์ˆ˜์ •์šฉ ์„ ํƒ์  ํ•„๋“œ. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณด๋‚ด๋„ ๋˜๊ณ , ๋‘˜ ๋‹ค ๋ณด๋‚ด๋„ ๋˜๊ณ , ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณด๋‚ด๋ฉด ์•„๋ฌด ๋ณ€ํ™”๋„ ์—†๋‹ค. -> PATCH

'''