TypeORM이란 관계형 데이터베이스 기반의 2차원 테이블과 테이블 간의 저장된 행을 어플리케이션의 class와 인스턴트에 각 매칭을해주는 기술입니다.
그리고 ORM은 이러한 중간 매체게 역할로서 장점과 단점을 보유 하고 있습니다.
장점 : 개발속도 향상, 버그 및 실수 감소, 가독성 상승, 객체 지향적으로 접근이 용이
단점 : 세부적 수정시 디버깅 문제, 기존 정해진 틀로만 수행 가능, Query문 수행 속도저하
위에 말씀 드린 이러한 장점과 단점이 있지만, 신입 개발자 기준으로는 접근이 용이해서 빠른 퍼포먼스를 기대 할 수 있을 것 같습니다.
이제 TypeORM의 기본적인 기술 코드를 말씀 드리고 싶습니다.
기본적으로 TypeORM에서는 Active Record와 Data Mapper이라는 두가지의 기본 패턴을 많이 사용 합니다.
Active Record은 모델 자체 내의 모든 쿼리의 방법들을 정의한 상태에서 객체를 저장 및 제거 로드 하도록 데이터베이스내에서 엑세스가 가능 하도록 합니다.
// 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" })
Data Mapper는 Repositore 라는 별도의 클래스에서 모든 쿼리를 정의학고 또한 Reporsitore를 통해서 객체를 컨트롤 할수 있는 방식입니다. 따라서 Data Mapper는 모델리 아닌 저장소(Reporsitore)에저 제어 하는 방식입니다.
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",
})
이 두개의 방식은 사용하는 시점을 보편화적으로 나눌수 있는데
Active Record는 작은 규모의 데이터에 적합합니다.
Data Mapper는 큰 큐모의 데이터를 유지하는데 적합하다고 생각 합니다.