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 클래스
//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;
}
'Wecode -기업협업 인턴 (부트캠프) > 기업협업 독학, 공부' 카테고리의 다른 글
기업협업 2번째 프로젝트: '문법' 오답노트 (0) | 2023.11.13 |
---|---|
middleware 미들웨어 언제, 왜, 어떻게 쓰는가 (0) | 2023.11.09 |
쿼리 빌더 Query Builder 왜, 언제, 어떻게 쓰는가 (0) | 2023.11.08 |
postgre docker (0) | 2023.11.08 |
github에 개인 정보, 비밀번호가 올라갔을 경우 [reset --hard], local commit 내역으로 확인! (0) | 2023.11.08 |