Javascript | Typescript/Node.js

TypeORM 간단 사용법

devMarco 2020. 8. 2. 17:39

평소 백엔드 개발할 때 자체적으로 개발한 쿼리빌더와 raw Query를 활용해 모델을 개발해왔다. 그러나, 쿼리를 직접 자주 짜야하며, 쿼리용 모듈을 코딩하는 번거로움이 있어서 ORM을 사용하면 코드치는 양을 줄임으로써 이러한 불편함을 극복할 수 있지 않을까 생각했다. 간단한 쿼리들은 ORM으로 빠르게 작업하고, ORM으로 커버되지 않는 복잡한 쿼리에 대해서만 raw Query로 대응하는 것이다. ORM 도입을 검토하고자 typescript + node.js의 대표적인 ORM인 typeORM과 Sequelize를 간단하게 사용해보며 비교해보기로 했다. 이번 포스팅에서는 그중 typeORM에 대해서 다루어보았다.


TypeORM

typeORM은 typescript, javascript 환경에서 사용하는 ORM이다. npm trend를 보면 sequelize보다는 사용이 적은 편이나, 지난 1년간 사용량이 꾸준히 증가해왔다. typeORM 토이프로젝트를 만들어 간단하게 사용해보자.

토이 프로젝트 생성하기

$ npm i typeorm -g

$ typeorm init --name 프로젝트이름 --database 데이터베이스

ORM 설정하기

ormconfig.json 파일에 DB 커넥션을 설정

{
   "name": "default",
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "myname",
   "password": "password1234!",
   "database": "myDatabase",
   "synchronize": false,

   "entities": [
      "src/entities/*.ts"
   ]
}

모델 생성하기

다음과 같이 DB와 클래스를 대응시킨다.

  • 테이블 ↔클래스
  • 컬럼 ↔클래스 프로퍼티
  • 테이블 및 컬럼 속성을 데코레이터로 표기

모델 예시(User)

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

@Entity("User", { schema: "myDatabase" })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn({ type: "int", name: "id" })
  id: number;

    @Column("varchar", { name: "email", length: 255})
  email: string | null;

  @Column("varchar", { name: "name", length: 100 })
  name: string;
}

노드 모듈(typeorm-model-generator) 이용해 모델 자동 생성하기

이처럼 typeORM에서는 엔티티를 사용자가 직접 정의해서 쓸 수도 있지만, 모델 생성 모듈을 이용해 기존 DB로부터 모델을 생성할 수도 있다. 이 기능은 ORM을 사용하지 않던 기존 프로젝트에 typeORM을 도입할 때 사용하면 편리하다.

자세한 사용법은 링크를 참고한다 : https://github.com/Kononnable/typeorm-model-generator

#typeorm-model-generator 만 입력하면 각 옵션을 수동으로 입력할 수 있도록 가이드해줌

#커맨드 한 번에 생성
typeorm-model-generator -h localhost -u $userName -x $password -e mysql -o ./entities --ssl

프로젝트 세팅 및 간단한 쿼리 사용해보기

  • 메인 함수를 만들고, async-await 패턴으로 사용
import {createConnection} from "typeorm";
import {User} from "./entities/User";

const main = async () => {
    try {
        await createConnection(); // typeORM db connection
        console.log('typeORM DB 커넥션 생성됨');

        //SQL : selct * from User
        const users = await User.find();
        console.log(users);

        //SQL : select * from User where User.email = 'gogogo@gmail.com'
        const userFound = await User.findOne({email: "gogogo@gmail.com"});
        console.log(userFound);

        return 'done';
    } catch (err) {
        console.log(err);
    }
};
main()
    .then((text: string = 'finished') => {
        console.log(text);
    })
    .catch((err) => {
        console.log(err);
    });

프로젝트 실행

  • typeORM을 사용할 모든 준비가 끝났다. 실행시 DB 쿼리 결과를 콘솔에서 확인할 수 있다.
$npm start