🌼 TypeORM
Object-Relational Mapping(객체-관계 매핑)
객체,관계형 데이터베이스의 데이터를 자동으로 연결 해준다.
1️⃣ Active Record 패턴
모델 그자체에 쿼리 메소드를 정의, 모델의 메소드를 사용하여 객체를 저장,제거,불러오는 방식
User 모델의 프로퍼티와 메서드를 정의할 수 있습니다.
공식문서 Active Record 패턴 예제
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 객체를 이미 구현된 메서드로 간단하게 생성, 삭제, 조회, 수정할 수 있다.
DB엔티티에 직접 다룰 수 있도록 new 키워드를 이용하여 새로운 인스턴스를 만들어 사용이 가능하다.
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.isActive = true
await user.save()
await user.remove()
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" })
const timber = await User.findByName("Timber", "Saw")
2️⃣ Data Mapper 패턴
Repository를 이용하여 객체를 저장,제거,불러온다.
Active Record 패턴과 차이점은 모델에 접근이 아닌, Repository에서 데이터를 접근
공식문서 Data Mapper 패턴 예제
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
isActive: boolean
}
const userRepository = dataSource.getRepository(User)
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.isActive = true
await userRepository.save(user)
await userRepository.remove(user)
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",
})
getRepository()를 사용하여 만들어진 모델을 사용
3️⃣ Model 생성
데이터베이스 작업은 테이블 생성에서 시작
Photo 모델 생성
export class Photo {
id: number
name: string
description: string
filename: string
views: number
isPublished: boolean
}
4️⃣ Entity 생성
@Entity 데코레이터가 장식한 모델에 대한 데이터베이스 테이블 생성
모든 곳에서 entity로 작업
Photo에 대한 작업은 어디서나 가능하다.
import { Entity } from "typeorm"
@Entity()
export class Photo {
id: number
name: string
description: string
filename: string
views: number
isPublished: boolean
}
5️⃣ Table Column 추가
@Column 데코레이터를 사용하여 열로 만들려는 Entity의 속성을 정의하면 된다.
import { Entity, Column } from "typeorm"
@Entity()
export class Photo {
@Column()
id: number
@Column()
name: string
@Column()
description: string
@Column()
filename: string
@Column()
views: number
@Column()
isPublished: boolean
}
테이블 views에 추가된다.
열 유형은 사용한 속성 유형에서 유추된다.
6️⃣ primary column 생성
각 엔터티에는 기본 키 열이 하나 이상 있어야 된다.
@PrimaryColumn 데코레이터를 사용해야 한다.
import { Entity, Column, PrimaryColumn } from "typeorm"
@Entity()
export class Photo {
@PrimaryColumn()
id: number
@Column()
name: string
@Column()
description: string
@Column()
filename: string
@Column()
views: number
@Column()
isPublished: boolean
}
7️⃣ auto-generated column 생성(자동 컬럼)
ID 열이 자동 생성되기를 원한다고 가정
@PrimaryColumn -> @PrimaryGeneratedColumn
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
@Column()
description: string
@Column()
filename: string
@Column()
views: number
@Column()
isPublished: boolean
}
공식문서 참조