몽고DB 기본 데이터 작업
- 몽고DB 문서를 수정하기 위해서는 서버 연결, 관련 문서 조회, 지정된 속성 조정, 수정된 데이터의 데이터베이스 재전송 과정이 필요함
- 각각의 CRUD 작업은 다음고 ㅏ같은 고유한 목적을 가짐
- 생성 작업은 몽고DB 데이터베이스에 새로운 문서를 추가하는 데 사용
- 읽기 작업은 데잉터베이스의 문서를 조회하는 데 사용
- 수정 작업은 데이터베이스에 존재하는 문서를 수정하는 데 사용
- 삭제 작업은 데이터베이스의 문서를 제거하는 데 사용
1. mongosh를 이용한 CRUD 작업 수행
- mongosh는 관계형 데이터베이스의 관리 콘솔과 같은 역할을 수행
- 위 예제를 통해 다음과 같은 주요 사항들을 확인 가능
- updateOne() 메서드에서 사용된 JSON 문서 { isbn: '101' }는 수정할 특정 문서를 찾기 위한 쿼리 필터
- matchedCount 객체는 쿼리와 일치하는 문서가 한 개 있음을 나타냄
- modifiedCount 객체는 실제로 수정된 문서가 한 개임을 보여줌
- $set 연산자를 통해 특정 필드의 값을 지정된 값으로 변경 가능
- 다수의 문서가 필터 조건을 충족하더라도 updateOne() 메서드는 조건과 일치하는 첫 번째 문서만 수정
- find() 메서드를 통해 문서가 의도한 대로 수정되었음을 확인 가능
- 문서 삭제 방법은 다양하지만 가장 간단한 방법으로는 문서의 고유 식별자인 _id 필드값을 기준으로 삭제하는 것
- 결과가 없는 경우 mongosh는 셸 프롬프트 >만 표시할 뿐 다른 출력값을 반환하지 않음
2. mongosh 스크립팅 활용법
- mongosh의 진정한 가치는 자바스크립트 REPL 환경을 제공한다는 점에 있으며 이를 통해 연속적으로 실행해야 하는 복잡한 관리 작업들을 수행할 수 있음
- 스크립트 실행 시 알아두면 유용한 주요 사항들은 다음과 같음
- 쓰기 작업은 기본적으로 w: "majority" 쓰기 보장 수준을 사용하는데 과반수 쓰기 보장 수준은 전체 서버의 과반수와 데이터 보유 서버 수 중 작은 값으로 결정됨; 이때 데이터를 보유하지 않은 중재자는 과반수 계산에서 제외됨
- 스크립트의 실행 결과를 표준 출력으로 전달하려면 자바스크립트의 기본 제공 함수인 printf()를 사용해야 함
가. mongosh 스크립팅과 대화형 실행 방식 비교
- mongosh 스크립트 작성 시에는 셸 도우미 기능을 사용할 수 없음
- use <database_name>, show_collections와 같은 몽고DB 명령어들과 기타 도우미 기능들은 셸 내장 기능이므로 스크립트와 자바스크립트 실행 환경에서는 접근할 수 없음
- 대신 자바스크립트 실행 환경에서 사용할 수 있는 대체 기능들이 제공됨
| shell helper method | 자바스크립트 동등한 기능 |
| show dbs, show databases | db.adminCommand('listDatabases') |
| use <database_name> | db = db.getSiblingDB('<database_name>') |
| show collections | db.getCollectionNames() |
| show users | db.getUsers() |
| show roles | db.getRoles({ showBuiltinRoles: true }) |
| show log <logname> | db.adminCommand({ 'getLog': '<logname>' }) |
| show logs | db.adminCommand({ 'getLog': '*' }) |
| it | cursor = db.collection.find() if (cursor.hasNext()) {cursor.next()} |
3. mongosh를 이용한 대량 데이터 추가
- 자바스크립트 셸을 사용하여 프로그래밍 방식으로 다수의 문서를 삽입하고자 할 때, 가장 기본적인 방법은 아래와 같이 반복문을 통해 문서를 하나씩 생성하고 반복마다 쓰기 작업을 수행하는 것
- 구현은 단순하고 직관적일 수 있으나, 데이터베이스에 불필요한 부하를 유발하여 전반적인 시스템 성능을 저하할 수 있는 잠재적 위험이 있음
- 앞서 발생한 문제를 해결하기 위한 효율적인 대안으로 대량 삽입 방식을 고려할 수 있음
- 해당 방식에서는 천 개의 문서를 하나의 배열로 미리 구성한 뒤 단일 삽입 명령을 통해 일괄적으로 처리함
- 이는 데이터베이스와의 통신 횟수를 대폭 감소시켜 시스템 리소스를 효율적으로 사용할 수 있으며 결과적으로 전체 작업 처리 시간을 현저히 단축할 수 있음
- 사용자로서는 실행 속도가 향상되고 데이터베이스의 부하가 감소한다는 장점이 있음
4. mongosh의 대량 작업 활용하기
- 몽고DB는 정렬된 작업 목록 실행 시 작업을 100,000개 단위의 배치로 분할하고 작업 유형별로 그룹화함
- i.g. 100,004개의 삽입, 99,998개의 수정, 100,004개의 삭제, 5개의 삽입 작업이 있다면 다음과 같이 처리됨
- 이러한 처리 방식은 작업 순서에는 영향을 미치지 않으나, 실제로는 작업이 10만 개 단위로 데이터베이스에 적용됨을 의미
[100,000 inserts]
[4 inserts]
[99,998 updates]
[100,000 deletes]
[4 deletes]
[5 inserts]
- bulkWrite 명령어는 세 가지 인수를 받음
- 실행할 작업의 목록
- writeConcern
- 작업을 배열에 명시된 순서대로 처리할지 여부
- 기존 bulk가 지원하는 작업들을 모두 동일하게 사용할 수 있으며, 지원되는 작업은 다음과 같음
- insertOne()
- updateMany()
- deleteMany()
- updateOne()
- deleteOne()
- replaceOne()
파이썬 드라이버를 사용한 CRUD 처리
- 파이썬 기반의 웹 애플리케이션에서 몽고DB를 활용하기 위해서는 두 가지 주요 도구를 고려할 수 있음
- 몽고DB의 공식 드라이버인 PyMongo
- 몽고DB를 위한 ODM인 MongoEngine
- 아래 코드를 통해 몽고DB 데이터베이스 서버와의 연결 상태를 확인할 수 있음
- 몽고DB는 파이썬 개발자를 위해 두 가지 공식 드라이버를 제공함
- PyMongo는 파이썬과 몽고DB를 효율적으로 연동하는 기본 드라이버이며 이를 통해 파이썬의 유연한 프로그래밍 특성을 몽고DB의 문서 기반 NoSQL 데이터베이스 시스템과 원활하게 결합할 수 있음
- Motor는 비동기 처리를 위한 공식 드라이버이며 현대의 웹 애플리케이션에서 요구하는 실시간 데이터 처리와 대규모 동시 접속을 지원함
- 몽고DB 아틀라스에 비동기 방식으로 연결하기 위해 아래와 같이 asyncio 프레임워크를 활용할 수 있음
1. 문서 생성
- 몽고DB의 파이썬 드라이버는 데이터베이스 작업에 필요한 모든 기본 기능을 담고 있는 CRUD API를 제공하며 이러한 API를 활용하여 파이썬 코드로 몽고DB 켤렉션의 데이터를 손쉽게 관리할 수 있음
- mongo_books라는 데이터베이스 안에 있는 books 컬렉션에 새로운 문서를 추가하는 방법은 다음과 같음
- 단일 문서를 데이터베이스에 추가하기 위해 insert_one() 메서드를 사용하며 이때 문서의 구조는 파이썬의 딕셔너리 형식으로 정의됨
- 문서 추가 후에는 컬렉션에 관한 쿼리를 실행하여 전체 문서를 조회하고 출력 가능
2. 문서 검색
- 몽고DB에서 문서를 검색하는 과정은 매우 직관적인데, 특히 문서의 최상위 속성을 기준으로 검색할 때는 원하는 속성의 키와 값으로 구성된 딕셔너리만 준비하면 손쉽게 검색 가능
- mongodb_books 데이터베이스의 books 컬렉션에서 책 제목을 기준으로 특정 도서를 찾는 방법은 다음과 같음
- 내부 문서의 특정 필드를 포함한 문서를 검새할 때는 점 표기법을 활용할 수 있음
- 아래 예시에서는 metdata.version을 통해 meta 문서 내부의 version 필드에 접근하여 검색 수행
- 비교 연산자 역시 유사한 방식으로 지원되며, 주요 비교 연산자는 다음과 같음
- $eq (동일)
- $gt (초과)
- $gte (이상)
- $lt (미만)
- $lte (이하)
- $ne (불일치)
3. 문서 수정
- 아래 예제는 지정된 검색 조건과 일치하는 하나의 문서를 찾아 해당 문서에 관해 정의된 수정 작업을 수행함
4. 문서 삭제
- PyMongo의 delete_one 메서드를 활용하면 지정된 조건을 기준으로 컬렉션에서 단일 문서를 삭제할 수 있음
- 여러 문서를 동시에 삭제할 때는 delete_many 메서드를 사용
- 삭제 기능은 데이터셋에서 특정 문서나 문서 그룹을 제거할 필요가 있을 때 효과적으로 활용됨
관리 기능
- 몽고DB는 스키마리스와 비관계형 설계를 통해 원활한 데이터베이스 통합 환경을 제공하며 이러한 유연한 구조는 스키마 마이그레이션에 관한 부담을 줄이고 데이터베이스 관리 작업을 간소화시킴
- 최적의 성능을 달성하기 위해서는 숙련된 몽고DB 개발자나 아키텍트의 전문적인 관리가 필요함
- 데이터베이스 관리 기능은 세분화 수준에 따라 네 가지 계층으로 구분됨
- 프로세스
- 데이터베이스
- 컬렉션
- 인덱스
- 프로세스 레벨에서는 서버 종료를 위한 shutDown 명령이 제공됨
- 데이터베이스 레벨에서는 다음과 같은 주요 명령어를 사용할 수 있음
- dropDatabase: 데이터베이스 전체 삭제
- listCollections: 현재 데이터베이스의 컬렉션 목록 조회
- 컬렉션 레벨에서 사용할 수 있는 주요 명령어는 다음과 같음
- drop: 컬렉션 삭제
- create: 컬렉션 생성
- renameCollection: 컬렉션명 변경
- cloneCollectionAsCapped: 고정 크기 컬렉션으로 복제
- convertToCapped: 고정 크기 컬렉션으로 반환 (샤딩된 클러스터 환경에서는 미지원)
- compact: WiredTiger 엔진에서 미사용 디스크 공간 회수
- 인덱스 레벨에서는 다음과 같은 명령어를 제공함
- createIndexes: 신규 인덱스 생성
- listIndexes: 기존 인덱스 목록 조회
- dropIndexes: 전체 인덱스 삭제
- reIndex: 인덱스 재생성
- createSearchIndexes: 아틀라스 검색 인덱스 생성
- dropSearchIndex: 아틀라스 검색 인덱스 삭제
- updateSearchIndex: 아틀라스 검색 인덱스 갱신
1. currentOp()와 killOp()
- db.currentOp() 메서드는 mongod 인스턴스에서 현재 실행 중인 작업의 상세 정보를 문서 형태로 반환하며 각 작업에는 고유한 작업 ID가 할당되어 있음
- killOp() 메서드는 특정 작업 ID를 지정하여 해당 작업을 강제 종료하는 기능을 수행함
- 단, 반드시 클라이언트가 시작한 작업에 관해서만 사용해야 하며, 데이터베이스의 내부 작업은 종료되지 않도록 해야 함
2. collMod
- 몽고DB의 collMod 명령어를 통해 컬렉션의 다양한 설정을 변경하거나 뷰의 정의를 수정할 수 있으며 해당 명령어로 수행할 수 있는 주요 작업은 다음과 같음
- 기존 인덱스의 속성 변경
- 컬렉션의 유효성 검사 규칙 설정
- 제한 컬렉션의 용량 조정
- 시계열 컬렉션의 구성 변경
- etc.
- 특히 문서 유효성 검사 기능을 통해 컬렉션에 관한 모든 신규 데이터 삽입 및 기존 데이터 수정 작업에 적용될 규칙을 정의할 수 있으며 설정된 규칙에 따라 문서가 수정될 때마다 자동으로 유효성 검사가 수행됨
- 유효성 검사의 강도는 validationLevel 매개변수를 통해 조정 가능
- 실제 적용 예시로, bookOrders 컬렉션에서 isbn과 name 필드에 관한 유효성 검사기를 설정하여 모든 추가와 수정 작업에 관해 이를 적용할 수 있음
몽고DB에 관한 보안 액세스
- 오늘날 데이터베이스에 저장되는 정보의 규모와 중요도가 급증하면서, 강력한 보안 체계 구축이 데이터베이스 운영의 핵심 요소로 부상되었고 이러한 환경 변화에 대응하여 몽고DB는 포괄적인 보안 아키텍처를 설계했으며, 이를 통해 무단 접근과 잠재적 보안 위협으로부터 데이터를 안전하게 보호하고 있음
- 몽고DB의 보안 체계는 인증 시스템, 접근 제어 메커니즘, 데이터 암호화 등 다양한 보안 요소들을 통합적으로 제공함
1. 인증과 권한 부여
- 몽고DB의 인증과 권한 부여는 데이터베이스 보안의 두 핵심 축을 이루며 상호 보완적으로 작용하여 데이터베이스의 안전성을 보장함
- 인증 메커니즘은 시스템에 접근하려는 클라이언트의 신원을 검증하는 필수적인 첫 단계
- 몽고DB에서 접근 제어가 활성화되면, 모든 클라이언트는 반드시 인증 과정을 거쳐야 하며, 이를 통해 시스템은 해당 클라이언트의 접근 권한 수준을 결정할 수 있음
- 권한 부여 시스템은 인증된 사용자가 데이터베이스 내의 특정 자원에 관해 어떤 작업을 수행할 수 있는지를 규정
- 이는 사용자별로 세분화된 접근 권한을 설정하여, 각자의 역할과 책임에 맞는 적절한 수준의 데이터베이스 접근을 가능하게 함
가. 몽고DB를 사용한 인증
- 몽고DB의 기본 인증 체계는 사용자명과 비밀번호를 활용한 인증 방식을 채택하고 있으며 해당 인증 기능을 사용하기 위해서는 서버 실행 시 --auth 매개변수를 지정해야 함
mongod --auth
나. 로컬호스트 예외
- 몽고DB의 로컬호스트 예외 기능은 접근 제어가 활성화된 상태에서도 시스템 내 초기 사용자와 역할을 설정할 수 있도록 지원함
- 해당 기능을 통해 접근 제어가 활성화된 환경에서도 admin 데이터베이스에 최초 사용자를 생성하기 위해 로컬호스트 인터페이스를 통한 연결이 가능함
- 단, mongod 인스턴스의 경우 이러한 로컬호스트 예외는 몽고DB 환경에 사용자나 역할이 아직 정의되지 않은 상황에서만 적용됨
- 최초 관리자 계정의 설정 절차는 아래처럼 매우 간단함
- 몽고DB에서 관리자 계정을 생성할 때, 세 가지 주요 요소를 지정해야 함
- <adminUser>는 생성하고자 하는 관리자의 사용자 이름을
- <cleartext password>는 해당 계정의 비밀번호를 의미
- <adminRole>은 자체 호스팅 환경에서 부여할 수 있는 권한 수준을 나타내며, 이는 가장 높은 권한부터 가장 낮은 ㅋ권한까지 차례대로 정렬되어 있음
- 각 권한 수준은 특정한 관리 기능과 접근 권한을 포함하고 있으며, 이는 다음과 같은 순서로 나열됨
- root
- dbAdminAnyDatabase
- userAdminAnyDatabase
- readWriteAnyDatabase
- readAnyDatabase
- dbOwner
- dbAdmin
- clusterAdmin
- clusterManager
- clusterMonitor
- hostManager
- backup
- restore
- userAdmin
- readWrite
- read
- 몽고DB 아틀라스는 atlasAdmin과 같은 아틀라스 전용 기본 역할을 제공하고 있으며 이 중 root 역할은 시스템의 모든 기능에 관한 완전한 접근 권한을 가진 최상위 관리자 권한을 의미함
- 그러나 보안상의 이슈로 특수한 상황을 제외하고는 root 권한의 사용을 권장하지 않음
- AnyDatabase로 시작하는 역할들을 시스템 내 모든 데이터베이스에 관한 접근 권한을 제공함
- 특히 dbAdminAnyDatabase 역할은 userAdminAnyDatabase와 readWriteAnyDatabase의 권한을 통합하여, 모든 데이터베이스에서 관리자 수준의 권한을 행사할 수 있음
- 그 외의 역할들은 특정 데이터베이스에 한정하여 정의됨
- i.g. mongodb_book 데이터베이스에 관한 dbAdmin 역할을 부여하고자 할 경우, db.createUser() 명령어의 역할 설정 부분을 수정하여 이를 구현할 수 있음
몽고DB Stable API
- 몽고DB 5.0에서는 클라이언트와 서버 간의 안정적인 통신을 보장하는 Stable API가 도입되었으며 해당 API는 통신의 연속성과 신뢰성을 확보하기 위한 중요한 기능을 제공함
- Stable API의 구현은 몽고DB 드라이버나 mongosh 셸을 통해 이루어지며, 다음과 같은 mongosh 예제를 통해 선언할 수 있음
mongosh --apiVersion 1
- Stable API는 몽고DB 서버 간 호환성을 보장하는 핵심 기능으로 이를 통해 개발자들은 애플리케이션의 안전성을 유지하면서 몽고DB 서버를 지속적으로 업그레이드할 수 있음
- 호환성 보장은 다음의 세 가지 조건을 충족할 때 효력을 발휘함
- 클라이언트 측에서 반드시 apiVersion을 명시적으로 선언해야 함
- 몽고DB가 공식적으로 지원하는 클라이언트 버전을 사용해야 함
- 해당 API 버전이 지원하는 명령어와 기능만을 활용해야 함
- 자세한 내용은 링크 참고
참고
마스터링 몽고DB 7.0
반응형
'DB > 마스터링 몽고DB 7.0' 카테고리의 다른 글
| [7장] 몽고DB 고급 쿼리 (0) | 2025.07.15 |
|---|---|
| [6장] 스키마 설계와 데이터 모델링 (1) | 2025.07.11 |
| [4장] 몽고DB 연결 (0) | 2025.07.11 |
| [3장] 개발자 도구 (0) | 2025.07.10 |
| [2장] 몽고DB 아키텍처 (0) | 2025.07.05 |