MongoDB 기술면접

김석규·2023년 2월 21일

일반적인 RDB는 기술 면접 준비로 자주 찾을 수 있는데 MongoDB는 찾기가 힘들어 문서를 작성했습니다.

MongoDB란?

MongoDB는 C++로 제작된 문서지향 오픈소스 NoSQL 데이터베이스. 비정형 데이터를 JSON형식으로 데이터를 저장한다.

기본적으로 프로시저 대신 JavaScript 객체를 사용하며 동적 데이터베이스 스키마를 사용한다.

DB에서 데이터를 검색하기 위해 필드, 범위기반, 문자열 패턴 일치 등 쿼리를 지원.
확장 또는 축소가 쉽고 데이터 파티셔닝 지원기능이 내장되어 있다.

  • 문서 - 관련 값이 있는 정렬된 키/값쌍의 집합. 맵 또는 해시로 표시되고 JavaScript에서 문서는 객체로 표시된다.

  • 컬렉션 - 문서 그룹. RDB의 테이블에 해당한다. 동적 스키마이기 때문에 여러 모양의 문서를 단일 컬렉션에 저장할 수 있다.

  • 몽고 쉘 - 명령줄에서 MongoDB 인스턴스와 상호작용하는 JavaScript 쉘. 이를 통해 관리 및 인스턴스 검사, MongoDB 탐색을 할 수 있고 임의의 JavaScript 프로그램을 실행 할 수 있다.

  • 스케일 아웃 - 샤딩은 여러 물리장비에 데이터를 분산하는 방법으로 MongoDB는 샤딩을 통해 스케일 아웃을 진행한다. 데이터 셋을 여러 서버로 나누고 각 서버 인스턴스에 데이터베이스 로드를 분산한다.
    대표적으로 Shard, Mongos, Config servers 3요소가 필요하다.

    • Shard - 가장 기본이 되는 인스턴스로 데이터의 하위 집합을 보유한 단일 MongoDB 인스턴스. 여러 샤드를 구성하여 가용성을 높인다.
    • Mongos - 다수 구성된 샤드의 인터페이스 역할, 클라이언트 요청의 올바른 샤드로 라우팅하는 것이 주요 기능.
    • Config servers - 전체 클러스트의 메타 데이터, 구성 설정 등을 저장하는 서버.
    • 어플리케이션은 실행할 쿼리에 대해 라우터(Mongos)와 통신, Mongos는 구성 서버를 참조하여 필요한 데이터 셋이 포함된 샤드를 확인, 쿼리결과가 응용 프로그램에 반환된다.
    • 장점 - 쿼리가 분산되므로 부하 감소, 스토리지 확장에 유리, 서버 노드를 추가하여 클러스터의 성능을 확장 할 수 있다.
    • 단점 - 복잡하기 때문에 신중한 계획과 유지 관리 필요, 분할 해제할 방법이 없다. 특정 명령은 샤딩된 환경에서 지원되지 않는 등 운영 제한이 있다.
  • 샤딩 - MongoDB 샤딩은 전체 성능에 큰 영향을 주지 않고 여러 서버에 워크로드를 분산하여 대용량 데이터를 효율적으로 관리하는 방법. 기본 하드웨어 인프라를 복잡하게 재구성하지 않고도 향후 요구 사항에 맞게 클러스터를 효율적으로 확장할 수 있는 기능을 제공.

  • MongoDB의 기능 - 인덱싱, 집계, 특별한 유형의 인덱스, 파일 스토리지, 샤딩 등

    • 인덱싱 - 일반적인 보조 인덱스 지원. 고유, 복합, 텍스트 인덱싱 등의 기능도 제공.
    • 집계 - 데이터처리 파이프라인 개념을 기반으로 집계 프레임워크 제공.
    • 특별한 유형의 인덱스 - 특정 시간에 만료되어야 하는 데이터에 대해 TTL(time-to-live) 기능 지원.
    • 파일 스토리지 - 대용량 파일 및 파일 메타데이터를 저장하기 위해 사용하는 프로토콜 지원.
    • 샤딩 - 데이터를 머신간에 분할하는 프로세스.
  • 데이터를 추가하는 방법 - 데이터를 추가하는 기본 방법은 'insert'이다. 단일 문서를 삽입하려면 컬렉션의 insertOne 메서드를 사용한다.

  • 데이터를 업데이트 하는 방법 - updateOne, updateMany, replaceOne 등을 사용한다. update는 첫번째 파라미터로 필터링하고 두번째 파라미터로 변경내용을 설명하지만, replaces는 두번째 파라미터로 문서를 교체한다.

  • 데이터를 삭제하는 방법 - deleteOne과 deleteMany를 사용한다. 두 메서드 전부 첫번째 파라미터를 필터로 사용한다.

  • 데이터를 검색하는 방법 - find를 통해 쿼리를 실행한다. 첫번째 파라미터를 통해 쿼리 기준을 설정하면 기준에 맞는 문서를 반환한다.

  • 데이터 유형 - number, string, null, date, array, 정규표현, 임베디드 문서, 오브젝트ID, 바이너리 데이터, 코드

  • 언제 사용하는가 - 신속한 확장이 필요하거나 데이터 구조의 잦은 변경, 비구조적인 데이터를 저장해야할 경우

  • 인덱스 - 데이터 세트의 작은 부분을 이동하기 쉬운 형태로 저장한다. 지정된 필드 값에 따라 특정 필드 또는 필드 세트의 값을 정렬해 저장한다. 일반적인 RDB의 인덱스와 비슷하게 동작한다.

  • set 사용법 - 필드 값이 존재하지 않으면 $set을 통해 값을 설정한다. 스키마를 업데이트 하거나 키를 추가할 때 유용하다. (updateOne의 두번째 파라미터에 { "$set" : { "aaa" : "bbb" }} 형식)

  • 트랜잭션 - 읽기 또는 쓰기 작업을 수행하는 논리적인 처리 단위. 지정된 작업을 완료하고 commit 하거나 에러가 발생해 작업을 완료하지 못하면 rollback한다.

참조

https://www.interviewbit.com/mongodb-interview-questions/

profile
백엔드 개발자 지망생

0개의 댓글