TypeORM

김민섭·2023년 1월 19일
0

TypeORM

목록 보기
1/1
post-thumbnail

TypeORM을 알아보기 전에 우선 ORM이 무엇인지 알아보자

ORM이란?

ORM이란 객체와 관계형 데이터 베이스를 매핑(연결) 해준다.

  • 클래스를 사용하는 객체와 테이블을 사용하는 관계형 데이터 베이스 간에 불일치를 해결해준다.
  • 객체를 통해 데이터베이스에 간편하게 접근할 수 있다.

ORM의 장점

  • 객체 지향적인 코드로 인해 더 직관적이므로 비즈니스 로직에 더욱 집중할 수 있게 해준다
  • 코드의 가독성이 좋아진다.

TypeORM이란?

TypeORM은 현재 존재하는 다른 모든 JavaScript ORM과 달리 Active Record 및 Data Mapper 패턴을 모두 지원합니다. 즉, 고품질의 느슨하게 결합된 확장 가능하고 유지 관리 가능한 응용 프로그램을 가장 생산적인 방식으로 작성할 수 있습니다. -TypeORM 공식문서-

TypeORM은 Active Record와 Data Mapper 패턴을 지원한다고 되어있다.


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

위의 코드처럼 모델에 메소드를 정의한 후 구현된 메소드로 데이터 베이스에 접근할 수 있다.

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

repository를 가져와 데이터 베이스에 접근할 수 있다.

공식문서에 의하면 두 가지 패턴은 각각의 장, 단점이 있다고 한다. 아래의 내용을 토대로 알맞게 사용하면 될 것 같다.

  • Active Record: 규모가 작은 애플리케이션에 적합하고 간단히 사용할 수 있다
  • Data Mapper: 규모가 큰 애플리케이션에 적합하고 유지 및 보수에 효과적이다

참고로 Type이라는 이름 때문에 TypeScript로 작동이 될 것 같지만 JavaScript에서도 실행이 가능하다.

profile
getting ready to run

0개의 댓글