자바칩
MongoDB 연결은 왜 한 번만 열고 공유해야 할까? 본문
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번만 | ✅ 맞습니다! 그렇게 쓰는 게 정석입니다 |
동시에 여러 작업 처리 가능? | ✅ 내부 커넥션 풀로 효율적으로 처리됨 |
멀티 쓰레드/프로세스 환경 | ✅ 안전하게 공유 가능 |
커넥션 관리 직접 해야 하나요? | ❌ 자동 관리됨 (필요시 설정 가능) |
'Study' 카테고리의 다른 글
Flask는 동기인데 동시에 여러 요청을 처리할 수 있을까? (0) | 2025.05.22 |
---|---|
[Docker] 이미지 / 컨테이너 / 도커 용어 개념 정리 (0) | 2025.04.18 |
FastAPI vs Spring Boot (1) | 2025.04.15 |
비동기(Asynchronous) vs 멀티스레드(Multi-threading) (0) | 2025.04.15 |
[Spring] Spring Boot에서 동시성 처리 방법 (0) | 2025.04.15 |