블로그
frontend
2遺??뚯슂

번들러는 최적화여야 한다: 웹 의존성 해석을 플랫폼으로 돌려놓기

한 문장 결론: 브라우저는 모듈을 URL로 로드하므로, 지정자(specifier)를 URL로 해석하는 규칙이 제품 수준으로 정리되지 않으면 번들러가 ‘필수 레이어’가 된다.

번들러는 최적화여야 한다: 웹 의존성 해석을 플랫폼으로 돌려놓기

**한 문장 결론:** 브라우저는 모듈을 URL로 로드하므로, 지정자(specifier)를 URL로 해석하는 규칙이 제품 수준으로 정리되지 않으면 번들러가 ‘필수 레이어’가 된다.

배경/문제

브라우저의 ESM은 `import`가 결국 URL로 해석되어야 모듈을 가져올 수 있다. 반면 많은 개발 경험은 “패키지 이름 같은 지정자”로 의존성을 표현한다. 이 간극이 커질수록 번들러는 최적화 도구를 넘어 **의존성 해석 레이어**까지 맡게 된다.

핵심 개념

지정자(specifier) → URL 해석이 병목이다

브라우저는 모듈을 URL로 요청한다. 그래서 `import "pkg"`처럼 URL이 아닌 문자열을 쓰려면, 그 문자열을 어떤 URL로 매핑할지 규칙이 필요하다.

```mermaid

flowchart LR

A["App 코드<br/>import 'pkg'"] -->|"specifier"| B["해석 필요<br/>pkg → URL"]

B --> C["브라우저 ESM 로더<br/>fetch(URL)"]

C --> D["모듈 그래프<br/>transitive deps"]

B -->|"옵션"| E["Import Map<br/>런타임 매핑"]

B -->|"옵션"| F["번들러<br/>빌드 시 해석"]

```

→ 기대 결과/무엇이 달라졌는지: “번들러가 왜 등장하는가”를 성능이 아니라 **해석 단계**로 설명할 수 있다.

해결 접근

1) Import Map으로 지정자 → URL을 매핑한다

  • 왜 하는지: 코드에서는 지정자를 유지하면서, 브라우저가 이해하는 URL로 변환하기 위해
  • 기대 결과: 런타임에 해석 규칙을 명시적으로 통제할 수 있다.

2) 번들러로 해석을 빌드 시점에 고정한다

  • 왜 하는지: 해석/변환/최적화를 한 번에 처리해 배포물의 URL 구조를 단순화하기 위해
  • 기대 결과: 앱 코드는 지정자를 유지하고, 배포는 산출물 중심으로 운영된다.

구현(코드)

Import Map 예시

```html

<script type="importmap">

{

"imports": {

"mypkg": "/vendor/mypkg/index.js"

}

}

</script>

<script type="module">

import { hello } from "mypkg";

hello();

</script>

```

→ 기대 결과/무엇이 달라졌는지: 브라우저는 지정자를 Import Map에 따라 URL로 바꾼 뒤, 그 URL을 로드해 모듈 그래프를 확장한다.

검증 방법(체크리스트)

Import Map이 모듈 로딩 이전에 적용되도록 문서 구조가 보장된다.
지정자 매핑 변경의 소유권/배포 단위가 정의되어 있다.
트랜지티브 디펜던시(의존성의 의존성)까지 포함한 전달 모델이 정리되어 있다.

흔한 실수/FAQ

**Q1. Import Map이면 모든 게 끝나나요?**

Import Map은 지정자 매핑을 제공하지만, 전역 매핑과 해석 타이밍 같은 제약이 있다. 규모가 커질수록 변경 관리가 더 중요해진다.

**Q2. 번들러는 꼭 필요한가요?**

환경/정책에 따라 달라질 수 있다. 다만 “specifier → URL” 해석을 플랫폼이 충분히 덜어주지 못하는 상황에서는 번들러가 운영의 중심이 되기 쉽다.

요약

  • 브라우저 ESM은 URL 기반이다.
  • 병목은 성능이 아니라 “specifier → URL” 해석이다.
  • Import Map/번들러는 이 병목을 각기 다른 시점(런타임/빌드타임)에 해결한다.

결론

번들러는 최적화 도구로 남아야 한다. 의존성 해석이 플랫폼 레벨에서 더 자연스러워질수록, 번들러는 “필수 레이어”가 아니라 “선택 가능한 최적화”에 가까워진다.

참고(공식 문서 링크)

  • [MDN: <script type="importmap">](https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/script/type/importmap)
  • [MDN: JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules)
  • [MDN: import](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import)
  • [Next.js Docs](https://nextjs.org/docs)
  • [React Docs](https://react.dev/)
  • [Mermaid Docs](https://mermaid.js.org/)

관련 게시물