문제 정의

Node.js에서 Mongoose를 사용해 MongoDB에 연결할 때, connectDB()를 아래처럼 작성하면 콘솔에 다음과 같은 경고가 함께 출력됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const connectDB = () => {
  mongoose
    .connect(
      `mongodb://${config.db.host}:${config.db.port}/${config.db.name}`,
      { useUnifiedTopology: true, useNewUrlParser: true }
    )
    .then(() => {
      console.log("DB connection successful.");
    })
    .catch((err) => {
      console.log(`DB connection error:${err}`);
    });
};

실제 출력되는 경고는 다음과 같습니다.

1
2
3
(node:17692) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option:
useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed
in the next major version. (마찬가지로 useUnifiedTopology, useFindAndModify, useCreateIndex도 함께 경고)

코드 자체는 정상 동작해 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 버전useNewUrlParseruseUnifiedTopologyuseCreateIndexuseFindAndModify올바른 연결 코드
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 이상이면 아래 해결책을 바로 적용하면 됩니다.

1
2
3
node -e "console.log(require('mongoose/package.json').version)"
# 예: 8.x.x, 7.x.x, 6.x.x → 이 글의 해결책 적용
# 5.x.x → 이 옵션들이 여전히 필요하므로 업그레이드 이후 제거

2단계 — 연결 코드에서 옵션 제거 (권장 해결책)

Mongoose 6+ 에서는 deprecated 옵션들을 모두 빼고 URL만 넘기면 됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const connectDB = () => {
  mongoose
    .connect(`mongodb://${config.db.host}:${config.db.port}/${config.db.name}`)
    .then(() => {
      console.log("DB connection successful.");
    })
    .catch((err) => {
      console.log(`DB connection error:${err}`);
    });
};

혹시 연결 문자열에 authSource, ssl, replicaSet 같은 추가 설정이 필요하다면, 이 옵션들은 deprecated 옵션이 아니므로 연결 문자열 쿼리 스트링 또는 useNewUrlParser류가 아닌 별도 옵션으로 전달할 수 있습니다. use 접두어 옵션은 제거하는 것이 핵심입니다.

검증 명령

연결 고통 코드를 수정한 뒤에도 DB 연결이 정상인지, 경고가 사라졌는지 확인합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1) Mongoose 버전 확인 (6+ 여부)
node -e "console.log(require('mongoose/package.json').version)"

# 2) 앱 실행 후 경고 로그가 사라졌는지 확인
npm start
# 콘솔에 "(node:...) [MONGODB DRIVER] Warning: useNewUrlParser ..." 가 더 이상
# 출력되지 않으면 정상 해결

# 3) 실제 DB에 연결/조회가 되는지 간단히 확인
node -e "const m=require('mongoose'); m.connect('mongodb://127.0.0.1:27017/test').then(()=>{console.log('ok'); return m.disconnect();}).catch(e=>{console.error('fail',e.message)})"

잘못된 해결책 (권장하지 않음)

  • 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 경고가 사라지고 깨끗한 로그로 운영할 수 있습니다.

출처