[TIL] TypeORM

조혜인·2022년 7월 18일
0
post-thumbnail

예전에는 SQL 쿼리문을 직접 작성하여 DB의 데이터를 관리하였는데 요즘은 ORM이나 ODM이라는 매핑 방식으로 DB를 관리한다고 한다. 먼저 ORM과 ODM에 대해 찾아보았다.

📌 ORM?

  • ORM = Object Relational Mapping/Mapper(객체 관계 매핑)

  • 객체와 관계형 데이터베이스를 자동으로 매핑해주는 것이다. 자바스크립트의 객체에 반해 관계형 데이터베이스는 테이블을 사용하면서 이 두 모델 간의 불일치가 존재하는데, 이것을 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다.

  • ORM방식은 관계형 데이터베이스 즉 표로 이루어진 DB를 위한 방식이라고 보면 될 것 같다.

  • 대표적으로 아래와 같은 DB들이 ORM방식을 사용한다.

    • Oracle -> 큰 기업에서 많이 사용함. 돈을 내고 쓴다!
    • MySQL -> 일반적으로 많이 사용함한다. 스타트업에서 많이 사용한다.

📌 ODM?

  • ODM = Object Document Mapping/Mapper(객체 문서 매핑)

  • 객체와 문서형 데이터베이스를 자동으로 매핑해주는 것이다. ORM과 마찬가지로 객체와 문서형 데이터베이스 간의 모델 불일치가 존재하는데, DB에서 문서를 조회할 때 자바스크립트 객체로 바꿔주어 불일치를 해결한다.

  • ODM방식은 문서형 데이터베이스 즉 문서로 이루어진 DB를 위한 반식이라고 보면 될 것 같다.

  • MondoDB를 사용하기위해 Mongoose라이브러리를 사용해봤는데 Collection이라는 DB문서가 담긴 서류봉투를 사용하여 데이터를 관리하였다.

  • 대표적으로 아래와 같은 DB들이 ODM방식을 사용한다.

    • MongoDB -> 가장 일반적이면서 유명한 데이터베이스.
    • TypeORM -> TypeScript를 사용함.
    • Sequelize

📌 TypeORM

  • 아직 Typescript를 시작해보지 못하여 github에 등록되어있는 TypeORM docs를 읽어보았다.
  • TypeORM은 ODM방식과는 다르게 model이 아래와 같이 entity와 column으로 나뉘는 것을 확인할 수 있다. 내가 사용하던 MongoDB에서는 User 스키마를 만들어 mongoose를 이용하여 컬렉션을 작성하였는데 확연히 다른 model 방식이었다.
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    firstName: string

    @Column()
    lastName: string

    @Column()
    age: number
}
  • 메인 로직에서도 ODM 방식(MongoDB & mongoose)와는 다른 메소드명도 알아볼 수 있었다.
  • 전체적으로 각 기능별 메소드들의 사용 방식은 비슷한 것 같다.
const userRepository = MyDataSource.getRepository(User)

const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.age = 25
await userRepository.save(user)

const allUsers = await userRepository.find()
const firstUser = await userRepository.findOneBy({
    id: 1,
}) // find by id
const timber = await userRepository.findOneBy({
    firstName: "Timber",
    lastName: "Saw",
}) // find by firstName and lastName

await userRepository.remove(timber)
profile
코딩은 역시 재밌군

0개의 댓글