Study/Javascript | Typescript | Node.js

[Node.js] typeorm 사용하기

nam-willow 2024. 12. 22. 01:41

1. typeorm과

MySQL을 사용하기 위해서는 MySQL 데이터베이스용 드라이버가 필요합니다.

TypeORM 공식 문서에서 MySQL을 사용할 때 추천하는 드라이버는 mysql2입니다. 따라서 Express.js와 TypeORM, MySQL 조합을 위해서는 다음과 같이 명령어를 입력합니다.

npm install typeorm 

typeorm: TypeScript 기반 ORM

2. reflect-metadata 설치

TypeORM은 TypeScript 데코레이터를 사용할 때 메타데이터를 저장하기 위해 reflect-metadata를 필요로 합니다. 이를 설치하고 프로젝트의 진입점에서 반드시 불러와야 합니다.

npm install typeorm reflect-metadata

3. 타입스크립트 설정

tsconfig.json 파일에서 experimentalDecorators와 emitDecoratorMetadata 옵션이 true로 설정되어 있는지 확인하세요.

   {
     "compilerOptions": {
       // ... 다른 설정들 ...
       "experimentalDecorators": true,
       "emitDecoratorMetadata": true,
       // ... 다른 설정들 ...
     }
   }

구성요소

  • controller
  • service
  • entity

user.entity.ts

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn({ type: "int" })
  id: number;

  @Column({ type: "varchar" })
  email: string;

  @Column({ type: "varchar" })
  name: string;

  @Column({ type: "varchar", nullable: true })
  phone: string;

  @Column({ type: "varchar", nullable: true })
  address: string;

  @Column({ type: "varchar", nullable: true })
  postcode: string;

  @Column({ type: "timestamp", nullable: false })
  createDate: Date;

  constructor(
    id: number,
    email: string,
    name: string,
    phone: string,
    address: string,
    postcode: string,
    createDate: Date
  ) {
    this.id = id;
    this.email = email;
    this.name = name;
    this.phone = phone;
    this.address = address;
    this.postcode = postcode;
    this.createDate = createDate;
  }
}



user-controller.ts

import express, { Request, Response } from "express";
const router = express.Router();
import { services } from "../services/user-services";
import { User } from "../entity/user.entity";

/**
 * 회원가입 엔드포인트
 */
router.post("/user/create", async (req: Request, res: Response) => {
  const body: User = req.body; // 요청 본문을 User 엔티티로 매핑합니다.
  try {
    const result = await services.createUser(body); // 사용자 생성
    res.status(200).json(result); // 생성된 사용자 반환
  } catch (error) {
    console.log("컨트롤러 오류: ", error);
    res.status(400).send(error);
  }
});

// router를 export
export default router;



user-services.ts

import { AppDataSource } from "../database/mysql";
import { User } from "../entity/user.entity";
import { CustomError } from "../../util/error";

export const services = {
  /**
   * 회원가입
   * @param
   */
  createUser: async (body: User) => {

    try {
      const userRepository = AppDataSource.getRepository(User);
      const newUser = userRepository.create(body);
      const savedUser = await userRepository.save(newUser);
      return savedUser;
    } catch (error) {
      const customError = error as CustomError; // Type assertion
      throw { error: customError.code, message: customError.message };
    }
  },
};

Error

{
    "error": "ER_NO_DEFAULT_FOR_FIELD",
    "message": "Field 'name' doesn't have a default value"
}

Success

"Success"