자바칩

MongoDB 연결은 왜 한 번만 열고 공유해야 할까? 본문

Study

MongoDB 연결은 왜 한 번만 열고 공유해야 할까?

아기제이 2025. 5. 22. 14:07
728x90

MongoClient 인스턴스는 내부적으로 "연결 풀(connection pool)"을 관리하므로
한 번만 생성해서 여러 곳에서 동시에 사용하는 것이 바로 정석이다.

 

✅ MongoClient는 쓰레드/프로세스 세이프한가?

질문 답변
하나의 MongoClient 인스턴스를 여러 쓰레드에서 공유해도 되는가 Yes (완전 지원됨)
Flask, FastAPI, Celery, 다수의 사용자 요청에서 동시에 사용해도 되는가 Yes
연결 병목은 생기지 않는가 ❌ 일반적인 수준에서는 생기지 않음 (연결 풀 자동 관리됨)

🔧 작동 방식: 내부 Connection Pool

  • MongoClient는 MongoDB 서버와의 연결을 관리하는 커넥션 풀(pool of sockets) 을 유지합니다.
  • 기본적으로 100개의 연결을 풀로 유지하며, 필요에 따라 자동으로 늘어나거나 대기합니다.
  • 동시에 다수의 find, insert, update 요청이 들어와도, 내부적으로 커넥션을 적절히 분배합니다.

📌 참고: 설정 가능한 옵션들

필요하다면 연결 풀 사이즈 등을 조절할 수 있습니다:

MongoClient(
    _mkpkdb.mongo_con_str,
    maxPoolSize=200,       # 커넥션 풀 최대 크기
    minPoolSize=10,        # 최소 커넥션 수 유지
    serverSelectionTimeoutMS=3000  # 서버 연결 타임아웃 (ms)
)

 

하지만 대부분의 앱에서는 기본값으로 충분합니다.


✅ Flask, FastAPI, Celery, 스케줄러 등 다양한 환경에서도?

  • MongoClient는 멀티스레드 안전(thread-safe) 하며,
  • Flask의 요청마다 공유되어도 문제 없음
  • FastAPI의 비동기 루프에서 사용해도 됨 (단, pymongo는 async 아님)
  • Celery worker, 백그라운드 잡에서도 공유 가능

🧠 요약

항목 설명
MongoClient 생성은 1번만 ✅ 맞습니다! 그렇게 쓰는 게 정석입니다
동시에 여러 작업 처리 가능? ✅ 내부 커넥션 풀로 효율적으로 처리됨
멀티 쓰레드/프로세스 환경 ✅ 안전하게 공유 가능
커넥션 관리 직접 해야 하나요? ❌ 자동 관리됨 (필요시 설정 가능)