데이터베이스 라이프사이클
@asapjs/sequelize가 제공하는 데이터베이스 초기화, 동기화, 헬스 체크 함수입니다.
이 페이지에서 찾을 수 있는 것
| 심볼 | 타입 | 설명 |
|---|---|---|
initSequelizeModule | async function | DB 레이어 전체 초기화 |
getSequelize | function | 전역 Sequelize 인스턴스 접근자 |
modelsSync | async function | 모델-DB 스키마 동기화 |
healthCheck | async function | DB 연결 상태 확인 |
generateDBML | async function | DBML 생성 (placeholder) |
initSequelizeModule()
import { initSequelizeModule } from '@asapjs/sequelize';
const initSequelizeModule = async (dirname: string): Promise<Sequelize>전체 데이터베이스 레이어를 초기화합니다. extensions에 '@asapjs/sequelize'가 있으면 Application.run()이 자동으로 호출합니다. 일반적인 사용에서는 직접 호출할 필요가 없습니다.
파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
dirname | string | 컴파일된 출력 디렉토리의 절대 경로. 모든 하위 디렉토리를 재귀적으로 스캔합니다. |
반환값: Promise<Sequelize> — 초기화된 Sequelize 인스턴스.
초기화 단계
getConfig().db를 읽어dbInit()으로 Sequelize 연결을 생성합니다.- 연결을 인증합니다. 대상 데이터베이스가 존재하지 않는 경우(MySQL
ER_BAD_DB_ERROR), 데이터베이스 이름 없이 임시 연결을 열고CREATE DATABASE IF NOT EXISTS를 실행한 후 재연결합니다. dirname에서*Table.js와*Dto.js에 해당하는 파일을 재귀적으로 스캔합니다.- 검색된 모든
*Table클래스를 Sequelize 모델로 등록합니다(addModels). - 검색된 모든
*Dto클래스를 인스턴스화하고dto.init()을 호출하여 해당 형태를 Swagger 컴포넌트 스키마로 등록합니다.
파일 네이밍 규칙
| 파일명 패턴 | 등록 대상 |
|---|---|
*Table.js / *Table.ts | Sequelize 모델 — Sequelize 인스턴스에 추가 |
*Dto.js / *Dto.ts | DTO 클래스 — Swagger에 스키마 등록 |
.map으로 끝나는 파일은 무시됩니다.
getSequelize()
import { getSequelize } from '@asapjs/sequelize';
const sequelize = getSequelize(); // Sequelize 반환initSequelizeModule이 생성한 전역 Sequelize 인스턴스를 반환합니다. Application.run() 이후 어디서든 이 함수를 호출하여 Sequelize 인스턴스에 접근하고 로우 쿼리, 트랜잭션, 또는 모델에 직접 접근할 수 있습니다.
const sequelize = getSequelize();
await sequelize.transaction(async (t) => {
await UsersTable.create({ name: 'Alice' }, { transaction: t });
await PostsTable.create({ title: 'Hello', user_id: 1 }, { transaction: t });
});modelsSync()
import { modelsSync } from '@asapjs/sequelize';
const modelsSync = async (): Promise<true>등록된 모든 Sequelize 모델을 데이터베이스 스키마와 동기화합니다. Sequelize의 sync({ alter: { drop: false } }) 모드를 사용합니다 — 누락된 컬럼을 추가하고 컬럼 타입을 수정하지만 기존 컬럼이나 테이블을 절대 삭제하지 않습니다. 실행 중인 애플리케이션에서도 안전하게 실행할 수 있습니다.
app.run(async () => {
if (process.env.DB_SYNC === 'true') {
await modelsSync();
}
});alter: { drop: false } 플래그는 모델 정의에서 제거된 컬럼이 데이터베이스에 그대로 남아 있도록 보장하여 우발적인 데이터 손실을 방지합니다.
healthCheck()
import { healthCheck } from '@asapjs/sequelize';
const healthCheck = async (): Promise<true>1초 타임아웃으로 SELECT 1을 실행하여 데이터베이스 연결이 살아있는지 확인합니다. 연결이 초기화되지 않았거나 쿼리가 타임아웃 내에 완료되지 않으면 Error를 던집니다.
import { healthCheck } from '@asapjs/sequelize';
import { Get } from '@asapjs/router';
import { RouterController, ExecuteArgs } from '@asapjs/router';
export default class HealthController extends RouterController {
public basePath = '/health';
public tag = 'Health';
constructor() {
super();
this.registerRoutes();
}
@Get('/', { title: 'Health check', auth: false })
async check({}: ExecuteArgs) {
await healthCheck();
return { status: 'ok' };
}
}generateDBML()
import { generateDBML } from '@asapjs/sequelize';
const generateDBML = async (): Promise<void>참고: 현재 placeholder 구현입니다. 함수 본문이 비어 있습니다(
async () => {}). 향후@Table데코레이터로 등록된 테이블 정보를 기반으로 DBML 출력을 생성할 예정입니다.
관련 항목
- 부트스트랩 —
Application클래스,IConfig.db필드,extensions배열 - @asapjs/sequelize 개요 — 패키지 전체 구조
- Repository — DTO 인식 쿼리 빌딩
- 유틸리티 —
getDBMLData,getConsoleData