1단계: 문제 정의
Node.js에서 mongodb npm 패키지로 MongoDB에 연결하려 할 때 다음과 같은 traceback이 발생하는 상황입니다.
에러 로그 (원문)
| |
재현 코드 (원문)
| |
오류 메시지는 두 개의 숫자가 언급됩니다.
Server ... reports wire version 0— MongoDB 서버가 응답한 wire protocol 버전(0)Driver requires at least 2 (MongoDB2.6)— mongodb 드라이버가 요구하는 최소 wire protocol 버전(2, 즉 MongoDB 2.6부터 지원)
서버가 보고한 값보다 드라이버가 요구하는 값이 더 크므로, 연결 대상 MongoDB 서버가 이 드라이버 버전에 비해 너무 오래된 것입니다.
2단계: 원인 탐구
이 오류는 코드 로직 문제가 아닌 버전 호환성 문제입니다. MongoDB는 클라이언트(드라이버)와 서버 사이의 통신 규약을 wire protocol이라는 버전 번호로 협상합니다.
- MongoDB 서버는 응답(handshake)에서 자신이 지원하는 wire version을 알려줍니다.
- 드라이버는 자신이 요구하는 최소 wire version을 알고 있습니다.
- 서버가 보고하는 wire version이 드라이버의 최소 요구치보다 낮으면 연결이 거부됩니다.
이 원문 사례에서 연결 대상은 mongodb://localhost:27017/의 로컬 MongoDB 서버입니다. 서버가 wire version 0을 보고한 만큼, 대체로 MongoDB 2.6 이전 또는 매우 오래된 서버 버전이 로컬에 떠 있다는 뜻으로 해석할 수 있습니다.
3단계: 근본 원인 분석
핵심은 npm으로 최신 mongodb 드라이버를 설치했지만, 실제 MongoDB 서버 버전이 그 드라이버가 요구하는 버전에 미치지 못한다는 점입니다.
wire protocol 버전과 MongoDB 서버 버전의 대응 관계는 대략 다음과 같습니다. (일반적인 점검 기준이며 환경에 따라 다를 수 있습니다.)
| MongoDB 서버 버전 | 지원 wire protocol (대략) | 비고 |
|---|---|---|
| MongoDB 2.4 이하 | wire version 0 | 드라이버 요구치(2) 미달 → 이 오류 발생 |
| MongoDB 2.6 | wire version 1 | 최신 드라이버와 협상이 어려울 수 있음 |
| MongoDB 3.0 | wire version 2 | 드라이버 최소 요구치 충족 |
| MongoDB 3.2 이후 | wire version 3+ | 대부분의 현대 드라이버 호환 |
| 원인 후보 | 확인 명령 | 맞는 경우의 증상 | 해결 방향 |
|---|---|---|---|
| MongoDB 서버가 드라이버 요구 버전보다 오래됨 | mongod --version | 서버가 wire version 0을 보고, 드라이버는 2를 요구 | 서버 업그레이드 또는 드라이버 다운그레이드 |
| mongodb 드라이버 버전이 서버에 비해 너무 높음 | npm list mongodb | 최신 드라이버인데 오래된 서버에 연결 시도 | 호환 드라이버 버전으로 변경 |
| 서버가 정상적으로 handshake하지 못하는 프록시/터널 | mongosh --host localhost 직접 접속 | 직접 접속은 되지만 드라이버에서만 오류 | 네트워크 경로 점검 |
증상 fingerprint 요약: 이 오류가 뜨면 대부분 서버 버전보다 드라이버 버전이 앞서 있습니다. 드라이버 자체를 최신으로 올리기보다 “현재 접속하는 MongoDB 서버 버전 + Node 버전"에 맞는 드라이버 버전을 찾는 것이 빠른 판단 기준입니다.
4단계: 코드 해결책
임시 해결책 1 — 호환 가능한 드라이버 버전 설치 (드라이버 다운그레이드)
원문 답변 작성자는 mongodb-version-list 모듈을 이용해 현재 Node 환경에서 사용 가능한 mongodb 드라이버 버전 목록을 조회한 뒤, 서버와 호환되는 버전을 골라 설치했습니다.
| |
목록에서 서버 버전과 맞는 드라이버를 골라 설치합니다 (예시, --save-exact로 버전 고정 권장):
| |
설치 후 연결을 다시 시도하면 wire version 협상이 성공할 수 있습니다.
임시/권장 해결책 2 — MongoDB 서버 업그레이드
서버 자체가 오래된 경우(예: MongoDB 2.4 이하) 드라이버를 추측 식으로 낮추기보다, MongoDB 서버를 드라이버가 요구하는 버전 이상으로 업그레이드하는 것이 장기적으로 맞는 방법입니다. 최신 드라이버에서 제공하는 기능과 보안 패치를 함께 쓸 수 있기 때문입니다.
| |
버전이 MongoDB 2.6 미만이라면 서버 업그레이드를 검토하세요. 프로덕션에서는 업그레이드 전 데이터 백업과 다운타임 계획이 필요합니다.
5단계: 향후 예방 조치
검증 명령
드라이버를 변경한 뒤 연결이 정상적으로 되는지 아래 명령으로 확인합니다.
| |
재발 방지 체크
- 버전 고정:
package.json에서mongodb버전을--save-exact로 고정하고, 호환성을 확인한 뒤에만 수동 업그레이드합니다. - 서버 버전 사전 확인: 배포/로컬 환경 모두에서
mongod --version으로 서버 버전을 기록해 두면 드라이버 선택 기준이 명확합니다. - 의존성 충돌 방지: 프로젝트에 드라이버를 루트에만 설치하고, 서로 다른 버전이 중복으로 설치되지 않게
npm ls mongodb로 트리를 점검합니다. - 일반적인 점검 기준: 원본 답변은 드라이버 버전 다운그레이드에 초점을 둡니다. “드라이버가 요구하는 버전 vs 서버가 보고하는 버전"을 항상 먼저 비교하세요.
출처
- 원본 질문/답변: StackOverflow — node.js and mongodb and traceback saying Driver requires at least 2 (MongoDB2.6)
- 참고 모듈 정보:
mongodb-version-list(원문 답변에서 사용)
DevTrace verdict
이 문제의 핵심은 MongoDB 서버가 부족해서가 아니라, 접속 대상 MongoDB 서버의 wire protocol 버전(wire version 0)이 mongodb 드라이버가 요구하는 최소 수준(2, MongoDB 2.6)보다 낮은 데 있으며, 드라이버를 다운그레이드하거나 MongoDB 서버를 업그레이드해 양쪽 버전의 스펙을 맞추면 해결됩니다.