해결된 질문
작성
·
24
0
안녕하세요 질문있습니다.
만약 게시글 전체 조회할 때 게시글 마다 좋아요 수도 함께 기재하려고 하면 게시글 조회 할 때 마다 articleId에 맞는 좋아요 수 정보도 함께 필요하잖아요?
현재 게시글 서버와 좋아요 서버가 다른 환경을 고려할 때 그러면 게시글 조회할 때 마다 좋아요 서버로의 api요청이 불가피할 거 같은데 이 경우 조회 성능이 당연히 안좋게 나올 수 밖에 없다고 생각합니다.
비정규화로 좋아요수를 게시글 테이블에 붙여서 단일 서버로의 요청을 만들어줄려고 해도 말씀하신 한계 때문에 안될 거 같구요.
만약 게시글 전체 조회 시에 게시글과 게시글의 좋아요수가 반드시 제공되어야 한다면 제가 생각한 성능 저하 포인트가 타당한가요? 만약 타당하다면 어떻게 개선할 수 있을까요? 인기게시글만 따로 추려서 레디스로 메모리를 활용해야할까요?
답변 2
1
leettletree님, 안녕하세요!
말씀하신대로 게시글마다 좋아요 수(뿐만 아니라 조회 수, 댓글 수 등)도 항상 같이 조회하는게 일반적인 조회 패턴입니다.
이 경우 데이터 조인을 위한 작업은 당연히 필요하게 되고요.
아무래도 단일 테이블에서 조회하는 것도 아니고, 심지어 단일 DB에서 조인할 수 있는 것도 아니면서,
네트워크 통신을 통한 마이크로서비스 간에 애플리케이션 조인을 해야하므로 성능에 대한 고민도 당연히 뒤따를 수 밖에 없습니다.
이를 위한 성능 최적화에 대한 부분은 마지막 챕터 "게시글 조회 최적화 전략"에서 학습하게 됩니다.
해당 챕터에서 다루는 해결 전략을 간단히 언급 드리면,
쿼리 요구사항을 만족하기 위한 “쿼리 모델”을 별도로 구성하는겁니다.
(게시글 + 좋아요 수 + 조회 수 + 댓글 수)를 통합된 하나의 단일 모델로 만들고, 통합된 모델을 보여줘야하는 클라이언트 영역에서는 위 쿼리 모델을 응답해주면 됩니다.
강의에서는 Redis(메모리)에 쿼리 모델을 관리하는 방향으로 진행합니다.
이러한 데이터를 만들기 위한 구체적인 방법과 최적화 전략, 고려해야할 부분들은 강의 듣다 보면 학습하시게 될겁니다!
물론, 해결 방법이 위 전략만 있는건 아닙니다. (여기는 강의에서 다루지 않는 부분입니다.)
데이터 조인하는게 많지 않다면 애플리케이션에서 조인하는 것도 그렇게 큰 성능 부담으로 다가오진 않습니다.
물리적으로 가까운 또는 동일한 네트워크에 위치한다면, 네트워크 통신도 빠르게 처리 됩니다.
동기적으로 여러 개의 데이터를 조인하는 작업은 병목이 생길 수도 있는데요, 이에 대한 해결책으로 멀티스레드 또는 리액티브 방식으로 병렬 조회하여 개선할 수도 있습니다.
게시글 조회할 때 마다 좋아요 서버로의 api요청이 불가피
위에 대한 내용도 간단히 설명 드리면, 의존성 순환 참조 문제로 인해 위와 같은 요청 방향은 지양하는게 좋습니다. (의존성에 대한 내용은 마지막 챕터 CQRS에서 언급됩니다.)
의존성 문제는 CQRS를 통해서 해결할 수도 있고, 그냥 하나의 마이크로서비스로 통합하여 패키지/모듈 수준에서 관리할 수도 있고, 클라이언트의 요청부터 각 마이크로서비스로 향하는 흐름 중간에 데이터 조인해주는 레이어를 하나 만들어도 됩니다.
이러한 레이어는 클라이언트 개발자들이 서버를 구성할 수도 있고(BFF), 백엔드에서 클라이언트 개발자를 위한 레이어를 구성해줄 수도 있습니다. 또는, 사용자 기기(브라우저/앱)에서 여러번 호출해서 조인해줘도 됩니다. (어떤 영역은 늦게 뜨고, 어떤 영역은 빠르게 뜨고 등의 사용성도 종종 경험해 보셨을 것 같습니다.)
여기에서 구체적인 내용까지 다루기는 어렵지만,
비용, 생산성, 팀의 상황, 학습 수준, 성능 등 고려하여 적절한 방법과 구조를 찾아서 성능 문제를 개선할 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. leettletree님.
질문 주신 내용은 게시글 조회 시, 각 게시글의 좋아요 수를 함께 제공하는 것과 관련된 성능 문제입니다. 이와 관련하여 몇 가지 해결책을 제안드리겠습니다.
현재 게시글 서버와 좋아요 서버가 분리되어 있고, 각 게시글에 대해 좋아요 수를 함께 조회해야 한다면, 게시글 조회 시마다 좋아요 서버로 API 호출이 필요해집니다. 이런 방식은 여러 개의 네트워크 호출을 초래하게 되어 성능 저하의 원인이 될 수 있습니다.
비정규화:
캐싱 사용:
데이터 동기화 주기 조정:
결합 데이터 모델:
위의 방법들을 참고하여 구현하시면 좋겠습니다. 추가적으로 멀티 서버 환경에서의 데이터 동기화 및 캐싱 전략에 관한 질문을 확인해보시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
친절한 답변 감사드립니다.
바로 강의 들으러 가볼게요!