Wecode -기업협업 인턴 (부트캠프)/기업협업 독학, 공부

Entity와 DTO 언제, 왜 쓰는지 (nestJS, typeorm ...)

JBS 12 2023. 11. 8. 21:27
Entity와 DTO (Data Transfer Object)는
NestJS에서 데이터를 다룰 때 중요한 개념

DTO (Data Transfer Object):

 

데이터의 전송 형식을 정의하는 클래스입니다.

 

주로 API 엔드포인트에서 클라이언트로 데이터를 전송할 때 사용됩니다.


클라이언트와 서버 간의 데이터 전달을 위해 DTO를 사용하여 데이터의 형태와 필드를 정의하고 검증할 수 있습니다.
DTO를 사용하면 클라이언트로 보낼 데이터를 필터링하거나 데이터 유효성 검사를 수행할 수 있습니다.

 

//dto

export class CreateUserDto {
  name: string;
  email: string;
}

 

 

 

DTO 왜 쓰는 지 

 

Data Transfer Object

데이터를 우리가 사용할 수 있게 객체로 바꿔줌 

 

데이터를 안전하게 전송 가능 

 

 

POST - 생성할 데이터

PATCH - 수정할 데이터 

NestJS에서 DTO(data transfer object) 클래스를 통해

외부로 부터 유입되는 데이터를 모델링

 

 생성할 유저를 나타낼 DTO 클래스,

수정할 유저 데이터를 나타낼 DTO 클래스

 

 

NestJS로 REST API 찍어내기

Engineering Blog by Dale Seo

www.daleseo.com

 

//create-user.dto.ts
export class CreateUserDto {
  name: string;
  email: string;
  phone?: string;
}

 

id, createdAt, updatedAt 속성 -> DTO 클래스를 통해서 외부로 부터 받을 필요가 없기 때문

 DTO 클래스에 제외 -> 애플리케이션 내부적으로 결정 

 

? 가 붙은 건, 선택 option (필수값이 아니라는 것) 

 

import { IsNumber, IsOptional, IsString } from 'class-validator';

export class CreateCrudDto {
  @IsString()
  Writer: string;

  @IsString()
  title: string;

  @IsString()
  dsec: string;

  @IsString()
  password: string;

  @IsOptional()
  id: number;
}

 

클라이언트에서 서버로 데이터를 보낼 때 = DTO를 사용하여 데이터를 전송
서버에서 클라이언트로 데이터를 반환할 때=  DTO를 사용하여 데이터의 형식을 정의

Entity=  주로 데이터베이스와 상호 작용을 처리,
DTO =  데이터를 API 엔드포인트에서 전송하고 수신 

 

 

//controller 

@Post()
  create(@Body() createCrudDto: CreateCrudDto) {
    return this.crudService.create(createCrudDto);
  }


// pipe 설치  (미들웨어)

npm i -S class-transformer class-validator

 

 

//main.ts에 추가
app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );

- whilelist : DTO에 없으면 에러메세지 출력

- forbidNonWhitleist : DTO에 존재하지않는 값이면 에러메세지출력

- transform: 넘어오는 값은 무조건 String, 하나하나 원하는 타입으로 바꿔줘야하는데 이런 불편함을 없애줌

- transform true로 해줌으로써
@Get(':id')
  findOne(@Param('id') id: number) {
    return this.crudService.findOne(id);
  }
이런식으로 사용

 

 

DTO = 우리가 쓸수있게 변환하고 타입 부여
entity (model)= 스키마, 어떤 data를 넣을지 따로 명시

 

 

DTO=  데이터를 전송하는 데 사용되는 객체
클라이언트에서 서버로 데이터를 전송할 때
데이터의 형식을 정의하고 유효성을 검사하는 데 사용
데이터를 전송하기 위한 구조체

Entity= 데이터베이스 테이블과 일치하는 데이터 모델을 나타내는 데 
데이터베이스와 상호 작용하여 데이터를 읽거나 쓰는 데 사용

 

 

DTO 클래스데코레이터를 사용하는 것은 드물며, 주로 Entity 클래스나 데이터 유효성 검사를 수행할 때 사용됩니다. Entity 클래스와 DTO 클래스는 서로 다른 목적을 가지고 있으므로 구분해서 사용

주로 API 엔드포인트에서 클라이언트로 데이터를 전송하거나 클라이언트에서 서버로 데이터를 전송할 때 사용
클래스 유형에 @IsString() 및 @IsNumber()와 같은 데코레이터를 사용하여 필드의 유효성을 검사
@IsString() @IsNumber() =  데이터의 유효성을 검사하고 타입을 지정하는데 사용됩니다. 
@IsString() 데코레이터=특정 필드가 문자열 타입이어야 함을 나타내며,
@IsNumber()= 숫자 타입이어야 함
@IsOptional() 데코레이터=  해당 필드가 선택적임 -->  class-validator 라이브러리를 사용하여 유효성 검사를 수행하는 데 사용



Entity 클래스에도 데코레이터가 사용
Entity 클래스는 데이터베이스 테이블 (해당 테이블의 열을 나타내는 속성에 대한 정보)
--> TypeORM과 같은 ORM(Object-Relational Mapping) 라이브러리에서 데코레이터를 사용 
일반적으로 Entity 클래스에는 다음과 같은 데코레이터가 사용됩니다:
@Entity: 클래스를 Entity로 정의합니다.
@PrimaryGeneratedColumn: 주 키 역할을 하는 열을 정의합니다.
@Column: 열에 대한 속성을 정의합니다. 예를 들어, 데이터 형식, 길이, NULL 허용 여부 등
@CreateDateColumn: 데이터가 생성된 날짜 및 시간을 나타내는 열을  

데코레이터는 Entity 클래스의 속성을 데이터베이스 테이블 스키마와 매핑하며, 이를 통해 데이터베이스와의 상호 작용을 단순화하고 효율적으로 관리할 수 있게

//entity

export class Crud {
  Writer: string;
  title: string;
  dsec: string;
  password: string;
  id: number;
}

 

Entity:
데이터베이스 테이블과 일치하는 데이터 모델을 나타내는 클래스입니다.

 

주로 TypeORM과 같은 ORM(Object-Relational Mapping) 라이브러리와 함께 사용됩니다.

 

Entity 클래스는 데이터베이스 테이블의 구조를 정의하고 데이터를 읽거나 쓰는 작업을 수행합니다.
주로 데이터베이스와 상호 작용을 처리하기 위해 Repository와 함께 사용

 

 

// Entity

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}