[BE] count 쿼리가 빈번하게 발생할 때 어떻게 해야하나요?

Tags
Back
Person
Status
In Progress
문제가 발생한 기능
게시글 목록
생성 일시
2024/12/02 04:29
group by?? 를 쓰는 방법도 있다..~
참고해보기!
게시글 목록을 만들어서 줘야 하는데.. 댓글 수랑 좋아요 수를 각각 count 쿼리를 날려서 post마다 넣어주는게 맞을까..? 내가 생각하기에는 댓글 수랑 좋아요 수를 post db에 저장하는거는 아닌것 같고.. 그렇다고 comment랑 like count를 매 post마다 날려서 값을 넣어주는건 부하가 크지 않을까?라는 고민이 생겨.
네, 맞아요. 매번 게시글 목록을 반환할 때마다 각 게시글에 대해 댓글 수와 좋아요 수를 각각 count 쿼리로 조회하는 방식은 성능 부하를 유발할 수 있어요. 특히 게시글의 수가 많아지고, 해당 요청이 빈번하게 이루어질 경우, 데이터베이스 부하가 증가할 수 있습니다.
이에 대한 몇 가지 해결책을 말씀드릴게요:
1.
캐싱 사용: 댓글 수와 좋아요 수를 일정 시간 동안 캐싱해 두고, 캐시된 값을 조회하는 방식으로 성능을 개선할 수 있습니다. Redis와 같은 인메모리 데이터 저장소를 사용하면 조회 성능이 크게 향상됩니다.
2.
비동기 업데이트: 게시글에 대한 댓글이나 좋아요가 변경될 때, 비동기적으로 DB에 반영하여 실시간성이 약간 떨어지더라도 최신 상태를 유지할 수 있습니다.
3.
데이터베이스 트리거: 댓글이나 좋아요 수가 변경될 때 자동으로 관련된 수치를 업데이트하는 DB 트리거를 설정할 수도 있습니다. 다만 이 방법은 DB 종속성이 커지는 단점이 있습니다.
4.
주기적인 배치 작업: 배치 작업을 통해 특정 시간마다 게시글의 댓글 수와 좋아요 수를 계산하여 업데이트하는 방식도 고려해 볼 수 있습니다.
즉, 시스템의 성능과 실시간성의 균형을 고려해 최적의 방법을 선택하는 것이 중요합니다. 주로 실시간성이 엄격히 요구되지 않는다면 캐싱과 주기적 배치를 활용하는 것이 좋은 절충안이 될 수 있습니다.
캐싱 사용하는 법을 자세하게 알려줘
사용법
배치 작업도 어떻게 하는지 자세하게 알려줄래?
사용법
우선 댓글 수와 좋아요 수를 각 post마다 쿼리를 날려서 가져오는 방법을 사용하고, 이후에 캐싱이든.. 배치든.. 이용해서 리팩토링 하는 걸로 결정하겠습니다…