Object Relational Mapping
, 객체 관계 매핑
즉, 객체 지향형 언어와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것을 ORM이라고 한다.
객체 지향형 언어는 클래스를 사용하고 관계형 데이터베이스는 테이블을 사용하기에 두 모델간의 연결이 필요하다.ORM은 이를 도와주는 도구라고 할 수 있다.
ORM을 기반으로 한 도구들은 Sequelize, TypeORM, 등등 여러가지가 존재한다.
TypeORM은 그중 TypeScript와 연동이 좋은 도구라고 할 수 있다.
TypeORM에서는 Active Record
와 Data Mapper
패턴을 모두 사용할 수 있다.
자세한 내용은 링크를 통해 확인 할 수 있다.
https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md
Active Record
패턴을 활용하여 TypeORM의 사용법에 대해 알아보자.
ORM은 관계형 데이터베이스의 테이블을 객체지향형 언어 클래스에서 사용할 수 있도록 도와주는 도구이다.
즉, 먼저 새로운 Entity를 선언하여 객체지향형 언어의 모습으로 변형 시켜줘야 한다.
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()
}
}
위와 같이 새로운 Entity(클래스) 안에 findByName과 같은 method를 새롭게 선언해 줄 수 있다.
이렇게 새로만든 entity의 사용 예시를 보자면
// example how to save AR entity
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.isActive = true
await user.save()
// example how to remove AR entity
await user.remove()
// example how to load AR entities
const users = await User.find({ skip: 2, take: 5 })
const newUsers = await User.findBy({ isActive: true })
const timber = await User.findOneBy({ firstName: "Timber", lastName: "Saw" })
이와 같이 객체지향형 언어의 형식으로 변형할 수 있는 도구를 TypeORM
이라고 한다.
https://aonee.tistory.com/77
https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md