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 | 무료 (개인 프로젝트) |
| DB | Supabase | 무료 (500MB) |
| 이미지/파일 | Supabase Storage | 무료 (1GB) |
| CDN | Vercel Edge 자동 적용 | 무료 |
월 유지비 $0~5 수준에서 운영 가능합니다.
프로젝트 구조
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 연동
# 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 처리
# 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 블로그 포스트
// app/(public)/posts/[slug]/page.tsx
// 빌드 타임에 정적 생성 → CDN 캐싱 → 초고속 로딩
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map(post => ({ slug: post.slug }))
}
마이그레이션 전략 (기존 Supabase 데이터 보존)
- DB 스키마는 그대로 — PostgreSQL은 유지하므로 데이터 이전 불필요
- API 먼저 — FastAPI로 기존 기능 재구현 후 Next.js 연결
- 점진적 전환 — 기존 Spring Boot 블로그 유지하면서 새 스택을 별도 도메인에서 개발
- 도메인 스왑 — 완성 후 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인 개발자가 장기간 유지보수할 수 있는 가장 현실적인 조합입니다.