개인적으둜 νŒŒμ΄μ¬μ„ μ’‹μ•„ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ‚˜, AI μ‹œλŒ€μ— μžˆμ–΄ νŒŒμ΄μ¬μ„ μ–Έμ œκΉŒμ§€λ‚˜ κΈ°ν”Όν•  수 μ—†λ‹€. 비둝 파이썬으둜 κ°œλ°œν•˜μ§€ μ•Šλ”λΌλ„ 파이썬 μ½”λ“œλ₯Ό 보고 이해할 수 μžˆλŠ” μ—­λŸ‰μ„ ν‚€μ›Œλ³΄μž. νŒŒμ΄μ¬μ€ 개발자 λ³΄λ‹€λŠ” DevOps μ—”μ§€λ‹ˆμ–΄ λ˜λŠ” QA μ—”μ§€λ‹ˆμ–΄ 그리고 데이터 뢄석 μ—”μ§€λ‹ˆμ–΄κ°€ 많이 ν™œμš©ν•œλ‹€.

파이썬 인터프리터

νŒŒμ΄μ¬μ€ 컴파일 단계λ₯Ό κ±°μΉ˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό ν•œμ€„μ”© κ·ΈλŒ€λ‘œ 파이썬 인터프리터에 μ˜ν•΄ μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€. 기본적인 파이썬 μΈν„°ν”„λ¦¬ν„°λŠ” CPython 이며, pip λ˜λŠ” uv λŠ” νŒŒμ΄μ¬μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €μ΄λ‹€. 파이썬 κ°œλ°œμžκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 파이썬 인터프리터가 μ •ν™•νžˆ μ–΄λ–€ κ³Όμ •μœΌλ‘œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ”μ§€λŠ” μžμ„Ένžˆ μ•Œ ν•„μš”λŠ” 없어보인닀.

λͺ¨λ“ˆ 디렉토리

νŒŒμ΄μ¬μ€ λ³€μˆ˜ λ˜λŠ” ν•¨μˆ˜ 그리고 클래슀 등을 ν•˜λ‚˜μ˜ .py νŒŒμΌμ— μ •μ˜ν•˜μ—¬ λ‹€λ₯Έ νŒŒμΌμ—μ„œ 뢈러올 수 μžˆλ„λ‘ λͺ¨λ“ˆν™”ν•œλ‹€. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž‘μ„±μ„ μœ„ν•΄ FastAPI νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜λ©΄ λͺ¨λ“ˆμ„ κ°€μ Έμ™€μ„œ μ‹€ν–‰ν•˜κ²Œ λœλ‹€. λͺ¨λ“ˆ 파일이 μ‘΄μž¬ν•˜λŠ” 디렉토리에 __init__.py 파일이 μ‘΄μž¬ν•˜λ©΄ ν•΄λ‹Ή ν΄λ”λŠ” νŒ¨ν‚€μ§€λ‘œ μ·¨κΈ‰λœλ‹€. Best Practices ν”„λ‘œμ νŠΈ μ½”λ“œλ₯Ό 찾아보면 파일 ꡬ쑰 상에 이 파일이 없을 수 μžˆλŠ” κ±Έ λ³Ό 수 μžˆλŠ”λ° μƒλž΅μ΄ κ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ 보인닀.

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def index():
    return {"Hello": "World"}

λ°μ½”λ ˆμ΄ν„°

νŒŒμ΄μ¬μ—μ„œ λ°μ½”λ ˆμ΄ν„°λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λž˜ν•‘ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. FastAPIμ—μ„œ λΌμš°ν„°λ₯Ό 등둝할 λ•Œ μ‚¬μš©ν•˜κ±°λ‚˜ Cacheλ₯Ό 톡해 파이썬 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ”λ° μ‚¬μš©ν•  수 μžˆλ‹€. λ‹€μŒκ³Ό 같은 타이밍 λ°μ½”λ ˆμ΄ν„°λŠ” ν•¨μˆ˜μ˜ μ‹€ν–‰ μ‹œκ°„μ„ μΈ‘μ •ν•˜μ—¬ μ„±λŠ₯ μ΄μŠˆκ°€ λ‚΄μž¬λœ ꡬ간을 μ°ΎλŠ”λ° 도움이 λœλ‹€.

import functools
import time

def timing_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"ν•¨μˆ˜ '{func.__name__}' μ‹€ν–‰ μ‹œκ°„: {end_time - start_time:.4f} 초")
        return result
    return wrapper

@timing_decorator
def example_function(n):
    total = 0
    for i in range(n):
        total += i
    return total

if __name__ == '__main__':
    example_function(10000000)

SQLAlchemy vs SQLModel

SQLAlchemy ORM은 νŒŒμ΄μ¬μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” ORM 라이브러리둜 SQLite 와 같은 λ°μ΄ν„°λ² μ΄μŠ€μ™€ 톡신할 수 μžˆλ‹€ . FastAPI μ—μ„œ μ œκ³΅ν•˜λŠ” SQLModel 은 SQLAlchemy κΈ°λ°˜μ—μ„œ Pydantic 이 κ²°ν•©λœ κΈ°λŠ₯을 μ§€μ›ν•œλ‹€. SQLModel 을 μ œλŒ€λ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” SQLAlchemy λ₯Ό λ¨Όμ € ν•™μŠ΅ν•˜λŠ” 것이 쒋을 것 κ°™λ‹€. λ‹€μŒμ€ AWS IoT Core μ—μ„œ λ°œκΈ‰λ°›μ€ IoT ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ₯Ό μ €μž₯ν•  수 μžˆλŠ” ν…Œμ΄λΈ”μ„ μ •μ˜ν•΄λ³Έ 것이닀.

from datetime import datetime
from sqlmodel import Field, Session, SQLModel, create_engine, Column, LargeBinary
from sqlalchemy.dialects.sqlite import insert


class IoT(SQLModel, table=True):
    __tablename__ = "iot"
    __table_args__ = {"sqlite_autoincrement": True, "comment": "AWS IoT Thing"}

    id: int = Field(default=None, primary_key=True)
    client_id: str = Field(nullable=False, unique=True)
    private_key: bytes = Field(sa_column=Column(LargeBinary, nullable=False))
    cert_pem: bytes = Field(sa_column=Column(LargeBinary, nullable=False))
    ca_cert_pem: bytes | None = Field(sa_column=Column(LargeBinary, nullable=True))
    created_at: datetime = Field(default_factory=lambda: datetime.now(), nullable=False)


engine = create_engine(
    "sqlite:///./db/app.db", echo=True, pool_size=5, pool_recycle=3600
)
SQLModel.metadata.create_all(engine)
session = Session(engine)

stmt = (
    insert(IoT)
    .values(client_id="asdf", private_key=b"", cert_pem=b"")
    .on_conflict_do_nothing()
)
session.exec(stmt)
session.commit()

Pandas vs Polars

파이썬 ν”„λ‘œμ νŠΈμ—μ„œ 데이터 처리 및 뢄석을 μœ„ν•΄ 데이터 ν”„λ ˆμž„μ„ λ‹€λ£¨λŠ” 라이브러리둜 μ „ν†΅μ μœΌλ‘œ νŒλ‹€μŠ€κ°€ μ‚¬μš©λ˜μ—ˆμ§€λ§Œ μ΅œκ·Όμ—λŠ” νŒλ‹€μŠ€μ— 단점인 μ„±λŠ₯ 이슈λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ Rust둜 μž‘μ„±λœ 폴라슀둜 λŒ€μ²΄λ˜μ–΄ μ‚¬μš©λ˜λŠ” 것 κ°™λ‹€. 젯브레인슀 λΈ”λ‘œκ·Έμ—μ„œ κ³΅μœ ν•œ Polars와 pandas 비ꡐ: μ–΄λ–»κ²Œ λ‹€λ₯ΌκΉŒμš”?λ₯Ό μ½μ–΄λ³΄μž.

Seaborn vs Plotly

데이터 λΆ„μ„μ—μ„œ 차트 μ‹œκ°ν™”λŠ” Matplotlib, Seaborn, Plotly 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것 κ°™λ‹€. λ‹€μŒκ³Ό 같이 Polars DataFrame 을 Visualizationν•  수 μžˆλ‹€.

import polars as pl
import plotly.express as px

if __name__ == "__main__":
    df = pl.DataFrame({"category": ["A", "B", "C", "D"], "value": [10, 25, 15, 30]})

    fig = px.bar(
        df, x="category", y="value", title="Polars DataFrame with Plotly Express"
    )
    fig.show()