1. GraphQL?
- GraphQL은 API용 쿼리 언어로, GraphQL 자체는 하나의 스펙이며 여러 구현체들이 있다.
- 주로 Apollo와 함께 사용된다.
- 데이터를 선택적으로 전송하고 받아올 수 있도록 해준다.
2. TypeORM?
- nodejs에서 많이 이용되는 ORM(Object–relational mapping)라이브러리
- nodejs외에도 다양한 프레임워크에서 돌아감
TypeORM vs sequelize
- typeORM은 타입스크립트로 작성됨
- sequelize는 자바스크립트로 작성됨
- 아무래도 typeORM이 타입스크립트와 더 잘 결합할 것으로 보임
3. 설치하기
typeORM설치
npm i @nestjs/typeorm typeorm
db설치
//postgres를 쓸 경우
npm i pg
GraphQL설치
$ npm i @nestjs/graphql @nestjs/apollo graphql apollo-server-express
4. Entity
DB테이블에 매핑되는 클래스, 데이터에 저장되는 데이터의 형태를 보여주는 일종의 모델
Entity is a class that maps to a database table (or collection when using MongoDB) - 공식문서
TypeORM Entity with GraphQL in NestJS
NestJS에서는 Entity와 graphQL의 스키마 생성을 함께 할 수 있다!
import { Field, ObjectType } from '@nestjs/graphql';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@ObjectType
@Entity
export class SampleEntity {
@Field((type) => Number)
@PrimaryGeneratedColumn()
id: number;
@Field((is) => String)
@Column()
name: string;
...
}
- @ObjectType과 @Field는 graphQl의 스키마 생성을 위한 데코레이터
- @Entity와 @Column은 Entity생성을 위한 데코레이터
- @PrimaryGeneratedColumn()의 경우 PK를 지정하는 데코레이터
data mapper vs active record
typeORM을 이용해서 db와 상호작용하는 두가지의 패턴
- active record 패턴의 경우 단순하고 비교적 작은 프로젝트에 더 적합
- data mapper 패턴의 경우 대규모 프로젝트의 유지보수 더 적합
- typeORM을 NestJS와 함께 사용하는 경우 data mapper패턴을 사용하는 것이 더 좋다(고 한다. repository를 다룰 수 있는 모듈이 있어서라는데 더 써봐야 할듯)