TypeORM이란 객체 지향 언어로 된 Class를 관계형 데이터 베이스의 Table와 연결시켜주는 것으로 직접 SQL문을 작성하지 않고, 객체 지향적으로 코드를 작성할 수 있게 도와주는 ORM중 하나이다.
여기서 다른 ORM과 다른 점이 있다면, 다른 ORM과 달리 액티브 레코드 패턴과 데이터 매퍼 패턴을 모두 지원하여 확장 가능하며 유지보수가 가능한 어플리케이션을 가장 생산적인 방법으로 작성할 수 있다는 점을 차이점으로 들 수 있다.
액티브 레코드 패턴은 모델 자체 내에서 모든 쿼리 메서드를 정의하고 모델 메서드를 사용하여 오브젝트를 생성, 삭제, 조회, 수정할 수 있게 하는 방식을 의미한다.
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm" @Entity() export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number @Column() firstName: string @Column() lastName: string @Column() isActive: boolean static findByName(firstName: string, lastName: string) { return this.createQueryBuilder("user") .where("user.firstName = :firstName", { firstName }) .andWhere("user.lastName = :lastName", { lastName }) .getMany() } } 위 User 모델을 이용하여 user 객체를 이미 구현된 메서드로 간단하게 생성, 삭제, 조회, 수정할 수 있습니다.
데이터 매퍼 패턴은 "레포지토리" 라는 별도의 클래스에서 모든 쿼리 메서드를 정의하고 이 "레포지토리"를 사용하여 오브젝트를 생성, 삭제, 조회, 수정할 수 있습니다.
액티브 레코드 패턴과 같이 User 모델을 정의해 줍니다.
차이점은 User 모델을 BaseEntity로 확장하지 않습니다.
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm" @Entity() export class User { @PrimaryGeneratedColumn() id: number @Column() firstName: string @Column() lastName: string @Column() isActive: boolean }
아래와 같이 User의 레포지토리를 가져와 User 레포지토리에 생성, 삭제, 조회, 수정을 할 수 있습니다.
const userRepository = dataSource.getRepository(User) // example how to save DM entity const user = new User() user.firstName = "Timber" user.lastName = "Saw" user.isActive = true await userRepository.save(user) // example how to remove DM entity await userRepository.remove(user) // example how to load DM entities const users = await userRepository.find({ skip: 2, take: 5 }) const newUsers = await userRepository.findBy({ isActive: true }) const timber = await userRepository.findOneBy({ firstName: "Timber", lastName: "Saw", })