콘텐츠로 이동

데이터베이스 시스템

SQL 데이터베이스 연결 풀링 및 설정. PostgreSQL, MySQL, SQLite를 지원합니다.

Kind설명
db.sql.postgresPostgreSQL 데이터베이스
db.sql.mysqlMySQL 데이터베이스
db.sql.sqliteSQLite 데이터베이스

표준 데이터베이스 (PostgreSQL, MySQL)

섹션 제목: “표준 데이터베이스 (PostgreSQL, MySQL)”
src/data/_index.yaml
version: "1.0"
namespace: app.data
entries:
- name: main_db
kind: db.sql.postgres
host: "localhost"
port: 5432
database: "myapp"
username: "dbuser"
password: "dbpass"
pool:
max_open: 25
max_idle: 5
max_lifetime: "1h"
options:
sslmode: "disable"
lifecycle:
auto_start: true
- name: cache_db
kind: db.sql.sqlite
file: "/var/data/cache.db" # 인메모리는 :memory: 사용
pool:
max_open: 1
max_idle: 1
max_lifetime: "1h"
options:
cache: "shared"
lifecycle:
auto_start: true
필드타입설명
hoststring데이터베이스 호스트 주소
portint데이터베이스 포트 번호
databasestring데이터베이스 이름
usernamestring데이터베이스 사용자
passwordstring데이터베이스 비밀번호
poolobject연결 풀 설정
optionsmap데이터베이스별 옵션
lifecycleobject라이프사이클 설정
필드타입설명
filestring데이터베이스 파일 경로 또는 :memory:
poolobject연결 풀 설정
optionsmapSQLite별 옵션
lifecycleobject라이프사이클 설정

_env 접미사를 사용하여 환경 변수나 env.variable 엔트리에서 값을 로드:

필드설명
host_env환경 변수에서 호스트
port_env환경 변수에서 포트
database_env환경에서 데이터베이스 이름
username_env환경에서 사용자명
password_env환경에서 비밀번호
- name: prod_db
kind: db.sql.postgres
host_env: "DB_HOST"
port_env: "DB_PORT"
database_env: "DB_NAME"
username_env: "DB_USER"
password_env: "app.secrets:db_password" # env.variable 엔트리 참조
설정에 비밀번호를 직접 입력하지 마세요. 자격 증명에는 환경 변수나 env.variable 엔트리를 사용하세요. 안전한 시크릿 관리는 환경을 참조하세요.

연결 풀링 동작 설정. 풀 설정은 Go의 database/sql 연결 풀에 매핑됩니다.

필드타입기본값설명
max_openint0최대 열린 연결 (0 = 무제한)
max_idleint0최대 유휴 연결 (0 = 무제한)
max_lifetimeduration1h최대 연결 수명
pool:
max_open: 25 # 동시 연결 제한
max_idle: 5 # 5개 연결 준비 상태 유지
max_lifetime: "30m" # 30분마다 연결 재활용
max_idlemax_open 이하로 설정하세요. max_lifetime을 초과하는 연결은 닫히고 교체되어 오래된 연결에서 복구하는 데 도움이 됩니다.

각 데이터베이스 타입은 설정에서 DSN을 구성합니다:

postgres://username:password@host:port/database?sslmode=disable
username:password@tcp(host:port)/database?charset=utf8mb4
file:/path/to/database.db?cache=shared
:memory:?mode=memory

일반적인 데이터베이스별 옵션:

options:
sslmode: "require" # disable, require, verify-ca, verify-full
connect_timeout: "10" # 연결 타임아웃(초)
application_name: "myapp"
options:
charset: "utf8mb4"
parseTime: "true" # 시간 값을 time.Time으로 파싱
loc: "Local" # 시간대
options:
cache: "shared" # shared, private
mode: "rwc" # ro, rw, rwc, memory
_journal_mode: "WAL" # DELETE, TRUNCATE, PERSIST, MEMORY, WAL, OFF
- name: secure_postgres
kind: db.sql.postgres
host: "db.example.com"
port: 5432
database: "production"
username: "app_user"
password: "${DB_PASSWORD}"
pool:
max_open: 50
max_idle: 10
max_lifetime: "1h"
options:
sslmode: "verify-full"
sslcert: "/certs/client.crt"
sslkey: "/certs/client.key"
sslrootcert: "/certs/ca.crt"
lifecycle:
auto_start: true
- name: mysql_replica
kind: db.sql.mysql
host: "replica.db.example.com"
port: 3306
database: "app"
username: "readonly"
password_env: "REPLICA_PASSWORD"
pool:
max_open: 20
max_idle: 5
max_lifetime: "30m"
options:
charset: "utf8mb4"
parseTime: "true"
readTimeout: "30s"
- name: test_db
kind: db.sql.sqlite
file: ":memory:"
pool:
max_open: 1
max_idle: 1
options:
cache: "shared"
mode: "memory"
entries:
# 기본 데이터베이스
- name: users_db
kind: db.sql.postgres
host_env: "USERS_DB_HOST"
port: 5432
database: "users"
username_env: "USERS_DB_USER"
password_env: "USERS_DB_PASSWORD"
lifecycle:
auto_start: true
# 분석 데이터베이스
- name: analytics_db
kind: db.sql.mysql
host_env: "ANALYTICS_DB_HOST"
port: 3306
database: "analytics"
username_env: "ANALYTICS_DB_USER"
password_env: "ANALYTICS_DB_PASSWORD"
lifecycle:
auto_start: true
# 로컬 캐시
- name: cache
kind: db.sql.sqlite
file: "/var/cache/app.db"
lifecycle:
auto_start: true

레지스트리 모듈을 사용하여 런타임에 데이터베이스를 등록할 수 있으며, 애플리케이션 상태나 외부 설정에 따라 동적으로 데이터베이스를 구성할 수 있습니다.

데이터베이스 작업 API는 SQL 모듈을 참조하세요.

  • SQL 모듈 - Lua API 레퍼런스
  • Store - database.sql 기반의 키-값 저장소
  • Queue - SQL 기반 큐 핸들러