백엔드 기초집: Python FastAPILESSON 19
PostgreSQL로 데이터베이스 확장
난이도초급
예상 시간35분
선수지식이전 강의
19강. PostgreSQL로 데이터베이스 확장
1. 이번 강의에서 해결할 문제
SQLite는 학습과 단일 프로세스 개발에 편하지만 운영의 동시 연결, 계정, 서버 관리 요구를 대신하지 않습니다. PostgreSQL 환경으로 같은 앱을 실행합니다.
2. 학습 목표
3. 핵심 개념
SQLAlchemy dialect가 DB별 SQL과 DBAPI 차이를 연결합니다. Psycopg 3의 동기 연결 URL은 postgresql+psycopg://사용자:비밀번호@호스트:포트/DB입니다. 비밀번호에 특수문자가 있으면 URL 인코딩이 필요하며 실제 운영 연결은 TLS와 최소 권한 계정을 사용합니다.
4. 단계별 코드 예시
파일 경로: game-ranking-api/.env.postgresql.example
.env.postgresql.example
APP_ENV=production
DATABASE_URL=postgresql+psycopg://game_api:change-me@localhost:5432/game_ranking
JWT_SECRET=replace-with-at-least-32-random-bytes
ACCESS_TOKEN_EXPIRE_MINUTES=30
FRONTEND_ORIGINS=https://example.com
파일 경로: game-ranking-api/app/database.py
app/database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.config import settings
connect_args = {"check_same_thread": False} if settings.database_url.startswith("sqlite") else {}
engine = create_engine(
settings.database_url,
connect_args=connect_args,
pool_pre_ping=True,
)
SessionLocal = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False)
실행 위치: PostgreSQL의 psql이 설치된 터미널
psql -U postgres -c "CREATE USER game_api WITH PASSWORD 'change-me';"
psql -U postgres -c "CREATE DATABASE game_ranking OWNER game_api;"
$env:DATABASE_URL = 'postgresql+psycopg://game_api:change-me@localhost:5432/game_ranking'
$env:JWT_SECRET = 'development-only-change-me'
python -m uvicorn app.main:app --reload
Invoke-RestMethod http://127.0.0.1:8000/health
5. 코드가 동작하는 이유
동일한 Engine 생성 코드가 URL scheme을 보고 PostgreSQL dialect와 Psycopg 3 DBAPI를 선택합니다. SQLite 전용 connect_args는 조건부로만 전달됩니다. pool_pre_ping은 풀에서 꺼낸 오래된 연결을 사용하기 전에 확인합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2PostgreSQL로 데이터베이스 확장 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
19강. PostgreSQL로 데이터베이스 확장 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.