문제 정의
Node.js에서 Mongoose를 사용해 MongoDB에 연결할 때, connectDB()를 아래처럼 작성하면 콘솔에 다음과 같은 경고가 함께 출력됩니다.
| |
실제 출력되는 경고는 다음과 같습니다.
| |
코드 자체는 정상 동작해 DB 연결은 성공하는데, 실행할 때마다 경고 로그가 쌓이는 상황입니다. 이 경고는 단순히 “보기 싫은 로그"가 아니라, 사용 중인 Mongoose 버전과 연결 옵션이 맞지 않다는 신호입니다.
원인 탐구
경고가 발생하는 핵심 질문은 “왜 이제 useNewUrlParser: true를 넘기면 안 되는가"입니다.
이 경고는 Mongoose 버전별 연결 옵션의 역할 변화에서 시작됩니다.
- Mongoose 4.x: 초기 드라이버에서는 URL parser 옵션이 없었습니다.
- Mongoose 5.x:
useNewUrlParser,useUnifiedTopology,useFindAndModify,useCreateIndex라는 옵션들이 등장했고, 구형 동작과 호환되도록 명시적으로 켜줘야 deprecation 경고가 사라졌습니다. 즉 5.x에서는 이 옵션들을 true로 넘기는 것이 정상적인 사용법이었습니다. - Mongoose 6.0+: 아래 네 옵션은 완전히 제거되었습니다. Mongoose 6은 마치
useNewUrlParser: true,useUnifiedTopology: true,useCreateIndex: true,useFindAndModify: false가 항상 설정된 것처럼 동작합니다.
따라서 5.x 시절 작성했던 연결 옵션을 그대로 6.x에 복붙하면 “더 이상 필요 없는/효과 없는 옵션 때문에 경고를 띄우는” 상황이 됩니다. 에러가 아니라 경고인 이유도, Mongoose가 새 기본 동작을 강제하고 있기 때문입니다.
근본 원인 분석
표면 증상: useNewUrlParser(등) deprecated 경고 로그 발생.
근본 원인: Mongoose 6.x 이상에서 이 옵션들이 지원되는 목록에서 제거되었는데, 5.x 시절 작성된 연결 코드가 옵션을 계속 전달하기 때문입니다. 옵션은 “곧 없어질 것"이 아니라 이미 제거된 것이므로, 킵해두거나 켜주던 방식으로는 경고가 사라지지 않습니다.
이 상황에서 가장 흔한 오해는 “경고니까 useNewUrlParser: true, useNewUrlParser: true를 다시 확인해 주면 되지 않을까” 또는 “예전 코드가 동작했으니 옵션을 유지해야 한다"라는 생각입니다. 실제로는 옵션을 제거하는 것이 정답이며, 옵션을 유지한 채로는 경고가 계속 남습니다.
아래는 버전별 차이를 정리한 표입니다.
| Mongoose 버전 | useNewUrlParser | useUnifiedTopology | useCreateIndex | useFindAndModify | 올바른 연결 코드 |
|---|---|---|---|---|---|
| 5.x | 명시적으로 true 필요 (등록됨) | 명시적으로 true 필요 (5.7+) | 명시적으로 true 필요 | 명시적으로 false 권장 | 옵션을 넘겨 사용 |
| 6.x | 항상 true (옵션 제거) | 항상 true (옵션 제거) | 항상 true (옵션 제거) | 항상 false (옵션 제거) | 옵션 없이 mongoose.connect(url) |
| 7.x / 8.x | 제거됨 | 제거됨 | 제거됨 | 제거됨 | 옵션 없이 mongoose.connect(url) |
위 표는 일반적인 Mongoose 버전별 동작을 기준으로 합니다. 사용 중인 Mongoose 패키지 버전에 따라 세부 시점이 다를 수 있다는 점에 유의하세요.
코드 해결책
1단계 — 설치된 Mongoose 버전 확인
먼저 자신의 Mongoose가 몇 버전인지 확인합니다. 버전이 6.x 이상이면 아래 해결책을 바로 적용하면 됩니다.
| |
2단계 — 연결 코드에서 옵션 제거 (권장 해결책)
Mongoose 6+ 에서는 deprecated 옵션들을 모두 빼고 URL만 넘기면 됩니다.
| |
혹시 연결 문자열에 authSource, ssl, replicaSet 같은 추가 설정이 필요하다면, 이 옵션들은 deprecated 옵션이 아니므로 연결 문자열 쿼리 스트링 또는 useNewUrlParser류가 아닌 별도 옵션으로 전달할 수 있습니다. use 접두어 옵션은 제거하는 것이 핵심입니다.
검증 명령
연결 고통 코드를 수정한 뒤에도 DB 연결이 정상인지, 경고가 사라졌는지 확인합니다.
| |
잘못된 해결책 (권장하지 않음)
- Mongoose를 5.x로 다운그레이드: 경고만 보고 버전을 내리는 것은 회귀(regression)를 부르고 보안 업데이트를 놓치게 됩니다. 경고는 옵션 제거로 해결할 수 있는 문제이므로 다운그레이드는 불필요합니다.
(node:...) [MONGODB DRIVER] Warning그대로 두기: 영향 없다고 방치하면 운영 로그가 경고로 도배되고, 나중에 실제 오류를 놓치기 쉽습니다.try { ... } catch로 경고 출력을 무시: 경고는 try/catch로 잡히지 않는 프로세스 출력이므로, 사양을 숨기는 데만 그칠 뿐 근본 문제를 해결하지 못합니다.
향후 예방 조치
- Mongoose 연결 코드를 새로 작성할 때는 이전 버전의 예제 옵션(
useNewUrlParser,useUnifiedTopology,useFindAndModify,useCreateIndex)을 복사하지 맙니다. Mongoose 6+ 공식 입문에서는 옵션 없이mongoose.connect(uri)를 사용합니다. package.json의 mongoose 버전을 잘 관리하고, 메이저 업그레이드 시 deprecation 경고가 등장하면 곧바로 해당 옵션을 제거하는 코드 리팩토링를 수행합니다.- CI에
npm출력 라인에서Warning:/DeprecationWarning:텍스트가 감지되면 실패하도록 체크를 추가하면 새 경고가 잠입하는 것을 방지합니다(일부 프로젝트에서 ESLint/CI 파이프라인으로 활용하는 방식). - 사용 중인 Mongoose 메이저 버전을 경고가 발생하는 즉시 확인하는 습관을 들이면, 옵션 시 대응을 반복하지 않고 원인별로 올바르게 대응할 수 있습니다.
심화 체크 (실전 적용)
| 단계 | 확인 항목 | 확인 명령 |
|---|---|---|
| 로컬 | 설치 Mongoose 버전이 6+인지 | node -e "console.log(require('mongoose/package.json').version)" |
| 로컬 | 연결 시 에러/경고 없이 성공하는지 | npm start 후 로그 확인 |
| CI | 코드베이스의 옛 옵션이 제거됐는지 | grep -rn "useNewUrlParser|useUnifiedTopology" src/ (여러 옵션 존재하면 수정 필요) |
| 프로덕션 | 배포 후 경고 로그가 더 이상 안 쌓이는지 | 로그 모니터 대시보드에서 [MONGODB DRIVER] Warning 검색 |
위 체크 항목은 일반적인 점검 기준이며, 프로젝트 모니터링/배포 방식에 따라 적용 범위가 다를 수 있습니다.
이 문제의 핵심은 “MongoDB 패키지가 없다"거나 “연결 URL이 틀렸다"는 것이 아니라, Mongoose 6+에서 이전 버전용 연결 옵션이 제거된 버전 호환 문제라는 점입니다. 옵션을 제거해 코드를 단순화하는 것이 완전한 해결책입니다.
앞서 언급한 올바른 연결 코드와 검증 명령을 그대로 쓰면, 더 이상 마주할 deprecated 경고가 사라지고 깨끗한 로그로 운영할 수 있습니다.