NEST.js

NEST API 만들기

늘곰's 2023. 9. 30. 01:00

API 만들기

 

 

boards.resolver

@Query(() => [Board], { nullable: true }) : 이 보드는 그래프ql에서 배열을 나타내는  것
 
fetchBoards(): Board[] 이 보도는 타입스크립트에서 배열을 나타내게 하는것
 
Args({ name: 'contents', nullable: true }) contents: string, // 필수값이 아니게 하려면 이런식으로 nullable 을 true
import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
import { BoardsService } from './boards.sevice';
import { Board } from './entities/board.entity';

@Resolver()
export class BoardsResolver {
  constructor(private readonly boardsService: BoardsService) {}

  @Query(() => [Board], { nullable: true })
  fetchBoards(): Board[] {
    return this.boardsService.findAll();
  }

  @Mutation(() => String)
  createBoard(
    @Args('writer') writer: string,
    @Args('title') title: string,
    @Args('contents') contents: string,
  ): string {
    return this.boardsService.create(writer, title, contents);
  }
}

이 배열들을 쓰기 위해서 미리 entity에 

배열에 관한 내용을 정의해둠

@ObjectType()
 
@Field(() => Int)
 
 @Field(() => String)
 
이 필드들을 따로 정의해줘야 그래프ql 를 실행해서 스키마를 만들어 줄 수 있음
기존에 적은
 number: number; 이러한내용들은 타입스크립트에서 타입을 정해준것임

 

실행하면 나오는 스키마 

기존의 코드에서 contents 를 ! 표가 제거 된것은 이것을 컨텐츠에 추가했기 때

@Args({ name: 'contents', nullable: true }) contents: string, // 필수값이 아니게 하려면 이런식으로 nullable 을 true
# ------------------------------------------------------
# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
# ------------------------------------------------------

type Board {
  number: Int!
  writer: String!
  title: String!
  contents: String!
}

type Query {
  fetchBoards: [Board!]
}

type Mutation {
  createBoard(writer: String!, title: String!, contents: String): String!
}

entity

import { Field, Int, ObjectType } from '@nestjs/graphql';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
@ObjectType()
export class Board {
  @PrimaryGeneratedColumn('increment')
  @Field(() => Int)
  number: number;

  @Column()
  @Field(() => String)
  writer: string;

  @Column()
  @Field(() => String)
  title: string;

  @Column()
  @Field(() => String)
  contents: string;
}

boards.sevice

기존에 string 으로 작성되어있는 findAll 을 배열 로 타입을 변경

배열은entity 에 정의해둔 대로 Board[] 로 바팁을 바꿈 : Board 를 임포트 해줘야 오류가 없어짐

import { Injectable } from '@nestjs/common';
import { Board } from './entities/board.entity';

@Injectable()
export class BoardsService {
  findAll(): Board[] {
    // 1. 데이터를 조회하는 로직 => DB에 접속해서 데이터 꺼내오기
    const result = [
      {
        number: 1,
        writer: '철수',
        title: '제목입니다~~',
        contents: '내용이에요@@@',
      },
      {
        number: 2,
        writer: '영희',
        title: '영희 제목입니다~~',
        contents: '영희 내용이에요@@@',
      },
      {
        number: 3,
        writer: '훈이',
        title: '훈이 제목입니다~~',
        contents: '훈이 내용이에요@@@',
      },
    ];
    // 2. 꺼내온 결과 응답 주기
    return result;
  }

  create(writer: string, title: string, contents: string): string {
    // 1. 브라우저에서 보내준 데이터 확인하기
    console.log(writer);
    console.log(title);
    console.log(contents);

    // 2. DB에 접속 후, 데이터를 저장 => 데이터 저장했다고 가정

    // 3. DB에 저장된 결과를 브라우저에 응답(response) 주기
    return '게시물 등록에 성공하였습니다!!';
  }
}

boards.sevice -2

createBoardInput 에 타입을 지정 
IBoardsServiceCreate
 
 
import { IBoardsServiceCreate } from './interfaces/boards-service.interface'; 로 타입을 인터페이스 폴더에서 따로 관리
import { Injectable } from '@nestjs/common';
import { Board } from './entities/board.entity';
import { IBoardsServiceCreate } from './interfaces/boards-service.interface';

@Injectable()
export class BoardsService {
  findAll(): Board[] {
    // 1. 데이터를 조회하는 로직 => DB에 접속해서 데이터 꺼내오기
    const result = [
      {
        number: 1,
        writer: '철수',
        title: '제목입니다~~',
        contents: '내용이에요@@@',
      },
      {
        number: 2,
        writer: '영희',
        title: '영희 제목입니다~~',
        contents: '영희 내용이에요@@@',
      },
      {
        number: 3,
        writer: '훈이',
        title: '훈이 제목입니다~~',
        contents: '훈이 내용이에요@@@',
      },
    ];
    // 2. 꺼내온 결과 응답 주기
    return result;
  }

  create({ createBoardInput }: IBoardsServiceCreate): string {
    // 1. 브라우저에서 보내준 데이터 확인하기
    console.log(createBoardInput.writer);
    console.log(createBoardInput.title);
    console.log(createBoardInput.contents);

    // 2. DB에 접속 후, 데이터를 저장 => 데이터 저장했다고 가정

    // 3. DB에 저장된 결과를 브라우저에 응답(response) 주기
    return '게시물 등록에 성공하였습니다!!';
  }
}

interface

import { CreateBoardInput } from '../dto/create-board.input';

export interface IBoardsServiceCreate {
  createBoardInput: CreateBoardInput;
}

최종적으로 작동 확인