본문 바로가기
T./Mastering MongoDB 7.0

4. Connecting to MongoDB

by IT Journeyman 2025. 3. 10.

4.  MongoDB 연결하기

데이터베이스의 세계에서 MongoDB는 강력하고 유연하며 확장 가능한 NoSQL 솔루션으로 돋보입니다. 기업과 개발자가 점점 더 데이터 중심적인 환경에 적응함에 따라, 다양한 프로그래밍 언어와 데이터베이스의 원활한 통합이 필수적으로 떠오르고 있습니다. 이 챕터는 MongoDB를 다양한 개발 환경에 통합하려는 초보자와 도구를 확장하려는 숙련된 개발자를 위해 명확한 단계별 안내를 제공합니다.

 

이 장에서 다룰 내용

  • 직접 드라이버 방식
  • Object-Document Mapping(ODM) 라이브러리
  • PHP, Python, Ruby, Node.js 및 TypeScript에서의 MongoDB 접속 설정

연결 방법(Connecting methods)

MongoDB는 데이터베이스에 연결할 수 있는 다양한 방법을 제공합니다. 여기에는 직접 드라이버 방식과 모델 객체의 매핑을 우아하게* 처리하는 Object-Document Mapping(ODM) 계층이 포함됩니다. MongoDB는 Java, C++, C#, Kotlin, Rust 등 다양한 언어를 폭넓게 지원하지만, 이 장에서는 PHP, Ruby, Node.js, Python이라는 네 가지 대표적인 언어에 중점을 둡니다. 각 언어는 고유한 기능과 강점을 제공하며, MongoDB의 잠재력을 최대한 활용하기 위해 각기 다른 연결 설정이 필요합니다.

(* 역자주 - 저자는 이 장에서 두 번이나 "elegantly"라는 단어로 사용하고 있습니다. 역자에게는 단순 반복적인 "삽질"을 하지 않고, 뭔가 "깔삼"하게(깔끔하고 상쾌하게) 처리한다는 느낌으로 다가옵니다. (저를 포함하여) IT에서 일하시는 분들이 흔히 스스로 하시는 일들을 "삽질"이라고 자조적으로 말씀하시고는 하는데, 자존감 넘치는 "우아하게"라는 표현은 색다른 이해와 접근입니다. IT에 종사하시는 분들이 스스로 하시는 일들을 "우아한 일"로 평가하시면 어떨까 하는 생각이 들어 쓸데없는 사족을 달아 봅니다. 그런데 이 블로그 대문의 "IT Journeyman"이 "IT 십장"이라는 뜻도 있으니, 저부터 고민해 봐야 겠습니다.)

Ruby를 사용한 MongoDB 연결

Ruby는 MongoDB에서 공식적으로 지원하는 주요 언어 중 하나로, 높은 호환성을 제공하는 공식 드라이버를 갖추고 있습니다. 로컬 MongoDB 호스트에 성공적으로 연결하는 방법은 아래와 같습니다.

1. 드라이버 설치

Gemfile에 다음과 같이 MongoDB 드라이버를 추가합니다.

gem 'mongo'

 

2. 데이터베이스 연결

MongoDB 데이터베이스에 연결하려면 다음과 같이 작성합니다.

require 'mongo'
client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test')

 

또는 URI 연결 문자열을 사용할 수도 있습니다.

require 'mongo'
client = Mongo::Client.new('mongodb://127.0.0.1:27017/test')

 

3. 복제 세트(replica set) 연결

일반적으로 운영 환경에서는 단일 데이터베이스 인스턴스가 아닌 복제 세트를 사용하여 연결합니다.

client_host = ['server1_host:server1_port_number', 'server2_host:server2_port_number']
client_options = {
  database: 'YOUR_DATABASE_NAME',
  replica_set: 'REPLICA_SET_NAME',
  user: 'YOUR_USERNAME',
  password: 'YOUR_PASSWORD'
}
client = Mongo::Client.new(client_host, client_options)

 

또는 URI 방식으로도 연결할 수 있습니다.

client = Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb")

 

4. 복제 세트 연결 개념

  • client_host의 서버들은 시드 서버 역할을 하며, 클라이언트 드라이버에 연결 가능한 서버 목록을 제공합니다.
  • 연결이 이루어지면, 주(primary) 또는 보조(secondary) 서버 중에서 적절한 서버를 자동으로 선택합니다.
  • replica_set 속성은 반드시 MongoDB 설정과 동일한 이름을 가져야 합니다.

5. 인증 및 보안 설정

  • 사용자명(username)과 비밀번호(password)는 선택 사항이지만, 보안 강화를 위해 활성화하는 것이 권장됩니다.
  • mongod.conf 설정에서 기본적으로 인증을 활성화하는 것이 좋은 보안 관행입니다.

6. 샤딩(Sharded Cluster) 연결

샤딩 클러스터에서는 일반적인 복제 세트와는 다르게, MongoDB 라우터(mongos)를 통해 연결해야 합니다.

require 'mongo'
# mongos가 로컬에서 실행되고 있다고 가정 (기본 포트: 27017)
client = Mongo::Client.new(['localhost:27017'], database: 'my_sharded_database')

 

여러 mongos 인스턴스를 통한 고가용성 연결

require 'mongo'
client = Mongo::Client.new(
  ['mongos1_host:27017', 'mongos2_host:27017', 'mongos3_host:27017'], 
  database: 'my_sharded_database'
)

이제 Ruby 라이브러리를 사용하여 MongoDB에 연결하는 방법을 배웠으므로, 다음 섹션에서는 ODM(Object-Document Mapping) 라이브러리를 사용하는 방법을 살펴보겠습니다.


Mongoid (Ruby ODM)

Mongoid는 Ruby 또는 Ruby on Rails 애플리케이션에서 MongoDB와 원활하게 연결할 수 있도록 해주는 Object-Document Mapping(ODM) 라이브러리입니다.
Ruby 드라이버의 유연성을 유지하면서도 개발 시간을 줄이고 코드를 간결하게 만들어 줍니다.
Mongoid는 관계형 데이터베이스에서 ORM(Object-Relational Mapping)과 유사한 역할을 하며, 모델과 데이터베이스 간의 간격을 효과적으로 메웁니다.

 

Mongoid ODM의 주요 장점

  • 데이터 추상화: 문서 표현을 직접 다루지 않고 객체를 통해 데이터베이스와 상호작용 가능
  • 일관된 인터페이스: 표준화된 데이터 접근 방식을 제공하여 코드의 일관성을 유지
  • 보일러플레이트 코드* 감소: 반복적인 데이터베이스 작업을 자동화하여 코드량을 줄임
  • 스키마 관리 및 검증: 스키마가 없는 MongoDB에서도 구조화된 데이터 검증 가능
  • 성능 최적화: 캐싱(caching) 기능을 통해 성능을 향상
  • 미들웨어 및 플러그인 지원: 데이터 변환, 로깅 등의 기능을 위한 후킹(hook) 제공
  • ORM 경험이 있는 개발자를 위한 쉬운 전환: 관계형 데이터베이스 ORM과 유사한 방식으로 사용 가능
  • MongoDB 트랜잭션 지원: 일련의 데이터 작업을 원자적으로 실행

(* 역자주 -보일러플레이트 코드에서 '보일러플레이트'는 보일러를 만들었던 압연철판이 그 연원이라고 합니다. 1880년대부터 1950년대까지 보일러에 사용되던 압연철판을 "보일러플레이트"라고 불렀고, 이것이 나중에 활판인쇄용으로 널리 사용되었을 때도 "보일러플레이트"라고 불렀는데, 광고나 유명 칼럼 같은 반복적인 콘텐츠를 인쇄하기 위한 금속 인쇄판도 "보일러플레이트"라고 불리며 각 지역 신문사들에 배포되었다네요. 이런 역사적 배경을 바탕으로, 컴퓨터 프로그래밍에서도 자주 반복되는 작업이나 패턴을 미리 구현해 놓은 코드를 "보일러플레이트 코드"라고 부르게 되었다고 합니다.)

 

Mongoid 설치 및 설정

  • Gemfile에 Mongoid 추가
gem 'mongoid'
  • Rails 애플리케이션에서 ORM으로 설정
    Rails 프로젝트의 application.rb 파일에 다음 설정을 추가합니다.
config.generators do |g|
  g.orm :mongoid
end
  • Mongoid 설정 파일(mongoid.yml) 구성
    MongoDB에 연결하기 위해 mongoid.yml 파일을 생성해야 합니다.
    이 파일의 역할은 관계형 데이터베이스의 database.yml과 유사하며, 설정 값은 키-값 쌍(key-value pairs)으로 구성됩니다.

Mongoid를 활용하면 Ruby on Rails 기반 애플리케이션에서 Active Record와 유사한 방식으로 MongoDB를 사용할 수 있습니다.

 

mongoid.yml 파일을 통해 전달할 수 있는 몇 가지 옵션은 다음과 같습니다:

옵션 설명
database 데이터베이스 이름
hosts 데이터베이스 호스트
write/w 쓰기 컨선(write concern) (기본값 = { w: 1 })
auth_mech 인증 메커니즘. 사용 가능한 옵션: :aws, :gssapi, :mongodb_cr, :mongodb_x509, :plain, :scram, :scram256
min_pool_size/max_pool_size 연결 풀의 최소 및 최대 연결 수. 기본값: min_pool_size: 1, max_pool_size: 5
ssl, ssl_cert, ssl_key, ssl_key_pass_phrase, ssl_verify SSL 구성 및 옵션
include_root_in_json JSON 직렬화 시 루트 모델 이름 포함 여부 (기본값: false)
include_type_for_serialization 직렬화 시 _type 필드 포함 여부 (기본값: false)

Table 4.1: Mongoid 구성 옵션

 

이제, 모델을 MongoDB에 저장하도록 조정해야 합니다. 이를 위해 모델 선언부에 한 줄의 코드를 추가하면 됩니다.

다음 예제와 같이 사용하면 됩니다:

class Person
  include Mongoid::Document
  include Mongoid::Timestamps
end

위 코드에서 Mongoid::Timestamps를 추가하면 Active Record와 유사한 방식으로 created_at 및 updated_at 필드가 자동으로 생성됩니다. 모델에서 데이터 필드를 타입별로 선언할 필요는 없지만, 명시적으로 선언하는 것이 좋은 습관입니다.


MongoDB에서 지원하는 데이터 타입은 다음과 같습니다:

데이터  타입별칭 설명
ObjectId ObjectId 작고, 거의 유일하며, 빠르게 생성되고 정렬된 값. 12바이트 길이로 구성됨:
  • 4바이트 타임스탬프 (Unix epoch 기준 초 단위)
  • 5바이트 랜덤 값 (프로세스별 고유)
  • 3바이트 증가하는 카운터 (랜덤 초기화)
Double double 부동소수점 숫자
String String UTF-8로 인코딩된 문자열
Object Object 하나 이상의 필드를 포함할 수 있는 중첩된 문서
Array Array 값들의 리스트
Binary data binData 바이너리 데이터
Boolean Bool 참(true) 또는 거짓(false)
Date Date BSON 날짜 타입 (Unix epoch 기준 밀리초 단위 저장)
Null Null null 값
Regular expression Regex JavaScript 정규 표현식 저장
JavaScript Javascript JavaScript 코드 저장 (Scope 포함 가능)
32-bit integer Int 32비트 정수
Timestamp timestamp BSON 타임스탬프 타입
64-bit integer Long 64비트 정수
Decimal128 decimal 128비트 부동소수점 숫자 (정확한 금융 값 표현에 유용)
Min key minKey 모든 BSON 값보다 작은 값
Max key maxKey 모든 BSON 값보다 큰 값

Table 4.2: Data types and their descriptions

 

필드 타입을 명시적으로 정의하면 성능이 향상되며 모든 데이터 타입을 지원할 수 있습니다.
필드 타입을 정의하지 않으면 MongoDB가 해당 필드를 객체로 변환하여 저장하지만, BigDecimal, Date, DateTime, Range와 같은 데이터 타입은 지원되지 않아 오류가 발생할 수 있습니다.


Mongoid 모델에서 상속(Inheritance) 사용하기

아래는 Mongoid 모델에서 상속을 사용하는 예제입니다:

class Canvas
  include Mongoid::Document
  field :name, type: String
  embeds_many :shapes
end

class Shape
  include Mongoid::Document
  field :x, type: Integer
  field :y, type: Integer
  embedded_in :canvas
end

class Circle < Shape
  field :radius, type: Float
end

class Rectangle < Shape
  field :width, type: Float
  field :height, type: Float
end

위 코드에서:

  • Canvas 클래스는 shapes 필드를 포함하며, Shape 객체를 여러 개 가질 수 있습니다 (embeds_many).
  • Shape 클래스는 x와 y 좌표 필드를 가지고 있으며 Canvas 내부에 포함됩니다 (embedded_in).
  • Circle과 Rectangle 클래스는 Shape을 상속받아 각각 radius, width, height 필드를 추가로 정의합니다.

이처럼 Mongoid에서는 상속을 활용하여 데이터 모델을 구조화할 수 있습니다.


Python을 사용한 MongoDB 연결

루비의 Mongoid ODM처럼, 파이썬에도 MongoEngine ODM이 존재하며, 공식 MongoDB 파이썬 드라이버인 PyMongo도 있습니다. PyMongo를 설치하는 방법은 pip 또는 easy_install을 사용하여 설치할 수 있으며, 아래 코드와 같습니다:

 

참고: 최소 요구 PyMongo 버전은 4.4이며, 최소 요구 파이썬 버전은 3.7입니다.

python -m pip install pymongo
python -m easy_install pymongo

그런 후, 클래스에서 데이터베이스에 연결할 수 있습니다. 예시는 다음과 같습니다:

from pymongo import MongoClient
client = MongoClient()

복제본 세트에 연결하려면 클라이언트가 세트의 주 노드(primary), 보조 노드(secondary), 또는 중재자 노드(arbiter)를 찾을 수 있도록 세트의 하나 이상의 멤버가 필요합니다. 예시는 다음과 같습니다:

client = pymongo.MongoClient('mongodb://user:passwd@node1:port1,node2:port2,node3:port3/?replicaSet=rsname')

연결 문자열을 사용하면 사용자 이름과 비밀번호, 그리고 replicaSet 이름을 하나의 문자열로 전달할 수 있습니다. 연결 문자열 URL에서 가장 흥미로운 몇 가지 옵션은 다음 섹션에서 설명됩니다.

 

샤드에 연결하려면 mongos 서버의 서버 호스트와 IP가 필요합니다.

 

MongoEngine ODM MongoEngine은 파이썬에서 MongoDB와 상호작용할 수 있는 강력한 방법을 제공하며, MongoDB의 유연성과 친숙한 파이썬 스타일의 API를 결합합니다. 이는 관계형 데이터베이스와 ORM에서 전환 중인 개발자들에게 더 적합합니다. 그러나 모든 도구와 마찬가지로, 효과적으로 사용하려면 그 강점과 한계를 이해하는 것이 중요합니다.

 

MongoEngine은 아래 코드와 같이 pip을 사용하여 설치할 수 있습니다.

pip install mongoengine​
 

사용 중인 MongoEngine 버전이 설치된 MongoDB 버전과 호환되는지 항상 확인해야 합니다.

옵션은 name=value 형태로 지정되며, 각 옵션 쌍은 & 기호로 구분됩니다. 아래 표는 몇 가지 주요 옵션을 설명합니다.

옵션 설명
max_pool_size / min_pool_size 연결 풀에서 최대 및 최소 연결 수 설정
w 쓰기(Write) 컨선(Write Concern) 설정
w_timeout 쓰기 컨선 작업의 타임아웃 설정
journal 저널(journal) 옵션
read_preference 레플리카 세트 사용 시 읽기 우선순위를 설정하며, 가능한 값:
Primary, primaryPreferred, secondary, secondaryPreferred, nearest
maxStalenessSeconds 보조(secondary) 노드가 기본(primary)보다 얼마나 오래된 데이터를 허용할지를 초 단위로 지정
ssl SSL 구성 및 옵션 설정
authentication_source 사용자 인증 시 사용할 데이터베이스 지정, 외부 인증(LDAP, Kerberos) 사용 시 $external 값 사용
authentication_mechanism 인증 방식 설정, 가능한 값:
SCRAM-SHA-1, SCRAM-SHA-256, MONGODB-X509, MONGODB-AWS
MongoDB Enterprise에서 추가 지원:
GSSAPI (Kerberos), PLAIN (LDAP SASL)

Table 4.3: MongoEngine 구성 옵션

 

다음 코드는 문서를 정의하는 샘플 클래스입니다:

from mongoengine import Document, StringField

class User(Document):
    email = StringField(required=True, unique=True, primary_key=True)
    name = StringField(max_length=50)

위 코드에서 User 클래스는 email과 name 필드를 포함하며, email 필드는 기본 키(primary_key)로 설정되어 있습니다.

MongoEngine은 다른 객체-문서 매퍼(ODM) 또는 객체-관계형 매퍼(ORM)처럼 일부 오버헤드를 수반합니다.
이 오버헤드는 일반적으로 미미하며 개발자의 생산성을 높이는 장점이 있지만, 성능이 중요한 애플리케이션에서는 MongoDB의 기본 Python 드라이버인 PyMongo를 직접 사용하는 것이 더 나은 선택이 될 수도 있습니다.


PHP를 이용한 MongoDB 연결

MongoDB의 PHP 드라이버 아키텍처는 여러 계층으로 구성되며, 이는 그림 4.1에 나타나 있습니다.

 

이 스택의 최상위에는 PHP 라이브러리가 있으며, 이는 Composer 패키지로 배포됩니다.
이 라이브러리는 다른 MongoDB 드라이버와 일관된 API를 제공합니다.

그 아래에는 PHP 확장(extension)이 있으며, 이는 PECL을 통해 배포됩니다.
이 확장은 PHP와 MongoDB 시스템 라이브러리(libmongoc, libbson, libmongocrypt) 간의 연결 역할을 합니다.
확장을 직접 사용할 수도 있지만, 라이브러리의 오버헤드는 최소화되어 있으며, 대부분의 MongoDB 기반 애플리케이션에서 필수적인 의존성으로 간주됩니다.

 

설치 과정 (2단계):

1. MongoDB 확장(extension) 설치
이 확장은 PHP 버전에 따라 다르며, PECL을 통해 설치할 수 있습니다.

pecl install mongodb

 

MongoDB 7.0과 호환되려면 PHP 7.2 이상PHP Driver ext + lib 1.16 이상이 필요합니다.
그런 다음, 다음 줄을 php.ini 파일의 마지막에 추가합니다.

pecl install mongodb

이후 php --ri mongodb 명령을 실행하면 libmongoc 및 libmongocrypt가 참조되어야 합니다.

 

2. Composer를 사용하여 MongoDB 라이브러리 설치
Composer(가장 널리 사용되는 PHP 의존성 관리자)를 이용하여 다음 명령을 실행합니다.

composer require mongodb/mongodb


데이터베이스 연결 방법

MongoDB에 연결하려면 연결 문자열(connection string)을 사용하여 클라이언트 인스턴스를 생성하면 됩니다.

$client = new MongoDB\Client('mongodb: //
myUsername:myPassword@rs1.example.com,rs2.example.
com/?ssl=true&replicaSet=myReplicaSet&authSource=admin');


또는 배열 옵션($uriOptions)을 사용하여 개별 매개변수를 전달할 수도 있습니다.

$client = new MongoDB\Client(
    'mongodb://rs1.example.com,rs2.example.com/',
    [
        'username' => 'myUsername',
        'password' => 'myPassword',
        'ssl' => true,
        'replicaSet' => 'myReplicaSet',
        'authSource' => 'admin',
    ],
);

$uriOptions 설정과 연결 문자열 옵션은 Ruby 및 Python의 MongoDB 드라이버에서 사용되는 것과 유사합니다.


Eloquent ORM

Laravel은 우아한 문법과 표현력 있는 코드 스타일로 유명하며, 특히 Eloquent ORM에서 이러한 특성이 두드러집니다.
Eloquent는 데이터베이스와 상호작용할 수 있는 풍부하고 직관적인 인터페이스를 제공하며, Doctrine의 Data Mapper 패턴과 달리 Active Record 구현 방식을 따릅니다.

Eloquent를 MongoDB에서 사용하기

MongoDB와 Laravel의 Eloquent ORM을 연결하는 패키지를 설치해야 합니다.
다음 Composer 명령어를 실행하여 패키지를 설치할 수 있습니다.

composer require mongodb/laravel-mongodb

Eloquent 모델 정의하기

MongoDB용 Eloquent 모델은 일반적인 Eloquent 모델과 거의 동일하지만, 다른 Model 기반 클래스를 확장(extend) 한다는 점이 다릅니다. 아래는 MongoDB에서 작동하는 Eloquent 모델 예제입니다.

namespace App\Models;

use MongoDB\Laravel\Eloquent\Model;

class Students extends Model {
    protected $connection = 'mongodb';
    protected $collection = 'students';
    protected $fillable = ['firstname', 'lastname'];

    // 'Class' 모델과의 관계 정의 (1:N 관계)
    public function classes() {
        return $this->hasMany(Class::class);
    }

    // 단일 내장 문서 (1:1 관계)
    public function address() {
        return $this->embedsOne(Address::class);
    }

    // 다중 내장 문서 (1:N 관계)
    public function grades() {
        return $this->embedMany(Grade::class);
    }
}


Laravel에서 MongoDB 관계 설정

Laravel 모델 예제는 Eloquent ORM을 사용하여 MongoDB와 상호작용하는 방법을 보여줍니다.
특히, 세 가지 주요 관계 유형을 강조합니다.

  1. hasMany1:N 관계
    classes() 메서드는 여러 개의 Class 문서를 가질 수 있는 일반적인 관계형 데이터베이스 스타일의 관계입니다.
  2. embedsOne1:1 관계 (내장 문서)
    address() 메서드는 하나의 Address 문서를 Students 문서 안에 포함하는 방식입니다.
    즉, students 컬렉션 내에 하나의 Address 문서가 직접 내장됨을 의미합니다.
  3. embedMany1:N 관계 (내장 문서)
    grades() 메서드는 하나의 students 문서가 여러 개의 Grade 문서를 포함하는 방식입니다.
    즉, students 컬렉션 내에 여러 개의 Grade 문서가 배열 형태로 저장됩니다.

이러한 관계 설정을 통해 Laravel은 MongoDB의 관계형 및 내장 문서 구조를 우아하게* 처리할 수 있습니다.


Node.js를 사용한 MongoDB 연결

Node.js는 오픈 소스이자 크로스 플랫폼 런타임 환경으로, 뛰어난 성능 덕분에 가장 인기 있는 웹 기술 중 하나가 되었습니다.
MongoDB, Node.js, Express.js(웹 프레임워크), React.js(클라이언트 측 프레임워크)가 결합된 MERN 스택풀스택 웹 애플리케이션 개발에 널리 사용됩니다.


이들은 모두 JavaScript 기반이므로, 개발자는 여러 언어를 배우고 통합하는 부담 없이 효율적으로 개발할 수 있습니다.
오늘날, Strapi와 같은 여러 콘텐츠 관리 시스템(CMS)도 MERN 스택을 기반으로 개발되고 있습니다.

따라서, Node.js를 사용하여 MongoDB에 연결하는 방법을 알아두는 것이 중요합니다.

 

Node.js MongoDB 드라이버 설치

Node.js에서 MongoDB 드라이버를 설치하려면 NPM(Node Package Manager)을 사용하여 다음 명령어를 실행하면 됩니다.

npm install mongodb

 

MongoDB 데이터베이스 연결

MongoDB에 연결하고 데이터를 조회하는 기본 예제는 다음과 같습니다.

const { MongoClient } = require("mongodb");

// 본인의 연결 문자열로 변경하세요.
const uri = "mongodb://user:pass@host:27017/?w=majority";
const client = new MongoClient(uri);

async function run() {
    try {
        const database = client.db('productions');
        const movies = database.collection('movies');

        // 제목이 '200 meters'인 영화를 조회
        const query = { title: '200 meters' };
        const movie = await movies.findOne(query);

        console.log(movie);
    } finally {
        // 작업이 끝나면 클라이언트 연결 종료
        await client.close();
    }
}

// 오류 발생 시 출력
run().catch(console.dir);

 

레플리카 세트(Replica Set) 연결

MongoDB의 레플리카 세트에 연결하려면, 클라이언트가 주(Primary), 보조(Secondary), 또는 조정자(Arbiter) 노드를 찾을 수 있도록 여러 개의 시드(Seed) 서버를 지정해야 합니다.

아래는 레플리카 세트에 연결하는 예제 코드입니다.

const uri = "mongodb://user:pass@host1:27017,host2:27017,host3:27017/?replicaSet=mySet";
const client = new MongoClient(uri);


연결 문자열을 사용한 MongoDB 연결

MongoDB의 연결 문자열(Connection String)을 사용하면, 사용자명(username), 비밀번호(password), 레플리카 세트 이름(replicaSet) 등을 하나의 문자열로 전달할 수 있습니다.

 

연결 문자열 구조

MongoDB의 연결 문자열은 다음과 같은 형식을 따릅니다.

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • username:password@ → 사용자 인증 정보(선택 사항)
  • host1[:port1] → 첫 번째 호스트 및 포트 번호
  • host2[:port2] → 추가 호스트 및 포트 번호(선택 사항)
  • database → 연결할 데이터베이스 이름(선택 사항)
  • options → 다양한 설정 옵션(선택 사항)

연결 문자열 옵션

연결 문자열의 옵션은 이름=값 형식으로 지정하며, 각 옵션은 & 기호로 구분됩니다.
아래는 주요 옵션을 정리한 표입니다.

옵션 설명
maxPoolSize 드라이버가 생성할 수 있는 최대 클라이언트 또는 연결 수를 지정합니다. 이 수에는 사용 중인 연결도 포함됩니다.
minPoolSize 연결 풀에서 유지해야 할 최소 연결 수를 지정합니다. 이 수에는 사용 중인 연결도 포함됩니다.
authMechanism 서버에 연결할 때 사용할 인증 메커니즘을 지정합니다.
기본값은 SCRAM-SHA-1 또는 SCRAM-SHA-256이며, 서버 버전에 따라 다릅니다. (인증 메커니즘 문서 참고)
authSource 인증할 데이터베이스를 지정합니다.
directConnection 연결 URI에서 지정한 호스트로 모든 작업을 강제 실행할지 여부를 지정합니다.
journal 클라이언트의 기본 쓰기 컨선(write concern) j 필드를 지정합니다.
ssl tls 옵션의 별칭으로, SSL/TLS 연결 사용 여부를 설정합니다.
tls TLS 연결이 필요한지 여부를 지정합니다. mongodb+srv 또는 tls 관련 옵션이 포함되면 기본적으로 tls=true로 설정됩니다.
w 클라이언트의 기본 쓰기 컨선 w 필드를 지정합니다.
wTimeoutMS 클라이언트의 기본 쓰기 컨선 wtimeout 필드를 지정합니다.

Table 4.4: Node.js configuration options

연결 압축(Connection Compression)

모든 MongoDB 드라이버와 마찬가지로, Node.js 드라이버는 메시지를 압축하는 기능을 제공합니다.
이 기능은 MongoDB와 애플리케이션 간의 네트워크 트래픽을 줄이는 데 도움이 됩니다.

Node.js 드라이버는 다음 세 가지 압축 알고리즘을 지원합니다.

  • Snappy: 매우 빠른 속도를 목표로 하며, 적절한 수준의 압축을 제공합니다.
  • zlib: 손실 없이 데이터를 압축하는 라이브러리입니다.
  • Zstandard (zstd): 실시간 압축을 위해 설계된 빠른 무손실 압축 알고리즘으로, zlib보다 높은 압축률을 제공합니다.

만약 여러 개의 압축 알고리즘을 지정하면,MongoDB 인스턴스에서 지원하는 가장 앞에 있는 알고리즘이 사용됩니다.

 

압축을 활성화하려면, compressors 매개변수를 연결 문자열에 추가하면 됩니다.
여러 개의 압축 알고리즘을 사용할 경우, 쉼표(,)로 구분하여 나열하면 됩니다.

const uri = "mongodb+srv://<user>:<password>@<cluster-url>/?compressors=snappy,zlib";
const client = new MongoClient(uri);

TypeScript를 사용한 MongoDB 연결

TypeScriptJavaScript의 상위 집합(Superset)으로, 정적 타입 검사 기능을 제공하여 대규모 애플리케이션 개발에 적합합니다.

TypeScript와 Node.js를 함께 사용하면, 안정적인 백엔드 솔루션을 구축할 수 있으며, 타입 안전성개발 생산성이 향상됩니다.

 

MongoDB를 TypeScript 프로젝트에서 사용하려면, Node.js 드라이버를 그대로 사용하면 되며, 추가적으로 TypeScript의 타입 정의(Type Definitions)를 활용할 수 있습니다.

이러한 타입 정의는 다음과 같은 이점을 제공합니다: 자동 완성(Auto-completion), 타입 검사(Type checking), 코드 품질 향상

TypeScript 파일에서 MongoDB를 설정하고 연결할 수 있습니다.
import { MongoClient, Db, Collection } from "mongodb";

const uri = "mongodb://user:pass@host:27017/?w=majority";
const client: MongoClient = new MongoClient(uri);

async function run(): Promise<void> {
  try {
    const database: Db = client.db('productions');
    const movies: Collection = database.collection('movies');

    // 데이터 구조를 정의하는 인터페이스
    interface Movie {
      title: string;
      [key: string]: any;
    }

    // 특정 필드를 포함하는 쿼리
    const query: Partial<Movie> = { title: '200 meters' };
    const movie: Movie | null = await movies.findOne(query);
    console.log(movie);
  } finally {
    await client.close();
  }
}

run().catch(console.dir);

위 코드에서는 TypeScript 인터페이스를 사용하여 데이터 구조를 정의함으로써,
데이터 구조를 더 명확하게 이해할 수 있고 데이터베이스 쿼리 시 타입 안전성(Type Safety)을 보장합니다.

 

TypeScript에서 복제 세트(Replica Set) 연결

TypeScript에서 복제 세트에 연결하는 방식은 Node.js와 유사하지만, 추가적인 타입 주석(Type Annotations)이 포함됩니다.

const uri = "mongodb://user:pass@node1:port1,node2:port2,node3:port3/?replicaSet=mySet";
const client: MongoClient = new MongoClient(uri);

연결 문자열의 구조는 Node.js 버전과 동일합니다.
하지만 TypeScript를 사용하면, 설정 객체를 정의할 때와 MongoDB에서 반환된 결과를 처리할 때 인터페이스 및 타입을 활용하여 타입 안전성과 코드 가독성을 향상할 수 있습니다. 

 

TypeScript에서 압축을 사용하여 MongoDB에 연결하는 방법은 Node.js와 유사합니다.
그러나 프로그램적으로 압축기를 정의할 경우 열거형(Enumeration)을 활용할 수 있습니다.

enum Compressors {
  SNAPPY = 'snappy',
  ZLIB = 'zlib',
  ZSTANDARD = 'zstd'
}

const uri = `mongodb+srv://<user>:<password>@<cluster-url>/?compressors=${Compressors.SNAPPY},${Compressors.ZLIB}`;
const client: MongoClient = new MongoClient(uri);

결론적으로, TypeScript에서 MongoDB에 연결하는 방법은 Node.js와 거의 동일하지만, 타입 정의(Type Definitions), 인터페이스(Interfaces)를 추가하면 개발자 경험이 향상되고, 타입 안전성과 코드의 명확성이 보장됩니다.


요약 (Summary)

이번 장에서는 PHP, Ruby, Node.js, Python을 사용하여 MongoDB에 연결하는 방법을 다루었습니다.
각 언어의 연결 프로세스를 심층적으로 분석하여,  핸즈온 코드 예제, 성능 및 보안 관련 필수 구성(Configuration) 옵션을 포함한 실용적인 지식을 제공합니다.

또한, ODM(Object-Document Mapper) 사용의 전략적 장점을 강조하였습니다.
ODM의 이점으로는 효율성 향상, 개발 시간 단축, 모델과 MongoDB 데이터베이스 간의 원활한 연계가 있습니다.

 

다음 장에서는 CRUD 연산(Create, Read, Update, Delete), 기본적인 MongoDB 쿼리(Query) 활용에 대해 실습해볼 예정입니다. 

'T. > Mastering MongoDB 7.0' 카테고리의 다른 글

6. Schema Design and Data Modeling  (0) 2025.03.10
5. CRUD Operations and Basic Queries  (0) 2025.03.10
3. Developer Tools  (0) 2025.03.10
2. The MongoDB Architecture  (0) 2025.03.10
1. Introduction to MongoDB  (2) 2025.03.10