NPM 마스터 클래스 Ep 2. 의존성 관리 완벽 가이드: dependencies vs devDependencies

지난 시간에 `npm install dayjs`를 입력해서 패키지를 설치했습니다. 그런데 어떤 인터넷 글을 보면 `--save-dev`나 `-D`를 붙여서 설치하라고 합니다. 도대체 그냥 설치하는 것과 무슨 차이가 있을까요?

---

1. dependencies (일반 의존성)

"이 패키지가 없으면 프로그램이 실행조차 안 돼요!" 하는 친구들입니다.

예를 들어 `dayjs`(날짜 계산), `express`(웹 서버), `react`(UI 라이브러리) 같은 것들이죠.

npm install dayjs

이 명령어로 설치하면 `package.json`의 `"dependencies"` 항목에 추가됩니다. 실제 서비스가 배포되어 돌아갈 때 반드시 필요한 파일들입니다.

2. devDependencies (개발 의존성)

"이 패키지는 개발할 때만 필요하고, 실제 서비스 돌릴 땐 필요 없어요!" 하는 친구들입니다.

예를 들어 `prettier`(코드 정리), `jest`(테스트), `nodemon`(서버 자동 재실행) 같은 도구들이죠.

npm install --save-dev nodemon
# 또는 짧게
npm install -D nodemon

이렇게 설치하면 `"devDependencies"` 항목에 추가됩니다. 나중에 실제 서버에 배포할 때, 이 목록에 있는 패키지들은 설치되지 않아서 서버 용량을 아낄 수 있습니다.

3. 버전 기호의 비밀: ^ vs ~

`package.json`을 자세히 보면 버전 앞에 이상한 기호가 붙어 있습니다.

"dependencies": {
  "dayjs": "^1.11.10"
}

이것은 Semantic Versioning (SemVer) 규칙에 따라 업그레이드 범위를 정하는 것입니다. 버전은 보통 `Major.Minor.Patch` (예: 1.11.10)로 이루어져 있습니다.

* 캐럿(^): `^1.11.10` -> 가장 왼쪽 숫자(Major, 1)만 안 바뀌면 다 업데이트해라! (예: 1.12.0, 1.99.9 가능 / 2.0.0 불가능)

* 틸드(~): `~1.11.10` -> 중간 숫자(Minor, 11)까지 안 바뀌면 다 업데이트해라! (예: 1.11.11, 1.11.20 가능 / 1.12.0 불가능)

보통은 `^`(캐럿)을 기본으로 씁니다. 마이너 업데이트는 새로운 기능이 추가되지만 기존 기능이 고장 나지 않는(하위 호환성 보장) 범위이기 때문입니다.

---

🛠️ 오늘의 미션: 개발용 패키지 설치하기

서버 코드를 수정할 때마다 껐다 켜기 귀찮으셨죠? `nodemon`이라는 개발용 도구를 설치해 봅시다.

1. 터미널에 입력합니다.

   npm install -D nodemon
   

2. `package.json`을 확인해 보세요.

   "devDependencies": {
     "nodemon": "^3.0.0"
   }
   

이렇게 `devDependencies`에 잘 들어갔다면 성공입니다!

---

🔗 다음 예고

패키지는 설치했는데, 매번 `node server.js`라고 치거나 `npx nodemon server.js`라고 길게 치기 귀찮지 않나요? 다음 시간엔 "귀찮은 작업은 스크립트로! (NPM Scripts)"를 통해 나만의 단축키를 만드는 법을 배웁니다.