플라스크 앱의 기억 장치, 데이터베이스 설정하기
플라스크 튜토리얼의 두 번째 단계인 Define and Access the Database 페이지에서는 앱에서 데이터를 저장하고 불러오기 위한 SQLite 데이터베이스 연결 방법을 다룹니다. 파이썬에 내장된 sqlite3 모듈을 사용하여 별도의 서버 설치 없이 간편하게 데이터베이스를 구축하는 과정을 배웁니다.
1. 데이터베이스 연결 관리 (db.py)
웹 앱에서는 사용자의 요청(Request)이 올 때마다 데이터베이스에 연결하고, 응답을 보내기 전에 연결을 닫는 과정이 반복됩니다. 이를 효율적으로 관리하기 위해 flaskr/db.py 파일을 생성합니다.
- g 객체: 플라스크가 제공하는 특별한 객체로, 하나의 요청 동안 유지되는 데이터를 저장합니다.
get_db()함수를 통해 데이터베이스 연결을g.db에 저장해두면, 같은 요청 안에서 여러 번 호출해도 매번 새로운 연결을 만들지 않고 재사용할 수 있습니다. - current_app: 현재 실행 중인 플라스크 앱 인스턴스를 가리킵니다. 애플리케이션 팩토리 패턴을 사용 중이므로, 코드 작성 시점에 아직 존재하지 않는 앱 객체 대신 이 변수를 사용하여 설정값에 접근합니다.
2. 테이블 설계 (schema.sql)
데이터를 어떤 형식으로 저장할지 정의하는 단계입니다. 튜토리얼에서는 회원 정보를 저장하는 user 테이블과 게시글을 저장하는 post 테이블을 생성합니다.
| 테이블 | 주요 컬럼 | 역할 |
|---|---|---|
| user | id, username, password | 사용자 식별 및 로그인 정보 저장 |
| post | id, author_id, created, title, body | 게시글 내용 및 작성자(외래 키) 정보 저장 |
3. 초기화 명령 만들기
작성한 SQL 파일을 실행하여 실제 데이터베이스 파일(.sqlite)을 생성하는 기능을 추가합니다.
- init_db:
schema.sql파일을 읽어 데이터베이스에서 실행합니다. - init_db_command: 터미널에서
flask init-db명령어를 입력했을 때 실행될 함수입니다. 사용자에게 "Initialized the database."라는 성공 메시지를 보여줍니다. - sqlite3.Row: 이 설정을 사용하면 데이터베이스에서 가져온 결과를 딕셔너리처럼 이름(column name)으로 접근할 수 있어 코드가 훨씬 읽기 쉬워집니다.
4. 앱에 데이터베이스 등록하기
만든 함수들을 애플리케이션 팩토리에 연결해야 앱이 인식할 수 있습니다. db.py 안에 init_app 함수를 만들고, 이를 __init__.py의 create_app 함수 마지막 부분에서 호출합니다.
# flaskr/db.py
def init_app(app):
app.teardown_appcontext(close_db) # 요청이 끝나면 연결을 자동으로 닫음
app.cli.add_command(init_db_command) # flask 명령어로 실행 가능하게 등록
실전: 데이터베이스 초기화하기
모든 코드를 작성했다면 터미널에서 아래 명령어를 실행하세요. 프로젝트 폴더 안에 실제 데이터베이스 파일이 생성됩니다.
- 명령어:
flask --app flaskr init-db - 결과: 프로젝트의
instance폴더 안에flaskr.sqlite파일이 생깁니다. 이제 데이터를 담을 준비가 끝났습니다.
Official Flask Tutorial: Define and Access the Database
데이터베이스 연결 시 사용되는 teardown_appcontext의 개념을 잘 이해해두면 리소스 누수(Resource Leak)를 방지하는 데 큰 도움이 됩니다.
'Flask' 카테고리의 다른 글
| 앱의 메인 기능 완성, 블로그 블루프린트(Blog Blueprint) (0) | 2026.03.11 |
|---|---|
| 웹 앱에 생동감을 불어넣는 정적 파일(Static Files) 관리 (0) | 2026.03.11 |
| 사용자에게 보여지는 화면, 템플릿(Templates) 구현하기 (0) | 2026.03.05 |
| 앱의 기능을 조직화하는 방법, 블루프린트(Blueprints)와 뷰(Views) (0) | 2026.03.05 |
| 플라스크(Flask) 앱의 심장, '애플리케이션 팩토리' 이해하기 (0) | 2026.03.03 |