이 블로그는 **“군더더기 없는 미니멀리즘과 지속 가능한 $0 운영 비용”**을 목표로 설계되었습니다.

전통적인 동적 CMS(WordPress, Ghost)나 상시 VM 기반 서버는 유휴 시간에도 서버 및 DB 비용이 발생하고, 주기적인 보안 패치와 OS 유지보수가 필요합니다. 반면, 이 블로그는 **정적 사이트 생성(SSG)**과 **서버리스 BaaS(Firestore & Auth)**를 결합하여 유지보수 비용 없이 100% 무중단 글로벌 서비스를 실현했습니다.


1. 전체 시스템 아키텍처

블로그의 전체적인 데이터 흐름과 인프라 구조는 다음과 같습니다:

flowchart TD
    subgraph Client["Client Browser (방문자)"]
        Browser["Web Browser"]
    end

    subgraph Edge["Global Edge Infrastructure"]
        DNS["FreeDNS (chan.h4ck.me)"]
        CDN["Google Cloud Anycast CDN (Firebase Hosting)"]
    end

    subgraph StaticBundle["Static Site Generation (Build-Time)"]
        Astro["Astro 5 SSG Engine"]
        MD["Markdown / MDX Posts"]
        Dist["dist/ (Pure HTML/CSS/JS)"]
    end

    subgraph Serverless["GCP / Firebase Backend"]
        Auth["Firebase Authentication (Google OAuth)"]
        Firestore["Cloud Firestore (Real-time DB)"]
        Rules["Security Rules (Moderation & Validation)"]
    end

    MD --> Astro
    Astro --> Dist
    Dist -->|"npx firebase deploy"| CDN

    Browser -->|"1. DNS Query"| DNS
    DNS -->|"2. Anycast IP (199.36.158.100)"| Browser
    Browser -->|"3. HTTPS Request (0.1s Fast Serve)"| CDN
    CDN -->|"4. Pure HTML/CSS"| Browser

    Browser -->|"5. Real-time onSnapshot Listener"| Firestore
    Browser -->|"6. 1-Click Social Sign-in"| Auth
    Firestore --- Rules

2. 핵심 설계 원칙 및 기술 스택

계층기술 스택도입 이유 & 엔지니어링 이점
Frontend FrameworkAstro 5기본 상태에서 자바스크립트를 전혀 전송하지 않는 Zero-JS by Default 원칙. Lighthouse 100점 달성.
Dynamic IslandsReact 19댓글창처럼 동적 인터랙션이 필수적인 컴포넌트만 부분적으로 하이드레이션(client:visible).
Real-time DatabaseCloud Firestore웹소켓 기반 실시간 리스너(onSnapshot)로 신규 댓글을 새로고침 없이 즉시 수신.
AuthenticationFirebase AuthGoogle OAuth 및 익명 작성을 동시에 지원하여 스팸 방지와 사용자 접근성을 모두 확보.
Hosting & CDNFirebase HostingGoogle Cloud 글로벌 엣지 캐시 및 자동 SSL(Let’s Encrypt / Google Trust Services) 제공.
Domain & DNSFreeDNSA 레코드TXT 레코드 기반 Anycast IP 라우팅.

3. 정적 서빙과 아일랜드 아키텍처 (Islands Architecture)

대부분의 현대 웹 프레임워크(Next.js, Remix, Nuxt)는 화면 전체를 자바스크립트 번들로 감싸 브라우저에서 무거운 Hydration 과정을 거칩니다. 이는 블로그와 같은 읽기 중심(Read-heavy) 사이트에서 심각한 성능 저하와 불필요한 번들 다운로드를 유발합니다.

Astro는 아일랜드 아키텍처를 통해 이 문제를 해결합니다:

graph LR
    subgraph HTML_Document["정적 HTML 문서 (Zero JavaScript)"]
        Header["Header (네비게이션)"]
        Article["Article (마크다운 컴파일 본문)"]
        Footer["Footer (링크 및 저작권)"]
        
        subgraph Island["React Island (client:visible)"]
            CommentsWidget["Comments.tsx (Firestore 실시간 댓글)"]
        end
    end
  • 글 본문 및 레이아웃: 빌드 타임에 완전한 HTML 문자열로 렌더링되어 브라우저에 JS 코드를 1바이트도 보내지 않습니다.
  • 댓글 영역(Comments.tsx): 사용자가 화면을 스크롤하여 댓글 영역에 도달했을 때만(client:visible) React 런타임과 Firebase SDK를 비동기로 로드합니다.

4. 실시간 댓글 및 보안/관리(Moderation) 구조

댓글 시스템은 서버 없이 클라이언트와 Firestore의 직접 통신으로 동작하지만, 엄격한 보안 규칙을 통해 남용을 방지합니다.

4.1. Firestore 데이터 모델

interface CommentItem {
  id: string;
  postSlug: string;          // 게시글 고유 식별자 (예: "how-this-blog-works")
  authorName: string;        // 작성자 닉네임 (익명 또는 구글 닉네임)
  authorUid: string | null;  // 구글 로그인 사용자 UID (익명 시 null)
  authorPhotoUrl?: string;   // 구글 프로필 사진
  isAnonymous: boolean;      // 익명 여부 플래그
  content: string;           // 댓글 본문 (최대 1,000자)
  createdAt: Timestamp;      // 서버 타임스탬프
  isDeleted: boolean;        // 관리자 삭제 여부 (Soft Delete)
}

4.2. 실시간 동기화 (onSnapshot)

// Comments.tsx 핵심 로직
const q = query(
  collection(db, 'comments'),
  where('postSlug', '==', postSlug),
  where('isDeleted', '==', false),
  orderBy('createdAt', 'asc')
);

// 실시간 웹소켓 구독
const unsubscribe = onSnapshot(q, (snapshot) => {
  const list = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
  setComments(list);
});

4.3. Firestore 보안 규칙 (firestore.rules)

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /comments/{commentId} {
      // 1. 누구나 삭제되지 않은 댓글 읽기 가능
      allow read: if true;
      
      // 2. 작성 검증: 1자 이상 1000자 이하, 유효한 작성자명, 삭제플래그 false 강제
      allow create: if request.resource.data.content is string
                    && request.resource.data.content.size() > 0
                    && request.resource.data.content.size() <= 1000
                    && request.resource.data.authorName is string
                    && request.resource.data.authorName.size() <= 50
                    && request.resource.data.isDeleted == false;
      
      // 3. 수정/삭제: 인증된 사용자 또는 관리자만 가능
      allow update, delete: if request.auth != null;
    }
  }
}

5. 비용 분석: 월 0원 ($0.00) 유지 비결

구글 클라우드 플랫폼(GCP)과 Firebase의 Always Free (상시 무료) 티어 내에서 모든 리소스가 충당됩니다:

pie title "월간 무료 제공량 대비 예상 사용률 (%)"
    "Firebase Hosting 전송량 (월 10GB 무료)" : 85
    "Firestore 일일 읽기 (하루 50,000회 무료)" : 10
    "Firestore 일일 쓰기 (하루 20,000회 무료)" : 3
    "Firebase Auth (무제한 무료)" : 2
  1. Firebase Hosting: 월 10GB 스토리지 및 월 360MB/일 대역폭 무료.
  2. Cloud Firestore: 하루 50,000회 읽기, 20,000회 쓰기, 1GB 저장 공간 무료.
  3. FreeDNS: 공용 도메인 네임서버 및 DNS 쿼리 무료.

개인 기술 블로그의 일반적인 트래픽(월 수만 ~ 수십만 페이지뷰) 수준에서는 한 달 운영 비용이 $0.00에 수렴합니다.


6. 결론

Astro와 Firebase의 결합은 현대 웹 개발에서 **“최소한의 복잡성으로 최대한의 성능과 안정성을 얻는 방법”**을 잘 보여줍니다.

  • 서버 장애나 다운타임에 대한 걱정 Zero
  • 데이터베이스 유지보수 및 보안 패치 Zero
  • 매월 청구되는 인프라 비용 Zero

가장 단순하고 견고한 엔지니어링 철학 위에 구축된 블로그입니다.