데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [MSA 패턴] CQRS와 Materialized View를 활용해서 조회성능 확보하기

      해리쓴 23.12.14
      4,301 21 3
      DEVOTEE 요약
      마이크로서비스 아키텍처에서 각 서비스 의존도를 낮추고 조회 성능을 향상시키기 위해서는 CQRS 패턴과 Materialized View 방식을 활용해 서비스간 정보를 병합하는 별도의 서비스를 구성해야 합니다. 예를 들어, 상품과 후기 정보를 병합해 조회할 수 있는 새로운 서비스를 만들고, 상품 추가, 삭제, 변경, 후기 등록 등의 경우에 메시지를 발행해 해당 정보를 병합해 DB에 저장하게 됩니다. 이렇게 하면 사용자는 병합된 정보를 통해 상품 후기를 참고해 상품을 선택할 수 있습니다.
      DEVOTEE 추천 블로그

      안녕하세요. 해리쓴입니다.


      오늘 제가 풀어볼 주제는 마이크로서비스 아키텍처 같은 분산환경에서 성능을 확보하는 방법, 특히 각 서비스의 의존도를 높이지 않고 조회 성능을 확보하는 방법입니다.


      우리에게 익숙한(?) 모놀리스 구조의 애플리케이션은 하나의 큰 애플리케이션과 통합DB로 구성되어 있습니다.

      사용자가 무엇을 요구하더라도 DB내의 각 테이블을 Join해서 원하는 결과를 얻어낼 수 있습니다.

      image.png

      위 이미지에서 DB내에 있는 두 Table이 상품과 후기 정보를 저장하는 테이블이라고 가정해봅시다.

      상품을 구매하기 위해 상품 후기를 참조해서 구매하려고 한다면, 상품 Table과 후기 Table을 Join 해서 후기가 좋은 상품을 검색할 수 있게 됩니다.


      그런데 마이크로서비스 구조로 시스템이 구현되어 있다면, 어떻게 될까요? 애플리케이션과 DB가 분리되어 있어서 Join은 쓸수 없습니다.

      image.png

      이런 경우에는 사용자에게 상품 후기를 참조해서 상품을 고를 수 있게 하려면, 누군가 분리되어 있는 정보를 병합해야 합니다.

      그럼 이 병합 기능은 어떤 서비스에서 하는게 맞을까요?

      상품 서비스에 둔다고 하면, 상품을 조회할때마다 후기 서비스로 상품별 후기 정보를 요청해서 받아야 합니다.

      예를 들어 상품을 조회할때 10개씩 보여 준다고 10번은 호출해야 한다는 것이죠.


      이런 경우 서비스간 의존도는 높이지 않고, 두 서비스의 협력(?)으로 해결해야 할 요구사항은 아래와 같이 상품과 후기 정보를 결합한 별도 서비스와 DB를 구성하고,

      새로운 상품의 추가나 삭제, 상품 가격 등 속성이 변경되는 경우, 상품의 후기가 등록되거나 수정되는 경우, 각각 메시지를 발행해서 상품 정보와 후기 정보를 결합해서,

      사용자가 상품 후기를 참조해서 상품을 고를 수 있도록 데이터를 저장하는 방식으로 해결할 수 있습니다.

      image.png

      상품, 후기 서비스의 변경은 Query Service를 통해 상품과 후기 정보를 결합하는 기능을 수행하고, 결합된 데이터는 DB에 Matrialzed View 형태로 저장됩니다.


      Materialized View 방식은 어떤 결과를 뽑아 내는 쿼리가 빈번히 사용 되는 경우 또는 시간이 많이 걸리는 Query의 수행속도 향상하기 위해서와 같이 비용이 많이 드는 Join이나,

      Aggregate Operation 을 처리해야 하는 SQL을 위해, 데이터베이스의 한 Table(Materialized View)로 저장 하며, 그 테이블을 조회 하도록 하는 방식입니다.


      이 방식을 마이크로서비스 아키텍처에서 Message Broker를 활용해서 구현하는 것입니다.


      또 다른 방법으로 Serverless App이 상품과 후기 DB를 주기적으로 모니터링하다가 변경사항을 Materialized View가 있는 DB에 업데이트하는 방식으로도 구현할 수 있습니다.

      image.png

      정리하면,

      분리된 서비스에서 관리하는 데이터의 결합이 필요한 경우, 두 서비스와 데이터의 의존성을 높이지 않고 원하는 기능을 구현하기 위해서는

      아래 그림과 같이 CQRS 패턴과 Martialized View 패턴을 활용해서 아래와 같이 구현할 수 있습니다.

      image.png

      패턴이라는 용어를 썼더니 뭔가 어렵고 학술적인 느낌이 물씬 나는 것 같습니다.

      패턴이란 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결방식입니다.

      패턴은 재사용, 재활용하는 코드 수준이 아니라 특정한 문제를 해결하는 방식을 알려주는 개념으로 옛날 책에서나 나오던 패턴을 활용해서 현재의 문제를 해결하는데 적용해 보았습니다.


      그리고 본문의 다이어그램은 "excalidraw.com"에서 그렸습니다. 전문 설계 도구나 PPT보다 훨씬 사용하기 편합니다. 한번 써보세요.


      읽어주셔서 감사합니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      해리쓴 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기