기본 콘텐츠로 건너뛰기

추천 가젯

리액트 + 비트(Vite)로 모바일 청첩장 만들기 — 2편

모바일 청첩장 시리즈 2편 · R2 갤러리 & Firebase 방명록 Cloudflare R2 · Functions Firebase Firestore 클라우드플레어 R2로 갤러리 저장하고, Firebase로 방명록 달기 안녕하세요, 병민입니다 🙌 1편에서 전체 흐름을 잡았고, 이번엔 사진 업로드/보관 과 방명록 을 연결합니다. 서버는 따로 없고 Cloudflare Pages 를 쓰고 있으니, Pages Functions (= 워커)로 R2에 사전서명 URL을 만들어주고, 프론트에서 그 URL로 바로 업로드하는 구조예요. 방명록은 Firebase DB로 간단·안전하게! 전체 그림 프론트(React) → /api/r2/upload 로 업로드용 URL 요청 → R2에 파일 PUT 프론트(React) → /api/r2/list 로 목록 요청 → 갤러리 렌더 프론트(React) → Firebase SDK로 방명록 작성/조회 1) R2 버킷 & Pages Functions 준비 Cloudflare 대시보드 > R2 > Create bucket (예: wedding-gallery ) 버킷 > Settings > CORS 에서 사이트 도메인 허용(예: https://*.pages.dev , 커스텀 도메인) Pages 프로젝트 > Settings > Functions 에서 R2 바인딩 추가: ...

📝 dataclasses로 데이터 구조 쉽게 정의하기

Dataclass icon

📝 dataclasses로 데이터 구조 쉽게 정의하기

dataclasses는 Python 3.7부터 도입된 모듈로, 생성자, 비교, 표현식 등을 자동 생성해 클래스를 간결하고 명료하게 정의할 수 있게 합니다. 아래 예제들로 핵심 기능을 살펴보실 수 있어요.

✅ 1. 기본 dataclass 정의와 자동 생성 기능

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

u = User("홍길동", 30)
print(u)  # User(name='홍길동', age=30)
  • ✨ `__init__`, `__repr__`, `__eq__` 등 기본 메서드가 자동으로 만들어집니다.

✅ 2. 기본값, 타입 힌트, 필드 옵션 설정

from dataclasses import dataclass, field

@dataclass
class Article:
    title: str
    body: str = ""
    tags: list[str] = field(default_factory=list)
    views: int = 0

a = Article("데이터 클래스 예제")
print(a)  # fields default properly initialized
  • ⚠ `default_factory`는 mutable 타입 필드에 안전하게 사용 가능합니다.

✅ 3. `__post_init__()`으로 추가 초기화 처리

from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float
    norm: float = 0.0

    def __post_init__(self):
        self.norm = (self.x**2 + self.y**2) ** 0.5

p = Point(3, 4)
print(p.norm)  # 5.0
  • 계산 필드나 검증 로직을 `__post_init__()`으로 넣으면 구조가 더 깔끔해집니다.

✅ 4. 비교, 정렬, 변경 불가능 클래스 만들기

from dataclasses import dataclass

@dataclass(order=True, frozen=True)
class Item:
    price: float
    name: str

i1 = Item(9.99, "A")
i2 = Item(5.00, "B")
print(i1 > i2)  # True
# i1.price = 10  # dataclass is frozen → error
  • `order=True`은 <, > 연산자까지 자동 제공, `frozen=True`는 불변 객체를 만듭니다.

✅ 5. 직렬화 대응: `asdict()`와 `astuple()`

from dataclasses import asdict, astuple

u = User("영희", 28)
print(asdict(u))   # {'name':'영희','age':28}
print(astuple(u))  # ('영희', 28)
  • 쉽게 JSON 변환이나 DB 저장 포맷으로 변환할 수 있어 편리합니다.

✨ 요약 & 활용 팁

  • 생성자, 비교, 표현식을 자동으로 해주어 코드가 간결해짐
  • 기본값, mutable 필드, 추가 초기화 등을 쉽게 처리
  • 정렬 가능하고 불변 객체(frozen)도 손쉽게 설정
  • `asdict()`/`astuple()`로 직렬화 변환이 매우 편리
  • 실무: 설정 객체, 요청/응답 데이터, 결과 엔터티 정의에 폭넓게 사용 가능

댓글

가장 많이 본 글

Icons by Flaticon