AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.

CRUD 작업 구성

이 가이드 에서는 쓰기 고려 (write concern), 읽기 고려 (read concern) 및 읽기 설정 (read preference) 옵션을 구성하여 C++ 드라이버 복제본 세트에서 읽기 및 쓰기 (write) 작업을 실행하는 방식을 수정하는 방법을 학습 수 있습니다.

다음 수준에서 쓰기 고려, 읽기 고려, 읽기 설정 옵션을 설정할 수 있습니다.

  • 트랜잭션

  • Database

  • 컬렉션

이 목록은 옵션 설정의 우선 순위가 높아지는 순서도 나타냅니다. 예시 를 들어, 데이터베이스 에 대해 읽기 고려 (read concern) 설정하다 하면 트랜잭션 에서 상속된 읽기 고려 (read concern) 설정이 재정의됩니다.

읽기 설정( read preference)을 설정하여 드라이버가 읽기 작업을 라우팅하는 방법을 제어할 수 있습니다. 또한 읽기 고려 및 쓰기 고려를 설정하여 드라이버가 복제본 세트에 대한 읽기 및 쓰기 작업의 승인을 기다리는 방법에 대한 옵션을 제어할 수도 있습니다.

읽기 및 쓰기 (write) 설정과 해당 옵션에 대해 자세히 학습 MongoDB Server 매뉴얼에서 다음 가이드를 참조하세요.

기본값 읽기 및 쓰기 (write) 설정에 대한 자세한 내용은 MongoDB Server 매뉴얼의 기본 MongoDB 읽기 고려 (read concern)/쓰기 고려 (write concern) 를 참조하세요.

트랜잭션은 세션 내에서 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업의 그룹인 세션 내에서 실행 . start_session() 메서드를 사용하여 트랜잭션에 사용할 세션을 가져옵니다. 그런 다음 mongocxx::options::transaction 객체 세션의 with_transaction() 메서드에 전달합니다. 이 예시 트랜잭션 의 읽기 설정 (read preference), 읽기 고려 (read concern)) 및 쓰기 고려 (write concern) 설정하다 방법을 보여줍니다.

팁

세션에 대해 자세히 학습 MongoDB Server 매뉴얼의 서버 세션을 참조하세요.

이 예시 다음 설정을 구성합니다.

  • k_primary 읽기 설정 (read preference) : 읽기 작업은 프라이머리 복제본 세트 멤버에서 데이터를 조회 .

  • k_majority 읽기 고려 (read concern): 읽기 작업은 대부분의 복제본 세트 멤버에 기록된 인스턴스의 가장 최근 데이터를 반환합니다.

  • k_acknowledged 쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버는 쓰기 (write) 작업을 확인해야 합니다.

auto session = client.start_session(); mongocxx::options::transaction txn_opts; { mongocxx::read_preference rp; mongocxx::read_concern rc; mongocxx::write_concern wc; rp.mode(mongocxx::read_preference::read_mode::k_primary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); txn_opts.read_preference(rp); txn_opts.read_concern(rc); txn_opts.write_concern(wc);} session.with_transaction([&](mongocxx::client_session*) { // Specify transaction operations here}, txn_opts);

이 예시 데이터베이스 에 대해 다음 읽기 설정을 구성하는 방법을 보여 줍니다.

  • k_secondary 읽기 설정 (read preference) : 읽기 작업은 세컨더리 복제본 세트 멤버에서만 데이터를 조회 .

  • k_majority 읽기 고려 (read concern): 읽기 작업은 대부분의 복제본 세트 멤버에 기록된 인스턴스의 가장 최근 데이터를 반환합니다.

auto db = client["test_database"]; mongocxx::read_preference rp;mongocxx::read_concern rc; rp.mode(mongocxx::read_preference::read_mode::k_secondary);rc.acknowledge_level(mongocxx::read_concern::level::k_majority); db.read_preference(rp);db.read_concern(rc);

이 예시 컬렉션 에 대해 다음과 같은 읽기 및 쓰기 고려 (write concern) 설정을 지정하는 방법을 보여 줍니다.

  • k_local 읽기 고려 (read concern): 읽기 작업은 인스턴스의 가장 최근 데이터를 반환하며, 데이터가 대부분의 복제본 세트 멤버에 기록되었다는 보장은 없습니다.

  • k_acknowledged 쓰기 고려 (write concern): 프라이머리 복제본 세트 멤버는 쓰기 (write) 작업을 확인해야 합니다.

auto coll = client["test_database"]["test_collection"]; mongocxx::read_concern rc;mongocxx::write_concern wc; rc.acknowledge_level(mongocxx::read_concern::level::k_local);wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); coll.read_concern(rc);coll.write_concern(wc);

MongoDB Server 에서는 선택한 기준에 따라 복제본 세트 멤버에 키-값 태그를 적용 할 수 있습니다. 그런 다음 해당 태그를 사용하여 읽기 작업의 멤버를 한 명 이상 대상으로 지정할 수 있습니다.

기본값 으로 C++ 운전자 읽을 멤버를 선택할 때 태그를 무시합니다. C++ 운전자 특정 태그를 선호하도록 하려면 mongocxx::read_preference 객체 만들고 해당 tags() 멤버 함수를 호출합니다. 원하는 태그를 배열 인수로 tags()에 전달합니다.

다음 코드 예시 에서 tags() 함수에 전달된 태그 세트 C++ 운전자 뉴욕 데이터 센터 ("dc": "ny")에서 읽기를 선호하고 샌프란시스코 데이터 센터 ("dc": "sf")로 대체하도록 지시합니다.

auto tag_set_ny = make_document(kvp("dc", "ny"));auto tag_set_sf = make_document(kvp("dc", "sf")); mongocxx::read_preference rp; rp.mode(mongocxx::read_preference::read_mode::k_secondary);rp.tags(make_array(tag_set_ny, tag_set_sf).view());

C++ 운전자 네트워크 또는 서버 오류로 인해 특정 읽기 및 쓰기 (write) 작업이 실패한 경우 자동으로 한 번 다시 시도합니다.

연결 URI에서 retryReads 또는 retryWrites 옵션을 false 로 설정하여 재시도 가능 읽기 또는 재시도 가능 쓰기를 명시적으로 비활성화할 수 있습니다. 다음 예시 클라이언트 에 대해 재시도 가능 읽기 및 쓰기를 비활성화합니다.

mongocxx::uri uri{"mongodb://localhost:27017/?retryReads=false&retryWrites=false"};mongocxx::client client{uri};

지원되는 재시도 가능 읽기 및 쓰기 (write) 작업에 대해 자세히 학습 MongoDB Server 매뉴얼에서 다음 가이드를 참조하세요.

참고

지능형 워크로드 관리(IWM)의 부하 차단

SystemOverloadedError 또는 RetryableError 레이블과 관련된 오류로 인해 애플리케이션에 장애가 발생하거나 애플리케이션 로그에 오류가 나타나는 경우, 클러스터에서 Load Shedding이 활성화되어 있을 수 있으며 드라이버가 이를 지원하는 버전으로 업그레이드되지 않았을 수 있습니다. MongoDB C++ Driver를 4.3 버전 이상으로 업그레이드하는 것이 좋습니다. 업그레이드 후에도 이러한 오류가 계속 발생하면 Load Shedding 구성 검토와 같은 서버 사이드 변경을 통해 해결하거나, 사용자 지정 오류 처리 또는 클라이언트 사이드 요청 제한 구현과 같은 애플리케이션 사이드 변경을 통해 해결할 수 있습니다. 상황에 따라 애플리케이션 측의 변경이 더 바람직하거나 필요할 수 있습니다.

Load Shedding은 IWM의 기능으로, 지속적인 과부하 상황에서 초과 작업을 거부하여 서버 부하를 관리하는 데 도움이 됩니다. 이 기능은 MongoDB 9.0 이상에서 사용할 수 있습니다.

IWM 또는 과부시 오류 처리에 대한 자세한 내용은 Atlas 문서의 지능형 워크로드 관리 페이지 또는 과부시 오류 페이지를 참조하십시오.

샤딩된 클러스터 또는 복제본 세트에 연결할 때 C++ 운전자는 로드 밸런싱 을 사용하여 읽기 및 쓰기 (write) 요청을 처리하다. 로드 밸런싱을 통해 운전자 이러한 요청을 여러 서버에 분산할 수 있으므로 하나의 서버 과부하가 걸리는 것을 방지하고 최적의 성능을 보장합니다.

샤딩된 클러스터 에 연결할 때 C++ 드라이버 네트워크 왕복 시간이 가장 짧은 인스턴스를 계산하여 가장 가까운 mongos 인스턴스 결정합니다. 그런 다음 운전자가 이 mongos의 평균 왕복 시간을 localThresholdMS 값에 추가하여 지연 시간 창을 결정합니다. 운전자 지연 시간 창 내에 속하는 최대 2개의 무작위 mongos 인스턴스에 요청을 로드 밸런싱합니다. 각 요청 에 대해 드라이버 operationCount 값을 결정하여 작업 부하가 낮은 서버 선택합니다.

복제본 세트 에 연결할 때 C++ 드라이버 먼저 읽기 설정 (read preference) 에 따라 복제본 세트 멤버를 선택합니다. 그런 다음 운전자 이전 단락에서 설명한 것과 동일한 프로세스 따릅니다. 지연 시간 창 계산한 후 드라이버 이 창 에 속하는 무작위 복제본 세트 멤버를 최대 두 개 선택하고 operationCount 값이 더 작은 노드를 선택하여 요청 받습니다.

팁

로드 밸런싱에 대해 자세히 학습하려면 MongoDB Server 매뉴얼에서 샤드 클러스터 밸런서 를 참조하세요.

C++ 운전자 로컬 임계값을 사용하여 서버 선택에 대한 지연 시간 창 계산합니다. 이 값은 읽기 및 쓰기 (write) 요청을 수신할 수 있는 서버를 결정합니다.

기본값 으로 운전자 핑 시간이 가장 가까운 서버 에서 15 밀리초 이내인 mongos 인스턴스 또는 복제본 세트 멤버만 사용합니다. 지연 시간이 더 긴 서버에 읽기를 분산하려면 연결 URI에서 localThreshold 매개 변수를 설정하다 .

참고

단일 mongos 인스턴스 에서 복제본 세트 멤버를 선택할 때 C++ 드라이버 localThresholdMS 옵션을 무시합니다. 이 경우 localThreshold 명령줄 옵션을 사용합니다.

다음 예시 에서는 복제본 세트 에 연결하고 로컬 임계값을 35 밀리초로 지정합니다.

mongocxx::uri uri{"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"};mongocxx::client client{uri};

앞의 예시 에서 C++ 드라이버 가장 가까운 노드의 핑 시간 35 밀리초 이내에 일치하는 노드에게 읽기를 분산합니다.

컬렉션에서 읽기 및 쓰기 (write) 작업을 수행할 때 데이터 정렬 을 지정할 수 있습니다.

데이터 정렬은 대소문자 및 악센트 표시와 같이 문자열 비교를 위한 언어별 규칙 설정하다 입니다.

데이터 정렬을 지정하려면 데이터 정렬 정의를 옵션 객체 의 collation() 메서드에 전달한 다음 이 옵션 객체 읽기 또는 쓰기 (write) 작업에 전달합니다.

다음 문서가 포함된 컬렉션 생각해 보세요.

{ _id: 1, category: "café" },{ _id: 2, category: "cafe" },{ _id: 3, category: "cafE" }

다음 예시 프랑스어 국가 및 언어 설정 설정을 지정하고 대소문자와 문자 변형 간의 차이를 무시하는 데이터 정렬을 만듭니다. 그런 다음 이 데이터 정렬을 사용하여 category 필드 값이 "cafe"와 일치하는 문서를 찾습니다. 지정된 데이터 정렬로 인해 쿼리 세 개의 문서를 모두 반환합니다.

mongocxx::options::find opts{};opts.collation(bsoncxx::from_json(R"({"locale": "fr", "strength": 1})")); auto cursor = collection.find(make_document(kvp("category", "cafe")), opts);for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl;}

이 가이드 에 설명된 클래스 또는 메서드에 학습 보려면 다음 API 설명서를 참조하세요.