티스토리 뷰

  • 원격 DB를 전제로 한 경우, 추가 설정이 필요합니다.

MongoDB 원격 접속 설정

1. 방화벽 설정

먼저, MongoDB가 사용하는 기본 포트(27017)에 대한 인바운드 연결을 허용해야 합니다. Ubuntu나 Debian 기반 시스템에서는 UFW(Uncomplicated Firewall)를 사용하여 이를 설정할 수 있습니다.

sudo ufw allow 27017

이 명령은 27017 포트로의 모든 인바운드 연결을 허용합니다.

2. MongoDB 설정 파일 수정

MongoDB의 설정 파일을 수정하여 원격 접속을 허용해야 합니다. 설정 파일의 위치는 일반적으로 /etc/mongod.conf입니다.

  1. 설정 파일을 엽니다:

    sudo nano /etc/mongod.conf
  2. net 섹션을 찾아 다음과 같이 수정합니다:

    net:
      port: 27017
      bindIp: 0.0.0.0

    여기서 bindIp: 0.0.0.0은 모든 IP 주소에서의 연결을 허용한다는 의미입니다. 이전에는 기본값으로 127.0.0.1(localhost)만 허용되어 있었을 것입니다.

주의사항

  • bindIp: 0.0.0.0으로 설정하면 모든 IP 주소에서의 연결을 허용하므로 보안에 주의해야 합니다.
  • 가능하다면 특정 IP 주소나 IP 범위만 허용하는 것이 더 안전합니다. 예: bindIp: 127.0.0.1,192.168.1.0/24
    • 0/24의 의미는

3. MongoDB 재시작

설정 변경 후 MongoDB 서비스를 재시작해야 합니다:

sudo systemctl restart mongod

데이터 삽입

필요한 라이브러리

  1. json: Python 기본 라이브러리로, JSON 데이터를 다루는 데 사용됩니다.
  2. pymongo: MongoDB와 Python을 연결해주는 드라이버입니다. pip install pymongo로 설치할 수 있습니다.
import json
from pymongo import MongoClient

JSON 데이터 준비

MongoDB에 삽입할 데이터는 JSON 형식이어야 합니다. JSON은 키-값 쌍으로 이루어진 데이터 형식으로, MongoDB의 문서 구조와 잘 맞습니다.

예시 데이터

[
  {
    "회원": {
      "이름": "홍길동",
      "나이": 30,
      "이메일": "hong@example.com"
    },
    "구매이력": [
      {
        "상품코드": "PROD001",
        "상품명": "스마트폰",
        "구매일자": "2024-10-05",
        "가격": 800000
      },
      {
        "상품코드": "PROD002",
        "상품명": "무선이어폰",
        "구매일자": "2024-10-07",
        "가격": 150000
      }
    ]
  }
]

MongoDB에 데이터 삽입하기

다음은 대용량 JSON 파일을 MongoDB에 삽입하는 함수입니다:

def import_large_json(file_path, host, db_name, collection_name):
    client = MongoClient(f'mongodb://{host}:27017/')
    db = client[db_name]
    collection = db[collection_name]

    with open(file_path, 'rb') as file:
        json_data = json.load(file)
        collection.insert_many(json_data)

이 함수는 다음과 같은 단계로 작동합니다:

  1. MongoDB 서버에 연결합니다.
  2. 지정된 데이터베이스와 컬렉션을 선택합니다.
  3. JSON 파일을 열어 데이터를 읽어옵니다.
  4. insert_many() 메소드를 사용해 데이터를 한 번에 삽입합니다.

insert_many vs insert_one

  • insert_many(): 여러 문서를 한 번에 삽입합니다. 대량의 데이터를 처리할 때 효율적입니다.
  • insert_one(): 한 번에 하나의 문서만 삽입합니다. 단일 문서를 삽입할 때 사용합니다.

대용량 데이터를 다룰 때는 insert_many()가 훨씬 효율적입니다. 개별적으로 insert_one()을 반복하는 것보다 처리 속도가 훨씬 빠릅니다.

사용 예시

import_large_json("test.json", '123.123.123.12', 'root', 'test-db')
  • ps. 개인적으로 약 5GB 크기의 JSON 파일을 삽입해봤는데, 64GB RAM에서 약 5분 정도 소요되었습니다.
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함