지난 프로젝트 때 typeORM과 graphQL을 적용했다. 이때도 많이 헷갈렸던 것이 있는데 그것은 타입 호환성이었다. 특히 ORM에서 "number"가 graphQL에서는 Int이기 때문에 혼동을 조심하여야 했다. 또한 graphQL은 데코레이터를 한번 더 사용해야했기 때문에 entity를 설계할 때는 혼동이 많이 되었다.
//user.entity.ts
import { Field, ObjectType } from '@nestjs/graphql';
import { Column, DataType, Model, Table } from 'sequelize-typescript';
@Table
@ObjectType()
export class User extends Model<User> {
@Column({
type: DataType.CHAR(36),
defaultValue: DataType.UUIDV4,
primaryKey: true,
})
@Field(() => String)
id: string;
@Column
@Field(() => String)
name: string;
@Column
@Field(() => String)
phone: string;
@Column
@Field(() => String)
email: string;
@CreatedAt
@Field(() => Date)
creationDate: Date;
@UpdatedAt
@Field(() => Date)
updatedOn: Date;
@DeletedAt
@Field(() => Date)
deletionDate: Date;
}
대부분 type이 string이기 때문에 문제가 없었다. 다만 초기 테이블을 만들고 데이터를 생성할 때, createdAt, updatedAt Column이 자동으로 생성되어진 것을 발견하였다.
TypeORM
에서는 별도의 데코레이터를 통해서 만들어서 사용하였다. 이후 @CreatedAt, @UpdatedAt, @DeletedAt을 사용하니 지금에는 당연할 수 있지만 에러가 발생하였다. docker를 초기화해주니 문제 없이 돌아갔다. 처음에는 @Field만 사용하여 자동 생성되는 Column을 사용할까 싶었지만 설계상 이렇게 만들어주는 것이 좋다고 판단하였다.
//user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { User } from './models/user.entity';
@Injectable()
export class UserService {
constructor(
@InjectModel(User)
private userModel: typeof User,
) {}
async create({ name, phone, email }) {
return await this.userModel.create({ name, phone, email });
}
async findAll() {
return await this.userModel.findAll();
}
}
NestJS Docs를 따라 적용하였다. 다만 TypeScript 문법대신 await를 사용하여서 가독성을 높이려고 했다. 물론 이전부터 await를 사용하였기에 편한것도 있었다.
//user.resolver.ts
import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
import { User } from './models/user.entity';
import { UserService } from './user.service';
@Resolver()
export class UserResolver {
constructor(
private userService: UserService, //
) {}
@Mutation(() => User)
createUser(
@Args('name') name: string,
@Args('phone') phone: string,
@Args('email') email: string,
) {
return this.userService.create({ name, phone, email });
}
@Query(() => [User])
async fetchAllUser() {
return await this.userService.findAll();
}
}
역시 NestJS Docs를 따랐다. @Query나 @Mutation 사용시 type에 대한 적용은 좀더 공부할 필요성이 느껴졌다.
우선적으로 CRUD 중 CR을 구현해보았다. 여전히 GraphQL과 ORM사이에서 찜찜한 부분도 있고, 헷갈리는 것도 있다.