모델 변경 이유와 필요 없는 필드 제거하기 [TOY / Simple-SNS ]

알락·2022년 11월 23일
0

Simple-SNS

목록 보기
5/9
post-thumbnail

개요

몽고DB를 이용하여 프로젝트를 진행하다가 데이터 모델을 바꾸게 되었다. 하지만 현재까지 더미로 만든 데이터들을 삭제하는 것보다는 유지하여 사용하는 것을 택하기로 하였다.
하지만 모델이 변경되면서 사용하지 않는 필드가 생겼으니, 이 필드와 필드값만 삭제시켜주기로 했다.

배경

문제의 도큐먼트는 위와 같다. 현재 구현하는 SNS 서비스는 메시지를 남길 수 있고, 메시지에 대하여 댓글을 남기는 기능을 제공한다. 기존에는 댓글 도큐먼트를 따로 구성하여 Messages의 reply 필드의 배열에 추가하는 형식으로 댓글을 구현하려고 했다. 하지만 이처럼 구성을 할 때 여러 문제점들이 생겨났다.

⌞ 하위 도큐먼트로 구현할 시 문제점

  • 댓글의 댓글(대댓글), 대댓글의 댓글(대대댓글), 대대댓글의 댓글(대대대댓글). 메시지 하나를 불러오는데 앞서 소개한 사례가 발생한다면 메시지 하나의 크기가 너무 무거워진다. 이왕이면 간단한 쿼리문으로 가져오고 싶지만 앞선 구현에서는 이와 같은 문제가 발생한다.
  • 메시지와 거의 비슷한 모델을 갖고 있지만 메시지 모델을 재사용하지 못한다.
  • id값으로 쓰는 objectId 가 Messages와 Reply 각각에서 관리가 된다. 하지만 본인은 메시지 디테일 화면에서 해당 objectId를 고유식별자로 메시지와 댓글을 동등하게 관리하고 싶었다.

진행

댓글을 배열로 관리하던 필드를 다른 메시지의 id값을 참조하는 replyTo 필드로 바꿔주었다.

⌞ 변경 후 이점

  • toReply의 값이 null 이면 메시지고, replyTo 어떤 값이라도 참조하고 있다면 해당 메시지나 댓글의 댓글이 된다. 이렇게 형성된 replyTo는 트리 구조로 구성되어 관리가 용이하다.
  • reply와 message 의 id를 동등하게 관리할 수 있다.

필요없는 필드 삭제하기

도큐먼트 모델이 바뀌어서 이제 사용되지 않는 필드값을 삭제하려고 한다. 위와 같이 '댓글 테스트 2'와 '여기는 들어가지?'라는 메시지에는 각각의 reply가 존재한다. 위 데이터만이 아닌 모든 데이터에서 해당 reply 필드를 삭제시켜주자.

[필드 삭제]

// mongosh
> db.messages.updateMany({},{$unset : {reply:""}})

적절하게 잘 삭제되었다.

정리

NoSQL 을 이용하는 DBMS는 SQL을 이용하는 DBMS 보다 모델을 더 고민하게 된다. 모델의 변경과 적용은 당연히 쉽다. 하지만 정규화를 사용하는 기존의 방식은 모델을 구현하는 최소한의 규칙을 지키면 되었는데, 역정규화로 쿼리를 단순하게 만드는 것으로 관점이 달라졌기 때문인 것 같다. 자유에 대한 대가라고 생각한다.

profile
블록체인 개발 공부 중입니다, 프로그래밍 공부합시다!

0개의 댓글