typeorm은(는) 무엇을 하나요?
TypeORM을 사용한 개발 가이드라인 - TypeScript와 JavaScript를 위한 완전한 기능의 ORM으로 여러 데이터베이스를 지원합니다.
개요
TypeORM은 TypeScript와 JavaScript(ES5, ES6, ES7, ES8) 환경에서 사용할 수 있는 ORM 라이브러리입니다. MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB 등 다양한 데이터베이스 엔진을 지원합니다.
주요 기능
- 데코레이터 기반 엔티티 정의: TypeScript 데코레이터를 사용하여 직관적으로 엔티티를 정의할 수 있습니다.
- 액티브 레코드와 데이터 매퍼 패턴: 두 가지 패턴을 모두 지원하여 유연한 개발이 가능합니다.
- 마이그레이션: 데이터베이스 스키마 변경을 체계적으로 관리할 수 있습니다.
- 쿼리 빌더: SQL 쿼리를 프로그래밍 방식으로 안전하게 작성할 수 있습니다.
- 관계 매핑: 일대일, 일대다, 다대다 관계를 손쉽게 정의하고 관리할 수 있습니다.
- 트랜잭션 지원: ACID 트랜잭션을 완벽하게 지원합니다.
시작하기
npm install typeorm --save
npm install reflect-metadata --save
npm install @types/node --save-dev
tsconfig.json에 다음 설정을 추가하세요:
{
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
엔티티 정의 예시
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({ unique: true })
email: string;
}
데이터 소스 설정
import { DataSource } from 'typeorm';
const AppDataSource = new DataSource({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'test',
password: 'test',
database: 'test',
entities: [User],
synchronize: true,
logging: false,
});
리포지토리 사용
const userRepository = AppDataSource.getRepository(User);
// 사용자 생성
const user = new User();
user.firstName = 'John';
user.lastName = 'Doe';
user.email = '[email protected]';
await userRepository.save(user);
// 사용자 조회
const users = await userRepository.find({ where: { firstName: 'John' } });
// 사용자 업데이트
await userRepository.update({ id: 1 }, { firstName: 'Jane' });
// 사용자 삭제
await userRepository.delete({ id: 1 });
관계 정의
import { Entity, PrimaryGeneratedColumn, Column, OneToMany, ManyToOne } from 'typeorm';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column('text')
content: string;
@ManyToOne(() => User, (user) => user.posts)
author: User;
}
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Post, (post) => post.author)
posts: Post[];
}
마이그레이션
# 마이그레이션 생성
npx typeorm migration:create ./src/migration/InitialMigration
# 마이그레이션 실행
npx typeorm migration:run
# 마이그레이션 되돌리기
npx typeorm migration:revert
쿼리 빌더 사용
const users = await AppDataSource
.getRepository(User)
.createQueryBuilder('user')
.leftJoinAndSelect('user.posts', 'post')
.where('user.firstName = :name', { name: 'John' })
.orderBy('user.id', 'DESC')
.getMany();
트랜잭션 처리
await AppDataSource.transaction(async (transactionalEntityManager) => {
const user = new User();
user.firstName = 'John';
user.lastName = 'Doe';
await transactionalEntityManager.save(user);
const post = new Post();
post.title = 'My first post';
post.content = 'Hello, world!';
post.author = user;
await transactionalEntityManager.save(post);
});
모범 사례
- 엔티티 네이밍 규칙: 엔티티 클래스는 단수형, 데이터베이스 테이블은 복수형으로 지정하세요.
- 마이그레이션 사용:
synchronize: true는 개발 환경에서만 사용하고, 프로덕션에서는 마이그레이션을 사용하세요. - 지연 로딩 활용: 필요할 때만 관계 데이터를 로드하여 성능을 최적화하세요.
- 인덱스 추가: 자주 쿼리되는 컬럼에는 인덱스를 추가하세요.
- 트랜잭션 사용: 여러 작업이 원자적으로 실행되어야 할 때는 트랜잭션을 사용하세요.