웹 앱에서 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을 잘만 활용하면 프로젝트에 쿼리가 거의 사용되지 않을 수도 있을 것 같다.
'컴퓨터 공학 > JavaScript' 카테고리의 다른 글
윈도우에서 NVM 설치 및 사용하기 (0) | 2022.06.04 |
---|---|
Function.bind(this, ...)가 필요한 경우 (0) | 2022.02.16 |
심플 웹 서버 언어 별 성능 비교 (Go, Rust, Node.js) (0) | 2022.01.23 |
Node.js 버전 강제하기 (0) | 2022.01.19 |
esModule (ESM) 라이브러리를 CommonJS (CJS) 앱에서 사용하기 (0) | 2022.01.19 |