Skip to Content
API 레퍼런스@asapjs/sequelize@Table 데코레이터

@Table 데코레이터

@Table은 클래스를 Sequelize 모델로 변환하는 클래스 데코레이터입니다. TypeIs 데코레이터가 적용된 필드를 읽어 Sequelize 컬럼 속성으로 자동 등록합니다.

이 페이지에서 찾을 수 있는 것

심볼타입설명
TableClassDecoratorSequelize 모델 정의 데코레이터

임포트

import { Table } from '@asapjs/sequelize';

시그니처

function Table(options: ModelOptions): ClassDecorator

ModelOptions는 Sequelize 고유의 타입입니다. 이 데코레이터는 Sequelize 모델 옵션 객체 전체를 받아 여러 가지 자동 동작을 추가로 적용합니다.

옵션

옵션타입기본값설명
tableNamestring클래스 이름실제 데이터베이스 테이블 이름입니다.
timestampsbooleantruetrue이거나 생략하면 created_atupdated_at 컬럼이 자동으로 추가됩니다. 비활성화하려면 false로 설정하세요.
charsetstring'utf8mb4'항상 utf8mb4로 강제됩니다 — 변경할 수 없습니다.
collatestring'utf8mb4_general_ci'항상 utf8mb4_general_ci로 강제됩니다 — 변경할 수 없습니다.

그 외 모든 ModelOptions 필드(예: paranoid, underscored, indexes)는 Sequelize에 그대로 전달됩니다.

자동 타임스탬프

timestampsfalse로 설정되지 않으면 데코레이터가 다음을 추가합니다:

컬럼매핑 필드Sequelize 옵션
created_atcreatedAttimestamps: true
updated_atupdatedAttimestamps: true

컬럼 이름은 Sequelize의 기본 camelCase 별칭이 아닌 snake_case(created_at, updated_at)를 사용합니다.

내부 동작

  1. getTypesData를 통해 클래스의 모든 TypeIs 데코레이터가 적용된 필드를 읽습니다.
  2. 각 필드를 addAttribute로 Sequelize 컬럼 속성으로 등록합니다(FOREIGNKEY / BELONGSTO 타입의 경우 addForeignKey / addAssociation 사용).
  3. timestamps !== false이면 created_at / updated_at 타임스탬프 옵션을 추가합니다.
  4. DBML 생성 및 콘솔 출력을 위한 테이블 메타데이터를 등록합니다.
  5. sequelize-typescriptsetModelNameaddOptions를 호출하여 모델 등록을 완료합니다.

사용법

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; }

관계형 엔티티 예제

FOREIGNKEYBELONGSTO를 사용하는 일대다 관계 예제입니다:

// 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; }

순환 임포트 방지: FOREIGNKEYBELONGSTOtable 인수는 반드시 썽크(() => Model) 형태로 전달해야 합니다. 모듈 평가 시점에 순환 임포트 문제를 피하기 위함입니다.


관련 항목

Last updated on