1. MikroORM Setup

2020-09-24

MikroOrm은 Data Mapper, Unit of Work, Identity Map pattern에 기반한

Node.js용 TypeScript ORM이다.

yarn add @mikro-orm/core @mikro-orm/cli @mikro-orm/migrations
yarn add @mikro-orm/postgresql pg

설치 후 package.json에 설정을 추가하고

"mikro-orm": {
    "useTsNode":true,
    "configpaths": [
        "./src/mikro-orm.config.ts",
        "./dist/mikro-orm.config.js"
    ]
}

mikro-orm.config.ts파일을 생성한다.

1.

index.ts

import { MikroORM } from "@mikro-orm/core";

const main = async () => {
  const orm = await MikroORM.init({
    migrations: {
      path: path.join(__dirname, "./migrations"),
      pattern: /^[\w-]+\d+\.[tj]s$/,
    },
    entities: [], //psql로 정의한 테이블
    dbName: "testdb1",
    user: "postgres",
    password: "postgres",
    type: "postgresql",
    debug: !__prod__,
  });
};

constants.ts

export const __prod__ = process.env.NODE_ENV === "production";

debug 옵션을 true로 설정하면 MikroOrm은 console.log()를

사용해 모든 쿼리를 dump한다.

mikro-orm.config.ts

export default {
  migrations: {
    path: path.join(__dirname, "./migrations"),
    pattern: /^[\w-]+\d+\.[tj]s$/,
  },
  entities: [Post, User],
  dbName: "testdb1",
  user: "postgres",
  password: "postgres",
  type: "postgresql",
  debug: !__prod__,
} as Parameters<typeof MikroORM.init>[0];

MikroOrm.init의 parm을 mikro-orm.config.ts로 옮긴다.

index.ts

import mikroConfig from "./mikro-orm.config";
const main = async () => {
  const orm = await MikroORM.init(mikroConfig);
  await orm.getMigrator().up();
};

2.

entities/Post.ts

@ObjectType()
@Entity() //mikroOrm에게 entity임을 알려줌
export class Post {
  @Field()
  //decorator @Field로 테이블의 속성을 정의한다.
  @PrimaryKey()
  id!: number;

  @Field(() => String)
  @Property({ type: "date" })
  createdAt = new Date();

  @Field(() => String)
  @Property({ type: "date", onUpdate: () => new Date() })
  updatedAt = new Date();

  @Field()
  @Property({ type: "text" })
  title!: string;
}

MikroORM.init의 entities:[]에 Post를 추가 후

migration:create를 실행하면 postgresql에 반영되고

migration 폴더에 query log 파일이 생성된다.

npx mikro-orm migration:create