본문 바로가기

[TypeScript] TypeORM

⚡ TypeORM이 무엇일까?

Object-relational mapping, 객체-관계 매핑이라고 하는 ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 맵핑해준다고 한다. 이게 무슨 소리인가

보통의 객체지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하게 되는데 객체 모델과 관계형 모델 간에 불일치가 존재할 수 있다. 그럴때 ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다고 한다.

ORM의 종류로는 여러가지가 있다.

  • Sequelize
  • TypeORM
  • prisma

다양한 종류들이 있지만 결국 담당하는 기능들은 비슷한데 대표적으로 Data MapperActiveRecord 가 있다. 그 외적으로는

  • 깨끗한 개체 관계형 모델
  • 데이터베이스별 열 유형
  • 우아한 구문, 유연하고 강력한 QueryBuilder

등 다양한 기능들이 있다. 그럼 사용법은 어떠할까?

TypeORM을 사용하면 모델이 다음과 같다고 한다.

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

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    firstName: string

    @Column()
    lastName: string

    @Column()
    age: number
}

도메인 로직은 다음과 같다고 한다.

const userRepository = MyDataSource.getRepository(User)

const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.age = 25
await userRepository.save(user)

const allUsers = await userRepository.find()
const firstUser = await userRepository.findOneBy({
    id: 1,
}) // find by id
const timber = await userRepository.findOneBy({
    firstName: "Timber",
    lastName: "Saw",
}) // find by firstName and lastName

await userRepository.remove(timber)

이렇게 되면 결국 도메인 로직은 다음과 같다고 한다.

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()

그렇다면 이용하고 싶다면 어떻게 해야할까. 이부분은 다음의 공식문서에서 참고가 가능하다.


참조 : https://typeorm.io/

 

TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server,

 

typeorm.io

 

'📖 TIL > NestJS & TypeScript' 카테고리의 다른 글

[NestJS] ConfigModule이란?  (0) 2022.08.27
[TS] 타입스크립트(TypeScript)  (0) 2022.05.24
[NestJS] MVC 디자인 패턴  (0) 2022.04.01
[NestJS] NestJS와 폴더구조  (0) 2022.02.09