TyporM을 사용하여 Express+Docker+MySQL 환경 구축

Typerom은 Type script용 OR 맵입니다.Typerom을 사용하여 Express+Docker+MySQL 환경 구축에서 마이그레이션으로 진행합니다.
OS는 Mac을 사용합니다.노드, Yarn 및 Docker가 이미 설치되어 있어야 합니다.처리 도구 등의 버전은 다음과 같습니다.
Node
Yarn
Express
TypeScript
MySQL
16.4.2
1.22.11
4.17.1
4.4.3
5.7.10

환경 구조


프로젝트 폴더를 작성합니다.
❯ mkdir typeorm-sample
❯ cd typeorm-sample
TypeORM을 설치합니다.
❯ yarn add typeorm
노드에 TypeScript를 사용하려면 typescript와 ts-node를 설치합니다.
❯ yarn add -D typescript ts-node
typerominit 명령을 사용하여 TypeORM 사용에 필요한 파일을 생성합니다.MySQL 및 Express, Docker를 추가합니다.
❯ yarn typeorm init --database mysql --express --docker
Project created inside current directory.
파일을 확인한 후 docker-compose.yml이 생성되었습니다.docker-compose.yml의 내용을 보고 mysql5.7의 이미지를 설정했기 때문에 그렇게 사용합니다.
❯ ls
README.md          ormconfig.json     src
docker-compose.yml package-lock.json  tsconfig.json
node_modules       package.json       yarn.lock

부팅


MySQL을 사용하여 Docker를 시작합니다.
❯ docker compose up
docker-compose.yml에 기록된 정보를 확인한 후 MySQL에 연결합니다.
❯ docker compose exec mysql /bin/bash
❯ mysql -utest -ptest
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)
접속이 확인되었습니다.
이어서 서버를 시작합니다.
❯ yarn
❯ yarn start
yarn run v1.22.11
warning package.json: No license field
$ ts-node src/index.ts
Express server has started on port 3000. Open http://localhost:3000/users to see results
http://localhost:3000/users를 방문하면 다음 JSON이 화면에 표시됩니다.
[{"id":1,"firstName":"Timber","lastName":"Saw","age":27},{"id":2,"firstName":"Phantom","lastName":"Assassin","age":24}]
이것은 yarn typeorm init시 user표와 관련된 데이터를 기본적으로 만들었기 때문입니다.
mysql> show columns from user;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| firstName | varchar(255) | NO   |     | NULL    |                |
| lastName  | varchar(255) | NO   |     | NULL    |                |
| age       | int(11)      | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

테이블 작성


그런 다음 TypeORM의 마이그레이션 기능을 사용하여 테이블을 만듭니다.

Enity 생성


Enity를 먼저 정의합니다.Enity는 표 구조를 클래스 문법으로 표현합니다.이번에는 토도 리스트를 소재로 필요한 열을 준비했다.
TODO를 저장하려면 테이블의 정의는 다음과 같습니다.
표 이름:task
열 논리 이름
열 물리적 이름
타입
ID
task_id
integer
타이틀
title
varchar
일자
due_date
date
컨디션
status
tinyint
만든 날짜
created_at
datetime
업데이트 날짜
updated_at
datetime
이를 토대로 Enity를 씁니다.
src/entity/Task.ts
import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';

@Entity()
export class Task {
  @PrimaryGeneratedColumn()
  readonly task_id: number;

  @Column('varchar', { length: 20, nullable: false })
  title: string;

  @Column('date', { nullable: false })
  due_date: Date;

  @Column('tinyint', { width: 1, default: 1 })
  status: number;

  @CreateDateColumn()
  readonly created_at?: Date;

  @UpdateDateColumn()
  readonly updated_at?: Date;
}
Enity 쓰기 방법은 다음을 참조하십시오.
https://github.com/typeorm/typeorm/blob/master/docs/entities.md

마이그레이션 파일 만들기


마이그레이션 파일을 만듭니다.
- n은 파일 이름을 지정하는 필수 매개 변수입니다.
❯ yarn ts-node node_modules/.bin/typeorm migration:generate -n Task
실행 후 src/migration/1635378767371-Task.ts와 같이 파일을 생성합니다.1635378767371의 부분은 시간 스탬프입니다.
src/migration/1635378767371-Task.ts
import {MigrationInterface, QueryRunner} from "typeorm";

export class Task1635378767371 implements MigrationInterface {
    name = 'Task1635378767371'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`CREATE TABLE \`task\` (\`task_id\` int NOT NULL AUTO_INCREMENT, \`title\` varchar(20) NOT NULL, \`due_date\` date NOT NULL, \`status\` tinyint(1) NOT NULL DEFAULT '1', \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (\`task_id\`)) ENGINE=InnoDB`);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`DROP TABLE \`task\``);
    }

}
  • up 방법: 실제 이전할 때 실행하는 조회
  • down 방법: 롤백을 이동할 때 사용하는 조회
  • 마이그레이션 수행


    ❯ yarn ts-node node_modules/.bin/typeorm migration:run
    
    반영된 마이그레이션을 확인합니다.
    ❯ yarn ts-node node_modules/.bin/typeorm migration:show
    
    [X] Task1635378767371
    ✨  Done in 1.53s.
    
    이전 마이그레이션을 스크롤하려면 다음 명령을 실행합니다.
    ❯ yarn ts-node node_modules/.bin/typeorm migration:revert
    
    혹시 모르니까 MySQL에 연결해서task표 열 일람을 확인하고 문제 없이 만들었어요.
    mysql> show columns from task\G
    *************************** 1. row ***************************
      Field: task_id
       Type: int(11)
       Null: NO
        Key: PRI
    Default: NULL
      Extra: auto_increment
    *************************** 2. row ***************************
      Field: title
       Type: varchar(20)
       Null: NO
        Key: 
    Default: NULL
      Extra: 
    *************************** 3. row ***************************
      Field: due_date
       Type: date
       Null: NO
        Key: 
    Default: NULL
      Extra: 
    *************************** 4. row ***************************
      Field: status
       Type: tinyint(1)
       Null: NO
        Key: 
    Default: 1
      Extra: 
    *************************** 5. row ***************************
      Field: created_at
       Type: datetime(6)
       Null: NO
        Key: 
    Default: CURRENT_TIMESTAMP(6)
      Extra: 
    *************************** 6. row ***************************
      Field: updated_at
       Type: datetime(6)
       Null: NO
        Key: 
    Default: CURRENT_TIMESTAMP(6)
      Extra: on update CURRENT_TIMESTAMP(6)
    6 rows in set (0.00 sec)
    
    이상.

    참고 자료


    https://typeorm.io/#/

    좋은 웹페이지 즐겨찾기