npm install로 모듈을 설치할 때 --save 옵션을 주어 설치할 수도 있고, --save-dev 옵션을 주어 설치할 수도 있다. 이 두 가지 옵션의 차이점은 서비스 로직에 필수적인 의존성이냐, 아니면 개발 과정에서 필요한 부수적인 도구냐라고 할 수 있다.
서비스 로직에 필수적이라면 컴파일 타임이나 런 타임에 에러가 발생하게 된다. 이런 모듈은 --save 옵션으로 설치하는 게 맞다. 참고로 npm 버전 5부터는 --save 옵션은 생략 가능하다. npm 버전이 현재 8.x이므로 --save 옵션은 그냥 잊도록 하자.
예를 들면, axios나 lodash 등의 모듈은 서비스 로직에서 직접 import해서 사용하게 되는데 다음과 같이 설치한다.
npm install axios
테스트 프레임웍이나 패키징 도구는 서비스 로직과는 관련이 없다. 그냥 개발할 때 편의성을 제공할 뿐이다. 이런 모듈은 --save-dev 옵션으로 설치하는 게 당연하다. --save-dev 옵션은 -D 옵션으로 줄여서 사용할 수 있다.
예를 들어, karma같은 테스트 러너(test runner)는 다음과 같이 설치한다.
npm install -D karma
--save 옵션으로(또는 옵션없이) 설치하면 package.json 파일의 dependencies 섹션에 설치 정보가 저장된다.
"dependencies": {
"axios": "^0.27.2"
},
--save-dev 옵션으로(또는 -D 옵션) 설치하면 package.json 파일의 devDependencies 섹션에 설치 정보가 저장된다.
"devDependencies": {
"karma": "^6.4.0"
}
나중에 이 프로젝트를 clone한 뒤, npm install을 실행하게 되면 dependencies나 devDependencies에 기록된 모듈들은 설치된다. node_modules 디렉토리를 삭제하고 npm install을 실행해보면 재설치되는 것을 간단히 확인할 수 있다. 그럼 무슨 차이점이 있는 걸까?
바로, 빌드된 결과물에 포함될 것이냐의 여부가 다르다. dependencies에 속한 모듈들은 빌드 과정에 포함된다. 그래야 서비스가 배포되고 런타임에 오류가 발생하지 않을 것이다. 그러나 devDependencies에 속한 모듈들은 빌드에서 제외된다. 서비스 로직과 관련이 없기 때문이다.
| dependencies 모듈 | devDependencies 모듈 | |
|---|---|---|
| 용도 | 서비스 로직에 필요할 때 | 개발 도구로써 사용할 때 |
| npm install 옵션 | --save 또는 옵션 미지정 | --save-dev 또는 -D |
| 이 프로젝트를 clone하고 npm intall할 때 모듈의 설치 여부 | 설치됨 | 설치됨 |
| 빌드 결과물(artifact)에 포함되는지의 여부 | 포함됨 | 포함되지 않음 |
https://stackoverflow.com/questions/22891211/what-is-the-difference-between-save-and-save-dev