• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

필드 추가시 적용해나가는 방법 질문입니다!

21.05.31 16:43 작성 조회수 94

1

강사님.... 강의 진짜 잘듣 고있어요

친구한테도 추천하고...

저의 부족한 지식들을 잘 채워주시고 있으십니다.. 사랑합니다..!

다름이아니라 이렇게 맨처음에 추가하는게 아닌

나중에 느려진 속도를 판단하고 개선해 나아가는 과정에서

1. populate 에서 blog 필드에 아예 데이터를 추가하는 경우는

실무상에서 기존에 생성되었던 블로그는 남겨두고(user,comment가 없는), (user,comment가 있는)blog를 추가를 해나가는 방식인가요 

아니면

2. 바뀐 blog 필드로 기존의 blog 데이타를 전부다 변경하는 방식인가요

사실상 백단에서 클라이언트 단으로 넘기는건 blog 객체이기 때문에 상관은 없어보이지만 2가지 데이터가 같이 있는경우 어떻게 처리하시는지 궁금합니다! 추가적으로 이렇게 필드를 자유자재로 조정할수있는게 진짜 몽고디비의 장점이라고 생각합니다... 으 mysql 로 한다하면끔찍하네요..

-- 추가적인 질문!

서버가 올라가게되면 실제 데이타가 db에 쌓이게 되는데

피드백을 받으면서 개발을 한다하면은 mongo DB 같은경우에는

어떻게 테스트 개발 db와 상용 db 를 구분해 주시는지 궁금합니다!

 가령, 환경변수를 통해서 테스트db와 상용db를 따로 두고 바꿔가면서 진행한다 라던지.... CTO 하시면서 어떻게 설계를 해두셨는지 궁금합니다!

답변해주시면 감사하겠습니다... 강의 진짜 잘듣고 있어요!

답변 1

답변을 작성해보세요.

2

이찬진님 안녕하세요 :)

도움이 된다고 하시니 기분이 좋네요 ㅎㅎ

음 만약에 나중에 comment를 blog를 내장하기로 결정을 하신다면 과거 데이터들도 새로운 스키마에 맞게 변경해줍니다. 근데 이건 좀 다른 얘기이긴 하지만 comment를 내장도 하고 따로 저장을 같이 하기도 해요(수업 뒷부분에 나옵니다).

일반적으로는 스크립트(JS)를 작성해서 과거 데이터들을 변경해줘요. 실수를 방지하기 위해 개발 디비의 샘플 데이터로 충분한 테스트를 거치고 합니다. 방대한 데이터를 업데이트 해야한다면 운영디비에서 데이터를 복사해서 운영 데이터로 테스트 해보는게 좋아요. 원래 생기지 않았던 부하 문제가 생길 수도 있고 데이터 형태가 다양할 경우 예외가 발생할 수도 있으니까요. 부하 문제는 데이터를 나눠서 업데이트 하는식으로 하면 되겠죠? 필요하다면 업데이트 현황을 따로 디비나 메모리에 관리해도 되고요. 중간에 실패해도 재시도하는데 문제 없도록요.

그리고 이런 상황이 아니더라도 버그로 인해 디비에 잘못된 데이터가 들어가거나 테이블이 변경되었을 때도 이런식으로 데이터를 고쳐줘야할 때가 있을거에요. 이런 면에서 MySQL이랑 비교했을 때 데이터 수정하는 접근방법 자체는 비슷합니다. 물론 정규화된 관계형 데이터베이스 특성상 이 작업이 일반적으로 더 간결하긴 할거에요

좀 더 좋은 방법이 하나 있는데요. 이건 일반적이진 않아요. 참고만  해주세요!!

만약 백엔드가 Event Driven Architecture로 구성되어 있다면 상황에 따라 좀 더 쉽게 수정을 할 수도 있어요. 보통 Apache Kafka, Redis Stream, NATS Streaming과 같은 도구를 이용하는데요. React에서의 Redux와 비슷한 느낌이에요. 모든 데이터 변경은 Event를 발생시켜요(publish). 그러면 해당 변경사항을 알아야하는 다른 도메인에서 구독(subscribe)해서 적절한 대응을 하는 구조에요. MSA에서 거의 필수로 쓰이는 백엔드 서비스(도메인)들 간의 통신 수단이에요. Redux에 보면 replay기능들이 있어요. 디버깅할 때 매우 유용하죠. 마찬가지로 질문하신 디비 업데이트 상황에서도 이 replay기능을 활용할 수 있어요.

내장하기 전의 경우 이런식으로 이벤트들이 발생했을거에요.

1. comment서비스에서 "새로운 comment 생성했어! comment 정보:...."

2. 블로그 서비스는 comment 생성 이벤트를 구독하고 있다가 이벤트가 발새하면 해당 블로그의 commentIds에 comment._id만 추가해주고 "블로그에 commentIds가 추가됬어!, 업데이트 정보:..." 라는 이벤트 발생

내장을 적용하게 되면 1.은 바뀌는게 없고 2.에서 로직을 바꾸게 되겠죠. commentIds를 추가하는게 아니라 commets에 comment를 통째로 push해주도록 로직만 수정해줍니다.

근데 대박인건 이렇게 하고 처음에 설명드렸던 script를 생략이 가능해집니다.(적어도 복잡한 부분들은)

모든 이벤트 내역을 히스토리로 가지고 있으면 최초 comment 생성시점부터 재구독(replay)하도록 하면 되요. 부하가 염려된다면 구독 rate를 초당 몇개로 제한할 수도 있고요. 물론 commentIds와 Comment collection은 직접 삭제해주셔야 하지만 이건 훨씬 쉬운 작업이고 그리고 설령 삭제하지 않고 그냥 나둔다고 해도 문제가 되진 않죠. comments필드가 없으면 consistency문제가 생기지만 더 이상 쓰이지 않는 commentIds필드가 존재한다고 문제가 되는건 아니니깐요. 물론 용량을 좀 더 차지 하니 안쓰이는 데이터들은 지워주는게 좋긴 하겠지만요.

너무 "다른 주제"를 짧게 설명드려서 이해가 되셨을지 모르겠네요.. Event driven architecture 관심이 가신다면 꼭 찾아보시길 권장해드려요. React를 하면 Redux같은 상태관리 도구를 거의 필수로 사용하듯이 백엔드 개발할 때 있어서 EDA가 필수가 되는 시점이 올거라고 생각합니다 ㅎㅎ 그리고 참고로 MSA가 아니라 Monolith에서 사용하더라도 전혀 상관 없어요 ㅎㅎ 저도 서비스가 작을 때는 모놀리스에서 EDA로 개발 후 MSA로 전환합니다. EDA만 되어 있으면 Monolith -> MSA는 사실상 배포차이에요 :)

이찬진님의 프로필

이찬진

질문자

2021.05.31

강사님... 여러가지 키워드를 던저 주시는군요! 

지적 호기심이 또 공부할거리를 만들어주었네요 ㅋㅋㅋㅋ

카프카랑 엘라스틱 서치같은걸 눈으로 만 보고있었는데 도커랑 CI 환경에 대해 좀더 공부해보고!

말씀하신거 좀더 알아보겠습니다! 감사해요 강사님...! 최고의 CTO 네요...!