컴퓨터 공학/JavaScript

쿼리 대신 TypeOrm으로 DB 통신하기 (샘플)

혼새미로 2022. 2. 8. 21:56
반응형

웹 앱에서 MariaDB, MySQL 등의 RDB와 통신할 때 보통 쿼리와 파라미터를 넘기는데, 사용하는 DB, 테이블, 칼럼이 많아지면 쿼리도 많아지게 되면서 나중에는 프로젝트에 쿼리 문자열로 가득차게 된다.

TypeOrm 패키지는 쿼리 대신 객체와 클래스를 이용해서 DB와 통신할 수 있는 방법을 제공한다.

타입스크립트에서 기본 예제를 소개한다.

우선 프로젝트에 mysql, reflect-metadata, typeorm을 설치한다.

$ npm install --save typeorm
$ npm install --save reflect-metadata
$ npm install --save mysql

tsconfig.json 파일에 다음의 속성을 추가한다.

{
  "compilerOptions": {
    "experimentalDecorators": true, // 데코레이터 사용 (실험단계)
    "emitDecoratorMetadata": true // 데코레이터를 위한 기능으로, reflect-metadata 패키지를 이용하여 타입 emit 가능
  }
}

데코레이터는 클래스, 메서드 등을 수정하지 않고 추가 기능을 붙이고 싶을 때 사용하는 기능이다. 보통 클래스 이름이나 메서드 이름 위에 <@데코레이터명> 과 같은 형식으로 사용한다.

아직 타입스크립트에서 정식으로 지원하는 기능이 아니기 때문에 experimental 딱지가 붙어있다.

 

아래와 같이 user 테이블을 작성한다.

이름 타입
idx integer (기본키)
name varchar(64)
age integer
city varchar(64)
// /src/entity/user.ts
import 'reflect-metadata';
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class user {
    @PrimaryGeneratedColumn()
    idx: number;

    @Column({
        length: 64,
        charset: 'utf8', // 문자집합을 utf8로 설정
    })
    name: string;

    @Column()
    age: number;

    @Column({
        length: 64,
        charset: 'utf8', // 문자집합을 utf8로 설정
    })
    city: string;
}

그리고 user 테이블을 생성하고 레코드를 삽입하는 소스코드를 작성한다.

import 'reflect-metadata';
import { createConnection } from 'typeorm';
import { user } from './entity/user';

createConnection({
    type: 'mariadb',
    host: '127.0.0.1',
    port: 3306,
    username: 'root',
    password: 'pass',
    database: 'test',
    entities: [user], // 연결에 사용할 테이블
    synchronize: true,
    logging: false,
})
.then(async conn => {
    console.log('connected');

    let myUser = new user();
    myUser.age = 25;
    myUser.city = 'seoul';
    myUser.name = 'kim';

    let saveResult = await conn.manager.save(myUser);
    console.log(saveResult);

    let findResult = await conn.manager.find(user);
    console.log(findResult);
})
.catch(err => console.log(err));

실행결과는 아래와 같다.

connected
user { age: 25, city: 'seoul', name: 'kim', idx: 1 } // 삽입결과
[ user { idx: 1, name: 'kim', age: 25, city: 'seoul' } ] // 조회결과

물론, 쿼리를 직접 요청하는 함수도 제공한다.

 

아직 리서치 단계지만, TypeOrm을 잘만 활용하면 프로젝트에 쿼리가 거의 사용되지 않을 수도 있을 것 같다.

반응형