프로젝트

1인 운영 블로그 기술 스택 추천 (FastAPI 기반)

2026년 3월 5일

1인 운영 블로그 기술 스택 추천 (FastAPI 기반)

핵심 원칙: 단순함 > 완벽함

1인 운영에서 가장 큰 적은 유지보수 복잡도입니다. 기술 스택 선택 기준을 "내가 새벽 2시에 장애 나도 15분 안에 고칠 수 있는가?"로 잡아야 합니다.


추천 스택

Backend

FastAPI + SQLAlchemy 2.0 (async) + Alembic (마이그레이션)

Spring Boot 대비 코드량이 1/3 수준이고, 자동 Swagger 문서가 생성됩니다. Pydantic v2로 타입 안정성도 충분히 확보됩니다.

Database

Supabase (PostgreSQL) 유지 — 기존 자산을 그대로 활용하세요. Supabase의 Auth, Storage, Realtime 기능을 FastAPI에서 직접 연동하면 별도 인증 서버가 필요 없습니다.

Frontend

Next.js 14 (App Router) + Tailwind CSS

Thymeleaf 서버사이드 렌더링을 버리고 Next.js로 전환하면 SEO(SSR/SSG), 이미지 최적화, 캐싱을 프레임워크가 처리해줍니다. Tailwind는 기존 지식을 그대로 씁니다.

인증

Supabase Auth — JWT를 FastAPI 미들웨어에서 검증하는 방식으로 구현합니다. OAuth(구글, 깃허브)도 설정 몇 줄로 끝납니다.

배포 인프라

구성요소서비스비용
FastAPI 백엔드Railway 또는 Render무료 ~ $5/월
Next.js 프론트Vercel무료 (개인 프로젝트)
DBSupabase무료 (500MB)
이미지/파일Supabase Storage무료 (1GB)
CDNVercel Edge 자동 적용무료

월 유지비 $0~5 수준에서 운영 가능합니다.


프로젝트 구조

code
blog/
├── backend/                 # FastAPI
│   ├── app/
│   │   ├── api/
│   │   │   └── v1/
│   │   │       ├── posts.py
│   │   │       ├── auth.py
│   │   │       └── comments.py
│   │   ├── core/
│   │   │   ├── config.py    # 환경변수 (pydantic-settings)
│   │   │   ├── database.py  # SQLAlchemy async engine
│   │   │   └── security.py  # JWT 검증
│   │   ├── models/          # SQLAlchemy ORM 모델
│   │   ├── schemas/         # Pydantic 스키마
│   │   └── main.py
│   ├── alembic/
│   └── requirements.txt
│
└── frontend/                # Next.js
    ├── app/
    │   ├── (public)/        # 블로그 독자 페이지
    │   │   ├── page.tsx     # 메인
    │   │   └── posts/[slug]/
    │   └── admin/           # 관리자 페이지 (작성/편집)
    ├── components/
    └── lib/
        └── api.ts           # FastAPI 호출 클라이언트

핵심 구현 패턴

FastAPI + Supabase Auth 연동

python
# core/security.py
from fastapi import HTTPException, Depends
from fastapi.security import HTTPBearer
from supabase import create_client
import jwt

security = HTTPBearer()

async def get_current_user(token = Depends(security)):
    try:
        payload = jwt.decode(
            token.credentials,
            options={"verify_signature": False}  # Supabase가 서명 관리
        )
        return payload
    except Exception:
        raise HTTPException(status_code=401)

비동기 DB 처리

python
# database.py
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession

engine = create_async_engine(
    settings.DATABASE_URL.replace("postgresql://", "postgresql+asyncpg://"),
    pool_size=5,  # 1인 블로그엔 충분
    echo=False
)

Next.js 서버 컴포넌트로 SSG 블로그 포스트

typescript
// app/(public)/posts/[slug]/page.tsx
// 빌드 타임에 정적 생성 → CDN 캐싱 → 초고속 로딩
export async function generateStaticParams() {
  const posts = await getPosts()
  return posts.map(post => ({ slug: post.slug }))
}

마이그레이션 전략 (기존 Supabase 데이터 보존)

  1. DB 스키마는 그대로 — PostgreSQL은 유지하므로 데이터 이전 불필요
  2. API 먼저 — FastAPI로 기존 기능 재구현 후 Next.js 연결
  3. 점진적 전환 — 기존 Spring Boot 블로그 유지하면서 새 스택을 별도 도메인에서 개발
  4. 도메인 스왑 — 완성 후 DNS 전환으로 무중단 이전

1인 운영 시 반드시 챙길 것

모니터링: Vercel Analytics(무료) + Sentry 무료 플랜으로 에러 추적

백업: Supabase 자동 백업(7일) + GitHub Actions로 주 1회 pg_dump를 S3에 저장

CI/CD: GitHub Actions → Vercel/Railway 자동 배포. PR 머지하면 배포까지 자동화

콘텐츠: MDX 기반 마크다운 에디터를 관리자 페이지에 붙이거나, Notion을 CMS로 활용하고 Notion API로 연동하면 글쓰기 경험이 크게 향상됩니다.


결론

기존 스택과 비교하면 Spring Boot → FastAPI로 백엔드 복잡도를 대폭 낮추고, Thymeleaf → Next.js로 프론트를 분리해 각자의 역할에 집중하는 구조입니다. Supabase는 그대로 유지해 기존 데이터와 인프라 투자를 보존합니다. 1인 개발자가 장기간 유지보수할 수 있는 가장 현실적인 조합입니다.