NoSQL다운 MongoDB

Sinf·2022년 2월 5일
0

고민의 흔적

목록 보기
7/38

MongoDB

그동안 DB를 사용할 땐, MySQL을 사용했습니다. SQL 쿼리를 이용한 RDB에 익숙해져 NoSQL, 도큐먼트 기반의 MongoDB를 사용할 때도 RDB를 사용하는 것과 같이 사용하고 있었습니다.

익숙한대로 사용하는 것이 좋은 것일까?
고민과 함께 MongoDB는 어떻게 다루는 것이 좋을지 찾아보게 되었습니다.

Table vs Collection

먼저, RDB에서는 데이터를 Row 단위로 저장하게 됩니다. 정의된 Table의 컬럼에 맞게 값을 채웁니다.

그래서 먼저, Table이 정의되고, 그에 맞게 값을 넣기 때문에 표와 같은 형식으로 값을 갖게 됩니다.

RDB 테이블 조회 결과

MongoDB는 Collection에 Document로 데이터를 저장합니다. RDB와 다르게 먼저 값이 하나 하나 정의되지 않아도 JSON과 같은 형태로 값을 저장합니다.

MongoDB 컬렉션 조회 결과

MongoDB를 사용하는 경우 조금 더 자유롭게 데이터를 저장하고 다룰 수 있는 것 같습니다.

게시판 댓글을 구현할 때

2차 팀플에서 게시판의 댓글과 대댓글을 구현하기 위해 구현 방식을 찾아보게 되었습니다.

MongoDB는 RDB와 다른 특징을 갖기 때문에 구현함에 있어 글-댓글-대댓글 테이블 간의 관계를 이용하지 않고, 구현할 수 있다는 것을 알게 되었습니다.

단순하게 먼저 생각한 방식

기존에 생각하던 방식은 글-댓글-대댓글이 각각 테이블의 형태를 갖고 외래키를 통해 자신이 속한 부모 ID를 참조하는 방식을 생각했습니다.

테이블 간의 관계도

댓글을 가져올 때, 글의 id 값을 통해 댓글 Collection에서 같은 pid를 가진 Document를 끌어오는 것을 생각했습니다.

MongoDB의 특징을 사용할 때

MongoDB는 Document 형식으로 데이터를 저장하기 때문에 조금 다르게 구현할 수 있었습니다.

글 Document 하위에 comments라는 필드를 따로 두고, 배열 형식으로 댓글을 저장하는 방식이었습니다.

{
	_id: ObjectId('kj13jf0sdf9j1mckds'),
  	title: 'Post title',
  	contents: 'Post contents',
  	comments: [
    	{
      		_id: ObjectId('652ejf0sdf9j1mc123'),
          contents: 'Comment contents'
    	}
    ]
}

다른 컬렉션으로 댓글을 관리하는 것이 아니라, 글 Document 하위에서 댓글을 관리하는 것입니다.

글이 삭제된다면 Document가 삭제되면서 자연스럽게 댓글도 삭제될 것입니다.

RDB에서 테이블 간의 관계를 정의하고 연결하는 과정을 거치지 않아도 됩니다.

댓글의 CRUD

댓글의 CRUD에 있어서도 MongoDB에서 제공하는 Operator를 사용해 배열을 조작할 수 있습니다.

다음은 Mongoose를 활용해 MongoDB 댓글을 생성하는 과정입니다. 먼저 댓글에 대한 스키마는 따로 정의되어 있다고 가정합니다.

const contents = 'Comment contents';

// 댓글 스키마로 댓글 생성
const comment = new Comment({
	contents
});

// postId 값으로 Post에 접근 후 수정
Post.findByIdAndUpdate(pid, {
  $push: {comments: comment}
});

MongoDB에서 도큐먼트 내 배열을 다룰 수 있는 Operator를 제공합니다.

$push, $pull, $set과 같은 Operator를 통해 댓글이 저장된 배열에 접근해 생성, 수정, 삭제 등을 진행할 수 있습니다.

어떤 DB를 다룰까

부족한 경험으로 판단할 때, MongoDB를 사용해 구현하는 방식이 조금 더 쉽게 구현되었습니다. Table 정의, Table 간의 관계, Table을 어떻게 JOIN해 가져올 것인가에 대한 고민 등 RDB에서 고려할 것들을 하지 않아도 기존의 JSON 형태의 데이터를 다루는 것과 같이 더 단순하게 구현하게 되었습니다.

RDB와 NoSQL을 비교하는 글들을 읽어보게 되었는데, 서로가 가지는 장단점이 있었습니다. NoSQL이 조회가 더 빠르다, 하지만 RDB에서 index를 활용하면 비슷하다, 수정 삭제에 있어 RDB가 더 좋다, 등등 여러 의견들이 있었습니다.

저와 같은 주니어의 경우 가고자 하는 기업의 기술 스택을 준비하는 것이 맞다고 생각합니다.

인프런 자격요건을 기준으로 기술 스택을 준비하는 편인데, Postgresql을 사용하시기 때문에 저는 RDB로 구현하는 방식에 대해서 더 준비할 듯 싶습니다.

profile
주니어 개발자입니다. 🚀

0개의 댓글