해결된 질문
작성
·
330
0
안녕하세요.
섹션 27의 8-5 CURD API 강의를 듣다가 문득 궁금한 점이 생겨 질문드립니다.
해당 강의에서는 boards.resolver.ts 파일에 fetchBoards함수와 createBoards 함수를 정의하기 위해
board.entity.ts 파일, create-board.input.ts 파일, boards-service.interface.ts 파일을 아래와 같이 만드셨습니다. 아래 세 파일은 구조가 거의 동일한데, 왜 이렇게 같은 구조의 파일을 세개나 만들어서 타입스크립트 타입 정의에 사용하는 것인지 이해가 가질 않습니다.
그리고 어떤 것은 class로 정의하여 타입스크릡트에 사용하고, 어떤 것은 interface로 정의하여 타입스크립트로 사용하는데 어떤 차이인지 질문 드립니다.
// board.entity.ts 파일
import { Field, Int, ObjectType } from '@nestjs/graphql';
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
@ObjectType()
export class Board {
@PrimaryGeneratedColumn('increment')
@Field(() => Int)
num: number;
@Column()
@Field(() => String)
title: string;
@Column()
@Field(() => String)
contents: string;
@Column()
@Field(() => String)
writer: string;
}
// create-board.input.ts 파일
import { Field, InputType } from '@nestjs/graphql';
@InputType()
export class CreateBoardInput {
@Field(() => String)
writer: string;
@Field(() => String)
title: string;
@Field(() => String)
contents: string;
}
// boards-service.interface.ts 파일
import { CreateBoardInput } from '../dto/create-board.input';
export interface IBoardsServiceCreate {
createBoardInput: CreateBoardInput;
}
답변 1
0
안녕하세요! 정욱님!
타입스크립트는 일반적으로 interface로 타입을 정의합니다!
그리고 class의 경우는, 이것이 객체처럼 인식이 되어 데이터도 저장할 수 있고 이것을 interface처럼 타입용도로도 사용하실 수 있어요!
Entity의 경우, 해당 Entity가 데이터베이스 테이블로 전환되기 위한 설정 및 해당 객체에 데이터를 담아서 등록 및 수정하는 등의 행위를 위하여 typeorm에서 제공해주는 가이드대로 class를 사용하여 만들어 주셔야 해요!
물론, 이 과정에서 만든 class를 타입 용도로도 사용할 수 있겠죠?!
브라우저에서 유저가 input창에 입력한 데이터들을 백엔드에 전송하면, 백엔드에서는 이 데이터들을 class에 담아서 resolver로 넘겨주게 됩니다. 이 class를 dto(데이터 전송 객체)라고 불러요!
무엇인가 저장을 해야하니까 class로 만들어야겠죠?! 이 class 역시 타입 용도로도 활용 가능합니다!
*) 참고로, 지금은 수업용 데이터로서 구조가 복잡하지 않기 때문에 dto와 entity가 거의 비슷하여 왜 굳이 이렇게까지 하나 싶을 수 있겠지만, 일반적으로 실제 프로젝트의 경우 규모에 따라 dto와 entity는 많은 차이가 있을 수 있어요!
*) 추가로, 이렇게 비슷한 경우에 이미 만들어져있는 class를 변형하여 만드는 방법도 이후 수업 과정에서 진행됩니다!
마지막으로 resolver에서 service로 넘기는 데이터의 경우, 이 데이터들을 또다른 객체에 담아서 service에 전송하고 싶다면 class를 만들고 담아서 전송하시면 되고, 굳이 또 새로 담는게 아니라 전달되는 데이터 타입만 체크하고 싶다면 interface로 만들면 됩니다!
이러한 이유에서 interface를 사용하였고, class를 사용하셔도 가능합니다!^^
이 설명 되게 좋내요 !!
시간되면 QnA도 같이 보면 너무 좋을거 같내요.