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

알락·2022년 11월 23일
0

Simple-SNS

목록 보기
5/9
post-thumbnail

개요

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

배경

Messages and Reply UML

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

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

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

진행

model change

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

⌞ 변경 후 이점

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

필요없는 필드 삭제하기

field to remove

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

[필드 삭제]

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

clean data

적절하게 잘 삭제되었다.

정리

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

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

0개의 댓글