ORM (Object Relational Mapping)
: ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ๋งคํํด์ฃผ๋ ๊ฒ
sequelize
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์ฌ๊ธฐ์๋ sequelize-typescript
๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค
We recommend using
sequelize-typescript
to bridge the gap until our improvements are ready to be released.-- sequelize ๊ณต์๋ฌธ์ ๋ฐ์ท
npm install --save-dev @types/node @types/validator
npm install sequelize reflect-metadata sequelize-typescript
"target": "es6",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
// db_config.ts
import dotenv from "dotenv";
dotenv.config(); // .env ํ์ผ์ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ก๋
const { DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE } = process.env;
const db_config = {
dialect: "mysql" as const, // TypeScript์๊ฒ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์์ ์๋ ค์ค
host: DB_HOST,
username: DB_USER,
password: DB_PASSWORD,
database: DB_DATABASE,
timezone: "+09:00", // ํ๊ตญ์๊ฐ
};
export default db_config;
// connection.ts
import { Sequelize } from "sequelize-typescript";
import db_config from "../config/db_config";
const sequelize = new Sequelize({
...db_config,
models: [__dirname + "/*Model.ts"],
modelMatch: (filename, member) => {
return filename.substring(0, filename.indexOf("Model")) === member;
},
});
export default sequelize;
// index.ts
app.listen(app.get("port"), async () => {
console.log("Express server listening on port " + app.get("port"));
// ์ฐ๊ฒฐ ํ
์คํธ
try {
await sequelize.authenticate();
console.log("Connection has been established successfully.");
} catch (error) {
console.error("Unable to connect to the database:", error);
}
});
sequelize-typescript
์์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ์ ์ํ ์ ์๋ค// userModel.ts
import { Table, Column, Model, DataType, HasMany } from "sequelize-typescript";
@Table({ tableName: "user" })
export class User extends Model {
@Column({
type: DataType.INTEGER,
autoIncrement: true,
primaryKey: true,
})
id!: number;
@Column({
type: DataType.STRING,
allowNull: false,
})
email!: string;
@Column({
type: DataType.STRING,
allowNull: false,
})
name!: string;
@Column({
type: DataType.STRING,
allowNull: false,
})
password!: string;
@Column({
type: DataType.DATE,
allowNull: false,
})
createdAt!: Date;
@Column({
type: DataType.DATE,
allowNull: false,
})
updatedAt!: Date;
@Column({
type: DataType.BOOLEAN,
allowNull: false,
})
del!: boolean;
@HasMany(() => Friend)
friends!: Friend[]; // User, Friend -> 1:N ๊ด๊ณ ์ค์
}
// friendModel.ts
import {
Table,
Column,
Model,
DataType,
ForeignKey,
} from "sequelize-typescript";
import { User } from "../models/userModel";
@Table({ tableName: "friends" })
export class Friend extends Model {
@ForeignKey(() => User)
@Column({
type: DataType.INTEGER,
allowNull: false,
})
user_id!: number;
@Column({ type: DataType.INTEGER })
friend_id!: number;
@Column({
type: DataType.BOOLEAN,
allowNull: false,
defaultValue: 0,
})
status!: boolean;
}
sequelize init
์ผ๋ก ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ์ง ์์ ๊ฒฝ์ฐ sequelize-cli
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ๋ ๊ฒฝ๋ก๋ฅผ ํ์
ํ ์ ์๋ค -> .sequelizerc
์ ๊ฐ์ ์ค์ ํ์ผ์ ํตํด ๊ฒฝ๋ก๋ฅผ ๋งค์นญ์์ผ์ฃผ์ด์ผ ํ๋ค
npm i @babel/core @babel/register @babel/preset-env @babel/preset-typescript @babel/runtime @babel/plugin-transform-runtime typescript
.babelrc
ํน์ babel.config.json
ํ์ผ์ ์ค์ ์ถ๊ฐ
{
"presets": ["@babel/preset-env", "@babel/preset-typescript"],
"plugins": ["@babel/plugin-transform-runtime"]
}
// .sequelizerc
// Sequelize CLI๊ฐ ์คํ๋๋ ๋์ TypeScript ํ์ผ์ ์ธ์ํ๊ณ ์ปดํ์ผํ ์ ์๋๋ก ์ค์ ํ๊ธฐ ์ํจ
require("@babel/register")({
configFile: "./.babelrc",
extensions: [".js", ".ts"],
});
const path = require('path');
module.exports = {
'config': path.resolve('config', 'config.js'), // ํ์ฅ์๋ json ํน์ js
'models-path': path.resolve('db', 'models'),
'seeders-path': path.resolve('db', 'seeders'),
'migrations-path': path.resolve('db', 'migrations')
};
์ฐธ๊ณ ํ ๊ฒ
https://www.npmjs.com/package/sequelize-cli
https://hoontae24.github.io/17
modelํ์ผ์์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฐ์
@Column({
^
TypeError: Cannot convert undefined or null to object
tsconfig.json์ ์ค์ ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค
{
"compilerOptions": {
"experimentalDecorators": true, // ๋ฐ์ฝ๋ ์ดํฐ ๋ฌธ๋ฒ ์ฌ์ฉ ํ์ฉ
"emitDecoratorMetadata": true // ๋ฐ์ฝ๋ ์ดํฐ ๋ฉํ๋ฐ์ดํฐ ์์ฑ
}
}
npm sequelize-typescript
sequelize ๊ณต์ ๋ฌธ์
https://stackoverflow.com/questions/76105765/typeerror-in-sequelize-typescript-model