nestJS로 개인프로젝트만들기7

Parker.Park·2022년 8월 14일
0

personal_project1

목록 보기
7/9

GraphQL Mutation, Query 적용

지난 프로젝트 때 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사이에서 찜찜한 부분도 있고, 헷갈리는 것도 있다.

profile
개발자준비중

0개의 댓글