TypeORM

박선우·2023년 1월 25일
0

CS 스터디

목록 보기
25/53
post-thumbnail

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

// 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",
})
  • 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
}

공식문서 참조

profile
코린이 열심히 배우자!

0개의 댓글