@Table 데코레이터
@Table은 클래스를 Sequelize 모델로 변환하는 클래스 데코레이터입니다. TypeIs 데코레이터가 적용된 필드를 읽어 Sequelize 컬럼 속성으로 자동 등록합니다.
이 페이지에서 찾을 수 있는 것
| 심볼 | 타입 | 설명 |
|---|---|---|
Table | ClassDecorator | Sequelize 모델 정의 데코레이터 |
임포트
import { Table } from '@asapjs/sequelize';시그니처
function Table(options: ModelOptions): ClassDecoratorModelOptions는 Sequelize 고유의 타입입니다. 이 데코레이터는 Sequelize 모델 옵션 객체 전체를 받아 여러 가지 자동 동작을 추가로 적용합니다.
옵션
| 옵션 | 타입 | 기본값 | 설명 |
|---|---|---|---|
tableName | string | 클래스 이름 | 실제 데이터베이스 테이블 이름입니다. |
timestamps | boolean | true | true이거나 생략하면 created_at과 updated_at 컬럼이 자동으로 추가됩니다. 비활성화하려면 false로 설정하세요. |
charset | string | 'utf8mb4' | 항상 utf8mb4로 강제됩니다 — 변경할 수 없습니다. |
collate | string | 'utf8mb4_general_ci' | 항상 utf8mb4_general_ci로 강제됩니다 — 변경할 수 없습니다. |
그 외 모든 ModelOptions 필드(예: paranoid, underscored, indexes)는 Sequelize에 그대로 전달됩니다.
자동 타임스탬프
timestamps가 false로 설정되지 않으면 데코레이터가 다음을 추가합니다:
| 컬럼 | 매핑 필드 | Sequelize 옵션 |
|---|---|---|
created_at | createdAt | timestamps: true |
updated_at | updatedAt | timestamps: true |
컬럼 이름은 Sequelize의 기본 camelCase 별칭이 아닌 snake_case(created_at, updated_at)를 사용합니다.
내부 동작
getTypesData를 통해 클래스의 모든TypeIs데코레이터가 적용된 필드를 읽습니다.- 각 필드를
addAttribute로 Sequelize 컬럼 속성으로 등록합니다(FOREIGNKEY/BELONGSTO타입의 경우addForeignKey/addAssociation사용). timestamps !== false이면created_at/updated_at타임스탬프 옵션을 추가합니다.- DBML 생성 및 콘솔 출력을 위한 테이블 메타데이터를 등록합니다.
sequelize-typescript의setModelName과addOptions를 호출하여 모델 등록을 완료합니다.
사용법
import { Model } from 'sequelize-typescript';
import { Table, TypeIs } from '@asapjs/sequelize';
@Table({
tableName: 'users',
timestamps: true,
})
export default class UsersTable extends Model {
@TypeIs.INT({ primaryKey: true, autoIncrement: true, comment: 'User ID' })
id: number;
@TypeIs.STRING({ unique: true, comment: 'Email (unique)' })
email: string;
@TypeIs.PASSWORD({ comment: 'Password (bcrypt)' })
password: string;
@TypeIs.STRING({ comment: 'Display name' })
name: string;
@TypeIs.DATETIME({ comment: 'Created at' })
created_at: Date;
@TypeIs.DATETIME({ comment: 'Updated at' })
updated_at: Date;
}타임스탬프를 비활성화하려면:
@Table({ tableName: 'audit_logs', timestamps: false })
export default class AuditLogsTable extends Model {
@TypeIs.STRING({ comment: 'Log message' })
message: string;
}관계형 엔티티 예제
FOREIGNKEY와 BELONGSTO를 사용하는 일대다 관계 예제입니다:
// src/user/domain/entity/UsersTable.ts
import { Model } from 'sequelize-typescript';
import { Table, TypeIs } from '@asapjs/sequelize';
@Table({
tableName: 'users',
timestamps: true,
})
export default class UsersTable extends Model {
@TypeIs.INT({ primaryKey: true, autoIncrement: true, comment: 'User ID' })
id: number;
@TypeIs.STRING({ unique: true, comment: 'Email (unique)' })
email: string;
@TypeIs.PASSWORD({ comment: 'Password (bcrypt)' })
password: string;
@TypeIs.STRING({ comment: 'Display name' })
name: string;
@TypeIs.DATETIME({ comment: 'Created at' })
created_at: Date;
@TypeIs.DATETIME({ comment: 'Updated at' })
updated_at: Date;
}// src/post/domain/entity/PostsTable.ts
import { Model } from 'sequelize-typescript';
import { Table, TypeIs } from '@asapjs/sequelize';
import UsersTable from '../../../user/domain/entity/UsersTable';
@Table({
tableName: 'posts',
timestamps: true,
})
export default class PostsTable extends Model {
@TypeIs.INT({ primaryKey: true, autoIncrement: true, comment: 'Post ID' })
id: number;
@TypeIs.STRING({ comment: 'Post title' })
title: string;
@TypeIs.TEXT({ comment: 'Post content' })
content: string;
// 외래 키 컬럼 — 정수 컬럼 생성 및 FK 제약 등록
@TypeIs.FOREIGNKEY({ table: () => UsersTable, comment: 'Author user ID' })
user_id: number;
// 연관 — 컬럼 없음, BelongsTo 관계 등록
@TypeIs.BELONGSTO(() => UsersTable, 'user_id')
user: UsersTable;
@TypeIs.DATETIME({ comment: 'Created at' })
created_at: Date;
@TypeIs.DATETIME({ comment: 'Updated at' })
updated_at: Date;
}순환 임포트 방지:
FOREIGNKEY와BELONGSTO의table인수는 반드시 썽크(() => Model) 형태로 전달해야 합니다. 모듈 평가 시점에 순환 임포트 문제를 피하기 위함입니다.
관련 항목
- TypeIs 기본 타입 — 숫자, 문자열, 불리언, 날짜 컬럼 타입
- TypeIs 관계 타입 — FOREIGNKEY, BELONGSTO
- 데이터베이스 라이프사이클 —
initSequelizeModule이*Table파일을 스캔하는 방법
Last updated on