데이터베이스를 좀 더 효과적으로 사용할 수 있는 방안에 대하여 함께 고민해보려한다. 현재 웹사이트 webisfree.com을 기준으로 좀 더 효과적인 데이터베이스 운영 방안은 없을까?

현재 webisfree.com은 많은 글들이 오랜기간에 쌓여있다. 일일 방문자 역시 적지않으며 이를 대응하기 위하여 좀 더 효율적인 db관리 및 운영이 필요하다. 먼저 어떤 부분이 개선이 필요할까? 현재 당면한 문제는 아래와 같다.


많은 수의 MongoDB 조회 및 업데이트 콜 줄이기


다양한 장르의 글을 제공하다보니 신규 글관련 글... 추천 글 등등 너무 많은 데이터베이스 콜이 존재했다. 그 중 대표적인 부분을 간략하게 나타내면..

  • html meta태그에 추가할 메타 데이터 정보
  • 방문자 수를 늘리는 count + 1
  • 관련 콘텐츠를 가져오기 위한 조회
  • 이전 글을 가져오는 db 조회
  • 다음 글을 가져오는 db 조회
  • 신규로 등록된 글의 목록을 가져오는 조회

눈으로 확인해봐도 한페이지에 불러오는 데이터베이스 조회 및 업데이트가 적지 않다... 이를 모두 없앨 수는 없지만 누가봐도 개선 포인트가 많다. 좀 더 효과적인 방법이 필요해보인다.



# 신규로 업데이트된 글 관리하기

모든 부분을 언급하기 보다 가장 큰 부분으로 전체 데이터를 조회해 가장 최근의 글을 조회하고 보여주기 위한 신규 콘텐츠의 부분이 가장 커보였다. 이를 개선하는 방법은 무엇이 있을까?


! 신규 콘텐츠만 담은 작은 컬렉션을 만들어 따로 조회하기등록된 글이 10만개라면 모든 데이터를 조회하여 신규 콘텐츠를 날짜별로 가져오는 일은 엄청난 로드가 걸린다. 이런 매우 비싼 쿼리는 따로 분리하여 하나의 콜렉션에 저장하는 방법이 필요하다.

따로 저장은 했지만 새로운 글이 저장될때마다 최신 글로 보여줄 필요가 있는지 생각해봐야한다. 만약 반드시 그럴 필요가 없다면 최근 글의 목록은 실제 데이터를 가진 주 데이터베이스와 Sync를 맞추는 업데이트 작업에 어느 정도의 시간 텀을 갖도록한다. 만약 반드시 실데이터와 일치해야한다면 업데이트 삭제 등의 조작이 생길때 이를 반영하는 코드를 추가하여 해결하는 방법이 있다.


! 최신 글 목록을 캐싱하기인메모리 데이터베이스를 사용하여 서버에서 캐싱되도록 조치함으로써 성능을 개선할 필요가 있다. redis를 사용한다면 새로운 글이 생성되기 이전까지 동일한 목록이 존재하므로 이를 캐시해두고 방문자는 캐시에서 최신글을 얻도록한다. 다만 TTL(Time To Live)를 설정해두어 일정시간이 지나면 해당 데이터를 폐기, 삭제해야하며 또 신규 업데이트 또는 삭제 등의 조작시 캐시된 데이터를 만료함으로써 실제 데이터베이스와 싱크를 맞출 수 있게된다.