말하는 감자

Community 시스템 설계 하기 본문

Backend/django project

Community 시스템 설계 하기

개똥벌레25 2020. 11. 17. 10:46
728x90

Community 시스템 설계 하기

이어서 각 논문마다 댓글창을 구현하는 과정을 보이려고 한다. 사용자가 논문을 검색하면, 그 논문에 대한 질문을 주고 받을 수 있는 커뮤티니 창을 만드는 것이 목표다. 그러나, Pubmed에 존재하는 논문의 개수는 몇십만개가 넘고, 각 논문마다 일일이 모델 오브젝트를 만들어서 댓글창을 구현할 수도 없는 노릇이다. 그래서, 생각해낸 방법은 어차피 모든 논문에 사람들이 댓글을 달 거 같지는 않고, 사용자가 질문을 initiate할 때에만 오브젝트를 생성하는 것이 database storage에도 효율적이고 구현도 가능해 보이기 때문에, 그 방법을 설명할 것이다. 

 

일단 사용자가 질문을 만들고 싶을 때 채울 수 있는 Post 모델을 먼저 설계한다. 질문의 제목에 해당하는 title, 자신의 아이디가 들어갈 author, 어떤 논문에 대해서 질문을 생성된 것인지 보이는 base_title, 그 논문의 고유 식별 아이디인(pubmed 사이트에서 제공한다) base_id, 그리고 질문 내용인 body, 글을 작성한 시간인 publish. 이때 author는 장고에서 자체적으로 제공하는 User 모델을 참조한다. (이 User모델로 회원가입, 로그인, 로그아웃을 간단하게 구현할 수 있다.) 이렇게 6가지 attribute를 가지는 모델을 생성하고, migrate 해준다.

 

또한, 사용자가 만든 질문에 다른 사용자들도 댓글을 달 수 있도록 Comment 모델을 설계한다. 올라온 글의 아이디를 참조하는 외래키 post, 댓글을 작성하는 본인 아이디 name (마찬가지로 장고에서 제공하는 User모델을 참조한다), 댓글의 내용 body, 그리고 생성된 날짜 date_added 들의 attribute를 가진다. 

 

그 다음으로 template, url, view 이 세가지를 적절하게 작성하여 사용자가 질문 추가하는 동작을 할 수 있도록 하면 된다. 다만 이 경우 어떤 논문위에 기반하여 작성했는지 알아야 하기 때문에 논문을 검색한 결과를 크롤링한 이후부터 base_id를 함수간에 놓치지 않고 계속 전해 주어야 한다.template에서 받아올 때에는 form 안에서 즉, hidden타입으로 보내주면 된다. 

//template
<form action="//views.py 안의 실행할 함수 이름">
<input type="hidden" name="theid" value="{{pmcID}}"/>
</form>

//view.py의 함수
...
data = request.GET['theid']

이 외에도 글을 작성, 수정, 삭제, 댓글을 작성, 수정, 삭제 기능이 있지만 그 부분은 반복되므로 생략하겠다. 다른 사용자들이 작성한 글을 불러와 논문의 id로 필터링하여 보여주게 하면, 해당논문에 대하여 올라온 글들을 모두 볼 수 있다.

Comments