728x90
Hoisting 개념 정리 (JavaScript vs npm)
배경
“호이스팅(hoisting)”이라는 용어는 JavaScript 언어와 npm 패키지 관리에서 모두 사용된다.
동일한 단어를 사용하지만, 적용 대상과 목적, 동작 방식은 서로 다르다.
핵심 질문
- JavaScript에서 말하는 호이스팅은 무엇인가?
- npm에서 말하는 의존성 호이스팅은 무엇인가?
- 두 개념은 어떻게 연결되고, 왜 혼동되는가?
논의 요약
1. JavaScript의 Hoisting
- JavaScript 엔진은 실행 전에 선언(declaration)을 먼저 처리한다.
- 코드가 실제로 이동하는 것은 아니며, 실행 컨텍스트 생성 단계에서 선언을 스코프 상단에 등록한다.
특징
var- 선언은 호이스팅됨
- 초기화는 호이스팅되지 않음 →
undefined
let,const- 선언은 호이스팅되지만 TDZ(Temporal Dead Zone) 로 접근 불가
- 함수 선언문
- 선언 + 정의 전체가 호이스팅됨
요약
“아래에 선언된 변수를 코드 상단에서도 사용할 수 있게 보이게 만드는 언어 동작”
2. npm의 의존성 Hoisting
- npm은 여러 패키지가 공통으로 사용하는 의존성을
상위node_modules디렉토리로 끌어올리는 설치 전략을 사용한다.
목적
- 중복 패키지 설치 감소
- 모듈 탐색 경로 단순화
- 설치 구조 최적화
부작용
- 유령 의존성(Phantom Dependency) 발생
package.json에 선언하지 않은 패키지도 import 가능해지는 문제
3. 두 Hoisting 개념의 공통점과 차이
| 구분 | JavaScript Hoisting | npm Hoisting |
|---|---|---|
| 대상 | 변수, 함수 선언 | 패키지 의존성 |
| 위치 | 스코프 최상단 | node_modules 상단 |
| 목적 | 실행 가능성 확보 | 중복 제거, 설치 최적화 |
| 문제점 | TDZ 등 혼동 | 유령 의존성 |
| 본질 | 언어 실행 모델 | 패키지 배치 전략 |
공통점:
- “아래에 있던 것을 위에서도 접근 가능하게 만든다”
4. pnpm과의 연결점
- pnpm은 npm식 의존성 hoisting을 구조적으로 제한
package.json에 명시된 의존성만 접근 가능- 의존성 오류를 런타임이 아니라 설계 단계에서 차단
결정 사항
- JavaScript 호이스팅과 npm 호이스팅은 같은 개념이 아님으로 명확히 구분한다.
- “호이스팅”이라는 단어는 비유적 유사성 때문에 재사용된 용어로 이해한다.
- 의존성 안정성을 중시하는 환경에서는 pnpm 방식이 더 적합하다고 판단한다.
728x90
'JS' 카테고리의 다른 글
| Node.js 에서 멀티코어를 활용하자 - 3 - 기본 Cluster (0) | 2026.02.02 |
|---|---|
| Node.js 에서 멀티코어를 활용하자 - 실무에서 쓰자 개념 (0) | 2026.02.02 |
| Node.js 에서 멀티코어를 활용하자 - 개념 (0) | 2026.02.02 |
| TDZ (Temporal Dead Zone) (0) | 2026.01.19 |
| npm VS pnpm (0) | 2026.01.19 |