[Nest.js] Entity와 DTO의 차이점 - [Error] unnamed portal parameter
Nest.js를 처음 공부해 보는 사람은 Entity와 DTO의 차이가 생소할 수 있다.
오늘은 DTO와 Entity의 차이점을 예시와 함께 알아보자
🎯 Entity와 DTO의 코드
먼저 아래의 Exercise Entity와 Exercise DTO 코드를 함께 살펴보자
// Exercise Entity Code
@Entity()
@Unique(['name'])
export class Exercise extends BaseEntity {
@PrimaryGeneratedColumn('increment')
id:number
@Column()
name:string;
// Entity에서는 string 타입으로 정의 했다 !!
// 이 부분을 유의해서 보자 !
@Column()
tool:string;
@Column()
mainTarget:string
@Column()
subTarget:string
@Column()
createdAt:string
@Column()
updatedAt:string
}
// Exercise DTO code
export class CreateExerciseDto {
@IsString()
@IsNotEmpty()
name:string;
// DTO 에서는 Entity와는 다르게 tool type을 Exercisetool 이라는 Enum class로 정의했다.
// 이 부분을 주의해서 살펴보자 !!
@IsEnum(ExerciseTool)
@IsNotEmpty()
tool:ExerciseTool
@IsString()
@IsNotEmpty()
mainTarget:string
@IsString()
@IsNotEmpty()
subTarget:string
}
둘의 코드 구성이 비슷하지 않나?
그렇다면 하나로 써도 될 것 같은 DTO와 Entity를 나누는 것일까 ?
🎯 Entity와 DTO의 차이점
둘은 하는 역할에 있어서의 차이점이 있다.
Entity는 DB에게 우리가 어떤 데이터를 던질 것인지 정의 하는 부분이다.
즉 Entity는 DB와 서버를 연결하는 다리이다.
DTO는 말 그대로 Data Transfer Object로 데이터를 전달하는 객체이다.
이때 DTO는 클라이언트와 서버를 연결하는 객체이다.
즉 클라이언트가 보내는 데이터가 유효한 데이터인지 검증을 하는 기능을 수행한다.
둘은 비슷한 코드를 가지지만 역할의 차이가 있다 !!
🎯 예시를 통해 살펴보자 !
위의 Entity 코드와 DTO 코드를 살펴보면 아래와 같은 차이점이 있다.
// Entity에서의 tool
@Column()
tool:string;
// DTO에서의 tool
@IsEnum(ExerciseTool)
@IsNotEmpty()
tool:ExerciseTool;
DTO 에서는 tool이 ExerciseTool이라는 Enum class에 존재하는 데이터인지를 검증한다.
하지만 DB는 우리가 작성한 Enum class 정보가 없다 !
그러므로 Entity에서는 tool의 타입을 ExerciseTool이 아니라 string 타입으로 저장했다.
그렇다면 만약 Entity의 tool type을 ExerciseTool이라는 Enum class로 선언하면 어떻게 될까?
Postman을 통해 다음과 같은 requeset를 보내보자
결과
Entity의 tool type을 ExerciseTool Enum class로 지정하니 에러가 발생했다.
"unnamed portal parameter $2"
$2가 뭔지 살펴보지 tool을 의미한다.
DB는 ExerciseTool 이라는 Enum class가 뭔지 모른다 !
그런데 그런 데이터타입을 저장하려고 하니 오류가 발생할 수 밖에 !
다시 Entity의 tool type을 string으로 바꿔주자
그리고 DB에 정보를 저장할 때 tool을 string으로 변환해주자!
const exercise = this.create({
name,
// Enum type의 정보를 string으로 변환해서 DB에 저장한다.
tool:tool.toString(),
mainTarget,
subTarget,
createdAt:getDateTime(),
updatedAt:getDateTime()
});
그리고 다시 한 번 Postman을 통해 결과를 확인해보자
DB에 원하던 값이 저장된 것을 확인할 수 있다. !!
🎯 결론
Entity는 DB와 서버 간의 연결 !
DTO는 클라이언트와 서버 간의 연결 !
이 둘을 잊지 말자 !