목차

반응형

내 질문

안녕하세요 저는 커뮤니티 어플리케이션의 백엔드 부분을 구현하고 있습니다.

서버는 nodejs와 mongodb에 mongoose를 사용하고있습니다.

다름아니라 mongodb가 단일 컬렉션에 대한 질의는 정말 편하고 빠르다는 것을 장점으로 생각하여 어플리케이션의

db를 mongodb로 선택하게 되었고 서버스크립트의 작성이 거의 끝난 상태입니다.

하지만 커뮤니티라면 거의 필수적으로 있는 게시물 컬렉션, 게시물에 대한 댓글 컬렉션의 조인을 구현하면서

두가지 의문이 생겼습니다.


제가 인터넷에서 찾아본 결과 'mongodb는 rdbms가 아니기 때문에 rdbms의 핵심인 PK와 FK에 의한 참조 관계를

 피해야한다' 라는 의견이 대다수였습니다.

하지만 정말 단순한 커뮤니티에서도 게시물과 댓글에 대한 조인은 피할 수 없다고 생각하는데 도대체

mongodb를 사용한 커뮤니티는 게시물과 댓글에 대한 관계를 어떤 방식으로 구현했는지 궁금합니다.


또한 여러개의 컬렉션을 조인하기 위해서 aggregation의 lookup, pipeline을 사용하거나

두번의 중첩된 find문을 통하여 javascript로 push하는 방식으로 조인 기능을 구현하였습니다.

아래 사이트의 소스코드가 제가 말씀드린 두가지 방식입니다. 참고하시면 좋을 것 같습니다.

https://stackoverflow.com/questions/50545105/are-there-any-better-ways-joining-two-collections-in-mongodb-in-nodejs

rdbms라면 join문을 사용하면 되는 간단한 상황이지만

mongodb에서는 이렇게 복잡한 쿼리문과 코드로밖에 구현을 못하는 것인지 여쭤보고싶습니다.

감사합니다.



답변

일단 몽고디비(Nosql)는 최대한 조이닝을 안하는 방향으로 사용합니다. 도큐먼트의 고유 값으로 최대한 쿼리를 하는게 몽고디비의 핵심입니다. 너무 헤비한 데이터가 아닌이상 참조관계보다 서브도큐먼트를 이용하는게 제가 봤을땐 더 좋을 것 같네요. 조이닝이 많아지는 기능의 DB를 설계하는데 NoSql을 선택했다는 것 자체부터 DB선택에 에러가 있다고 생각하구요.. 조이닝이 많이 필요한 구조면 당연히 관계형 DB를 사용하는게 맞죠 그게 아니라면 MongoDB 서브도큐먼트를 자유자제로 다룰줄 알아야 합니다. 서브도큐먼트도 제어하기가 꽤 복잡하기에 디비에 자신이 크게없거나 공부에 시간을 많이 투자를 못한다하면 일반적으로 mysql이 낫겠네여


Q1. mongodb를 사용한 커뮤니티는 게시물과 댓글에 대한 관계를 어떤 방식으로 구현했는지 궁금합니다.


A1. 현재 단쿠키는 게시글에 대한 모든 댓글, 좋아요, 싫어요 등을 서브도큐먼트로 처리했습니다.



Q2. 저희코드에서 어그리게이션이나 중첩 find문이 속도 저하의 원인인지 궁금합니다.


A2. DB상에서 연산은 서버의 연산보다 2~3배 정도 느리기 때문에 DB상에서 연산은 최대한으로 줄여야합니다. 어그리게이션은 사실 서비스 보다 디비 분석을 위한 연산이라 CRUD 서비스에서는 속도가 매우 느리고 과부하가 걸릴 수 있죠.



Q3. 서브도큐먼트를 쓰면 만약 좋아요 개수를 하나 늘리는데 게시판 전체 컬렉션을 참조해야되고 또 한 도큐먼트에 너무 여러가지 정보가 담겨서 관리면에서 좀 복잡해지지 않을까요? 단쿠키는 왜 몽고디비를 선택했나요?


A3. 노드JS랑 궁합이 잘 맞으니까요ㅠ 그래서 이제 DB 인덱싱을해야 쿼리 효울성이 높아지긴 하는데 인덱싱 어그리게이션 서브도큐먼트 맵리듀스 등 .. 을 종현이형이나 제가 잘 쓴다고 자신을 하고 개발했지만서도 아직도 단쿠키도 디비 구조에 문제가 많거든요 ㅠ 최근에 저희도 mysql로 롤백할까 생각도 가끔해요 디비라는건 한번 구조가 잡히고 서비스 된다면 바꾸기가 힘드니깐요 ㅜ



Q4. 추후에 쇼핑에 결제기능까지 추가할건데 그렇게되면 몽고디비를 쓰는데있어서 또 문제가생길까요?


A4. 결제기능을 어떻게 추가하실지는 모르겠지만 계좌이체방식이면 오히려 JSON형식으로 관리하는 몽고디비가 편할수도있겠네요 하나의 도큐먼트에 모든 정보가 직관적으로 들어가있기에 json이 보기편하고 관계형이 오히려 불편할수도있어요



Q5. 혹시 몽고디비 사용할때 생긴 문제점이 뭐가있었나요? 저희도 고려해야하는 부분이 있을까 싶어서요


A5. 댓글을 서브도큐먼트로 처리하는데 댓글을 검색할때 서브도큐먼트를 다 통과하는 알고리즘으로 검색을 해야하는데 

기존처럼 관계형 DB였다면 댓글 테이블만 찾으면 될 것을 서브도큐먼트니깐 더 연산이 오래걸리더라고요.. 그래서 아직 댓글검색 기능은 보류중입니다.


기존 mongodb로 작업되어있던것 전부다 mysql로 갈아타기위해서 작업 준비중이다.

질문에 친절하게 답변해주신분은 현재 단국대학교 사이트 개발자분이시다. (감사합니다.)

http://www.dankookie.com/

에효...

반응형