티스토리 뷰

Github Repo

https://github.com/wanted-wecode-subjects/aimmo-subject-teamB

개요

  • 회원, 게시글, 댓글 API 만들기

개발 기간

  • 2021.11.01 - 2011.11.03

개발 환경

  • TypeScript
  • NestJS
  • MongoDB

사용 라이브러리

  • bcrypt
  • passport
  • mongoose
  • class-validator

구현 사항

  • 회원 로그인 구현
  • 게시글 CRUD
  • 게시글 pagination
  • 게시글 조회수 카운트
  • 게시글 검색
  • 게시글 카테고리
  • 댓글 CRUD
  • 대댓글(depth: 1)
  • 대댓글 pagination

대댓글

MongoDB self ref을 사용하여 대댓글을 구현하였습니다.
댓글의 schema는 다음과 같습니다.

Comment {
  content: string;
  author: string;
  depth: number;
  parentCommentId: string;
  comments: Comment[];
  created_at: Date;
  updated_at: Date;
  postId: string;
}

댓글의 경우 depth가 0이 되고, parentCommentId에는 빈 값이 들어갑니다.
그리고 대댓글은 depth가 1이 되며, parentCommentId에는 부모 댓글의 _id가 들어갑니다.

 

이 과정에서 comments의 comment가 자기 참조를 할 수 있도록 @Prop 데코레이터를 @Prop({type: [{type: mongoose.Schema.Types.ObjectId, ref: 'Comment'}]}) 와 같이 적용하였습니다.

src/comment/comment.schema.ts

  @Prop({type: [{type: mongoose.Schema.Types.ObjectId, ref: 'Comment'}]})
  comments: Comment[] | null;

예시

댓글이 존재하는 상황에서 대댓글이 등록되면 다음과 같이 조회가 됩니다.

{
    "_id": "618176d0bf01ef0f96c163bb",
    "postId": "postId",
    "updated_at": "2021-11-02T17:35:12.347Z",
    "created_at": "2021-11-02T17:35:12.347Z",
    "comments": [
        "618176fabf01ef0f96c163c2",
    ],
    "depth": 0,
    "author": "testuser",
    "content": "댓글",
    "__v": 3
}

회고

NoSQL을 처음 써보게 되어 초기에 진행이 더뎠습니다.
또한, 초기에 ORM으로 사용하려던 TypeORM이 MongoDB와는 호환이 잘 안되는 이슈가 있어 진행에 어려움을 겪었습니다.
예를 들어, 데이터 조회시 typeorm mongodb cannot read property 'prototype' of undefined 같은 에러가 발생하는 경우가 있습니다. 이는 버전에 대한 문제로 인해 발생하는 이슈이며, 이 때문에 mongoose를 대체로 사용하였습니다.
(관련 글: TypeORM + MongoDB 적용 및 사용하지 않게 된 이유)

 

NoSQL로 스키마를 작성하고, 기능을 구현하였으나, NoSQL스럽게 스키마를 작성하고 코드를 구현하였는지도 약간 의문스럽습니다.

예를 들어, comment의 postId 같은 필드가 foreign key 처럼 사용된 것 같아 꺼림칙합니다.

 

한가지 다행이라고 생각되는 점은 이후에 NoSQL을 사용할 때 오늘만큼을 헤매지 않을 것 같다는 점입니다.
추후 제가 만들고자 하는 애플리케이션의 DB로 NoSQL을 사용한다거나 관련된 내용을 마주했을 때 좀 더 가벼운 마음으로 개발을 진행할 수 있을 것 같습니다.

Comments