typeORM 사용하기
typeORM을 사용하면, node.js 환경에서 복잡한 쿼리문을 SQL이 아니라 타입스크립트 문법으로 작성할 수 있다.
사실, Sequelize를 사용해본 경험이 있는데 다소 구성이 복잡하였고, 무엇보다도 타입스크립트로의 전환이 쉽지 않았다.
때문에 좀 더 타입스크립트에서 사용하기에 좋고 더 간단한 ORM이 무엇일까 고민하였고 typeORM을 사용하게 되었다.
필요한 라이브러리 설치 & 설정
npm i typeorm reflect-metadata @types/node
타입스크립트 설치하기
npm i -D typescript ts-node
그리고 사용할 데이터베이스에 맞게 db 드라이버를 설치한다. (여기서는 mysql)
npm i mysql
or
npm i mysql2
설치한 reflect-metadata는 프로젝트의 최상위에서 호출하도록 한다.
그리고 tsconfig.json 설정을 변경한다.
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
위와 같이 타입스크립트 데코레이터 설정을 켜준다.
🍓 이 부분이 typeORM을 사용하며 약간 걸리는 부분인데, 타입스크립트 (v5.0.4)에서 여전히 데코레이터 기능은 실험적이다.
간편 시작하기
사실 위의 소개한 설치 방법을 한 번에 해결해주는 간단한 방법이 있다.
typeORM을 설치하면, 간단하게 CLI를 통해서 typeORM 프로젝트를 생성할 수 있다.
npx typeorm init --name 프로젝트_이름 --database 사용할_db
ex) npx typeorm init --name hello_node --database mysql
위 명령어를 입력하면, 손쉽게 typeORM을 적용할 수 있다.
이제 중요한 typeORM 설정파일을 살펴보자.
✨ src/data-source.ts
import "reflect-metadata";
import { DataSource } from "typeorm";
import { User } from "./entity";
import dotenv from "dotenv";
dotenv.config();
export const AppDataSource = new DataSource({
type: "mysql",
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT || "3306"),
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: "typeorm_db",
synchronize: true,
logging: false,
entities: [User],
migrations: [],
subscribers: [],
});
위의 코드는 dotenv를 사용하여 환경변수를 적용한 설정파일이다.
민감한 정보들을 감추기 위해서 사용해주었다.
DataSource 클래스 생성자 인수로 사용할 db의 type, 데이터베이스 이름, DB에 접근하기 위한 사용자 정보 등이 제공되어야 한다.
그리고 생성한 entity들을 entities 배열에 추가해주도록 한다.
위에서 내보내진 AppDataSource는 내부에 initialize 메서드를 실행시킴으로써 이제 typeORM을 통해서 DB와의 연결을 할 수 있다.
import { AppDataSource } from "./data-source";
AppDataSource.initialize()
.then(async () => {
// start your server in here!
});
Entity
마지막으로 간단하게 Entity를 확인해보자.
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from "typeorm";
// sample example
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column()
firstName!: string;
@Column()
lastName!: string;
@Column()
age!: number;
@CreateDateColumn()
createdDate!: Date;
@UpdateDateColumn()
updatedDate!: Date;
}
어노테이션을 사용하여 Entity를 정의할 수 있다. (타입스크립트 데코레이션 문법, lombok과 비슷하게 느껴진다)
그리고 생성한 entity 클래스 내부에 Colum에 관련된 어노테이션을 붙여 내부 DB구조를 아주 간단하게 작성할 수 있다.
생성한 Entity는 위에서도 확인한 DataSource 생성자 내부의 entities 배열에 꼭 넣어주자.
그리고 다음과 같이 불러와 사용할 수 있다.
import { User } from "./entity/user";
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.age = 25
await user.save()
const allUsers = await User.find()
const firstUser = await User.findOneBy({
id: 1,
})
const timber = await User.findOneBy({
firstName: "Timber",
lastName: "Saw"
})
await timber.remove()
위는 공식문서에서 소개한 예제이다.
생성자를 통해서 새로운 내부 데이터를 만들고 save할 수 있다.
Entity 클래스가 제공하는 메서드인 save, remove, find, findOneBy등의 메서드를 사용하여 손쉽게 DB 내부에 데이터를 CRUD할 수 있다.
TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server,
typeorm.io