javascript 지원 데이터베이스를 사용하는 모든 응용 프로그램에서
코드 객체를 데이터베이스 언어(SQL)와 일치시켜주는 도구다
즉 우리가 만든 객체에 따른 SQL을 자동 생성해서 동기화시키는 일을 한다
export const StarkbucksSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "test", password: "test", database: "test", synchronize: true, logging: true, entities: [Post, Category], subscribers: [], migrations: [], })
모든 query메소드들을 모델에 정의하고 객체의 저장, 제거 그리고 불러오는 기능들은 모델의 메소드를 통해 사용하는 패턴이다. 결과적으로 SQL을 직접 사용하지 않으면서 데이터를 조작할 수 있다.
Active Record 엔티티들은 Repository와 Entity Manager를 사용하지 않아도 된다. 모델 클래스를 정의하면서 BaseEntity클래스를 확장하였기 때문이다. BaseEntity클래스는 표준 Repository클래스의 대부분의 메소드를 갖고 있다.
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 패턴에서는 모든 쿼리 메소드들을 별도의 클래스에 정의한다.
이때 생성된 별도의 클래스를 repository라고 부른다.
결국 데이터베이스를 접근하기 위해 모델이 아닌 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; }