목차
1. 엔티티 매핑이란?
2. ABC 프로젝트의 객체
3. 기본적인 객체와 엔티티 매핑
1. 엔티티 매핑이란?
프로젝트의 객체를 DB에서 표현하는 방법이다. 기본적인 엔티티 매핑에는 객체-테이블 매핑, 필드-컬럼 매핑, 기본키 매핑, 연관관계 매핑이 있다. 이번 글에서는 객체, 필드 기본키 매핑까지 보고 다음 글에서 연관관계 매핑을 정리하려고 한다.
2. ABC 프로젝트 객체
ABC 프로젝트에는 크게 네 가지 객체를 사용한다.
유저객체, 레시피 객체, 베이커리 객체, 댓글(COMMENT)
각 객체에는 다음과 같은 필드를 사용한다. 지금은 댓글을 제외하고 연관관계는 제대로 매핑되지 않은 상태이다.
3. 기본적인 객체와 엔티티 매핑
이번 프로젝트에는 DB로 MongoDB와 MySQL을 사용한다. (데이터베이스 선정 기준 글 링크) 이번 글에서는 mongoose를 이용해 프로젝트의 객체와 MongoDB의 테이블을 연결하려고 한다.
[ MongoDB ]
MongoDB는 NoSQL이기 때문에 비교적 자유로워 테이블을 따로 정하지 않고 아무 도큐멘트를 넣어도 에러가 생기지 않는다. 어떤 데이터든 들어오기 때문에 편리할 것 같지만 오타가 들어가기도 하고 같은 필드에 다른 자료형이 들어가 서비스에 심각한 에러가 생길 수 있다.
객체-테이블
이러한 문제를 해결하기 위해 mongoose의 스키마를 이용해 DB 트렌젝션 전에 데이터를 검사한다. ABC 프로젝트에서는 Nest를 이용하기 때문에 {파일명}.schema.ts 를 이용해 스키마를 정의할 수 있다. mongoose의 Document를 상속받는 class를 하나 만들고, @Schema 데코레이터를 붙여 스키마로 지정한다. 이때 class name을 소문자화 후 복수형으로 바꿔 컬렉션의(테이블) 이름이 된다.
아래는 댓글 스키마를 스키마로 정의한 것이다. 마지막의 SchemaFactory는 작성한 스키마 코드를 mongoose 타입의 코드로 변환시켜주는 코드이다. 외부에서는 마지막 줄에서 정의한 객체인 CommentSchema를 import해 사용한다.
필드-컬럼
각 필드를 컬럼으로 바꾸기 위해 컬럼명: 타입 형식으로 정의를 한다. @Prop 데코레이터를 이용해 타입, 필수여부, populate를 사용해야할 때(Join과 비슷한 기능) 가져올 테이블의 이름을 입력할 수 있다. 추가적으로 각 컬럼에 대해 validaion(예: @IsNotEmpty(), @IsString()) 데코레이터를 붙일 수 있고, swagger UI를 위한 @ApiProperty를 지정해서 커뮤니케이션을 보다 더 좋게 할 수 있다..
마지막으로 기본키 설정
MongoDB는 자동으로 _id 값을 설정해주며, 이 값을 기본키로 사용하도록 예약되어있다.
// comments.schema.ts
import { Document, SchemaOptions, Types } from 'mongoose';
import { IsNotEmpty, IsString } from 'class-validator';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { ApiProperty } from '@nestjs/swagger';
const options: SchemaOptions = {
timestamps: true,
};
@Schema(options)
export class Comments extends Document {
@ApiProperty({
description: '작성한 유저 id',
required: true,
})
@Prop({
type: String,
required: true,
ref: 'recipes',
})
@IsNotEmpty()
author: string;
@ApiProperty({
description: '작성한 유저 이름',
required: true,
})
@Prop({
type: String,
required: true,
})
@IsNotEmpty()
@IsString()
name: string;
@ApiProperty({
description: '댓글 컨텐츠',
required: true,
})
@Prop({
type: String,
required: true,
})
@IsNotEmpty()
@IsString()
contents: string;
@ApiProperty({
description: '작성대상(게시글)',
required: true,
})
@Prop({
type: Types.ObjectId,
required: true,
ref: 'recipes',
})
@IsNotEmpty()
info: Types.ObjectId;
}
export const CommentsSchema = SchemaFactory.createForClass(Comments);
참고한 글
https://www.zerocho.com/category/MongoDB/post/59a1870210b942001853e250
(MongoDB) Mongoose(몽구스) 스키마(Schema)
안녕하세요. 이번 시간에는 몽구스 스키마에 대해 알아보겠습니다. 지난 시간에 몽구스는 스키마가 장점이라고 말씀드렸죠? MySQL같은 SQL에 익숙하신 분들은 처음에 MongoDB나 Redis같은 nosql을 사용
www.zerocho.com
https://docs.nestjs.com/openapi/types-and-parameters
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac
docs.nestjs.com
'DB' 카테고리의 다른 글
[캐싱] (1) AWS CloudFront (0) | 2021.10.19 |
---|---|
MongoDB 엔티티 매핑(2): 연관관계와 프로젝트적용 (0) | 2021.10.16 |