반응형
처음 node를 접할때 많이들
node / npm / npx의 역할 차이, 그리고
글로벌 설치(-g), 일반 설치, 개발용 설치(-D) 를 헷갈려 한다.
이 글은 처음 Node 생태계를 접하는 분들을 위한 기초개념 내용이다.
1. node / npm / npx는 각각 뭐 하는 놈인가?
- node: JavaScript 실행기
- npm: 패키지 설치/관리 도구
- npx: 패키지를 “설치 없이 실행”해주는 실행기
구조로 보면 아래와 같다.
Node.js
├─ node (런타임)
├─ npm (패키지 관리자)
└─ npx (패키지 실행기)
2. npm은 “설치”, npx는 “실행”
npm: 패키지 설치 담당
npm install express
npm install -D typescript
- node_modules에 패키지를 다운로드
- package.json과 package-lock.json 갱신
npx: 패키지 실행 담당
npx tsc --init
이 명령의 실제 의미는:
- 현재 프로젝트에 typescript가 설치돼 있으면 사용
- 없으면 임시로 다운로드
- tsc 실행
- 끝나면 버림
=> 설치 없이 실행
=> 전역 설치 없이도 CLI 사용 가능
3. npx tsc --init는 정확히 무슨 의미인가?
“TypeScript 컴파일러에게 이 프로젝트의 기본 설정 파일을 만들어달라”
- tsc: TypeScript Compiler
- --init: 컴파일 X (설정 파일 생성 옵션)
결과:
tsconfig.json 생성
컴파일은 전혀 하지 않는다.
4. npm 설치 방식 3가지 정리
① 글로벌 설치 (-g)
npm install -g typescript
- Node 설치 경로 하위에 설치
- 해당 PC의 모든 프로젝트에서 공용 사용
- 버전 충돌 위험 큼
- 요즘은 거의 사용 안 함
② 일반 설치 (dependencies)
npm install express
- 프로젝트 하위 node_modules 폴더에 설치
- 런타임에 필요
- 서버 실행 시 사용됨
"dependencies": {
"express": "^4.19.0"
}
③ 개발용 설치 (-D, devDependencies)
npm install -D typescript
- 개발 / 빌드 시에만 필요
- 런타임에는 필요 없음
- 배포 시 제외 가능
"devDependencies": {
"typescript": "^5.4.0"
}
TypeScript는 거의 항상 -D가 정답
5. TypeScript는 왜 무조건 -D일까?
- TypeScript는 런타임에 존재하지 않음
- 컴파일되면 JS만 남음
- 서버에는 필요 없음
- CI/CD, 로컬 개발 단계에서만 사용
=> devDependencies가 정확한 위치
6. 패키지 버전은 어떻게 관리되나?
기본 설치
npm install axios
"axios": "^1.6.7"
- 최신 버전 다운로드
- ^는 메이저 버전 고정
특정 버전 설치
npm install axios@1.6.0
"axios": "1.6.0"
버전 기호 정리
| 1.6.0 | 정확히 이 버전 |
| ^1.6.0 | 1.x 최신 허용 |
| ~1.6.0 | 1.6.x만 허용 |
| * | 전부 허용 (비추) |
7. 실제 설치된 정확한 버전은 어디에?
=> package-lock.json
- package.json → 허용 범위
- package-lock.json → 실제 설치 결과
CI 환경에서는 보통:
npm ci
핵심 요약
- npm은 설치
- npx는 실행
- 글로벌 설치는 최소화
- 프로젝트 단위는 로컬 설치
- TypeScript는 거의 항상 -D
- 실제 버전 고정은 package-lock.json
Node 생태계는 처음 보면 복잡해 보이지만,
역할만 분리해서 이해하면 의외로 단순하다.