MongoDB 엔티티 매핑(1)

목차

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
  Comments,     Trackbacks