반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • FastAPI (0)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Pre-rendering
  • 자바 디자인패턴
  • 자바
  • 프로그래머의 뇌
  • 이펙티브자바
  • 빈 검증
  • 싱글톤 패턴
  • item9
  • 메이븐 라이프사이클
  • try-with-resources
  • 자바스크립트 면접
  • 토비의 스프링
  • Javadoc 자바독 자바주석 주석 Comment
  • 이펙티브 자바
  • 싱글톤
  • 외래키 제약조건
  • item7
  • 러스트
  • 작업기억공간
  • next js app
  • Next.js
  • bean Validation
  • 팩터리 메서드 패턴
  • MSSQL
  • 자료구조
  • 자바스크립트 인터뷰
  • NEXT JS
  • 객체복사
  • 자바 검증
  • 추상 팩터리 패턴
  • 자바스크립트
  • prerendering
  • 싱글턴
  • 도커공식문서
  • item8
  • 알고리즘
  • rust
  • pnpm
  • 이펙티브 자바 item9
  • 메이븐 페이즈
  • serverless computing
  • 플라이웨이트패턴
  • 참조 해제
  • 슬로우 쿼리
  • 디자인패턴
  • 스프링 검증
  • 느린 쿼리
  • Java
  • 서버리스 컴퓨팅
  • 메이븐 골

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

자바스크립트/인터뷰

자바스크립트 모듈 (Module) 이란 무엇인가요?

2023. 2. 21. 14:53

모듈은 왜 필요한가요?

  • 애플리케이션이 고도화되면, 스크립트 소스코드의 양도 증가합니다.
    • 결국 많은 양의 소스코드를 효율적으로 관리하기 위해서 모듈이라는 개념이 필요해집니다.
  • 초기의 자바스크립트는 간단한 스크립트를 지향했기 때문에 모듈을 문법 차원에서 지원하지 않았습니다.
  • ES6 (ES2015) 이후부터 공식적으로 모듈 문법인 export, import 문법을 지원합니다.
    • 이전에는 AMD, CommonJS, UMD 와 같은 시도가 있었습니다만 이제는 사라지는 추세입니다.

자바스크립트의 모듈이란 무엇인가요?

  • 단지 하나의 .js 파일을 의미합니다.
  • .js 파일 내부에서는 export 와 import 문법을 이용해 함수, 변수 등을 교환하여 사용할 수 있습니다.
  • 가져올 js 파일이 모듈이라면 <script type="module"> 와 같이 script 태그에 type 이 module 임을 명시하면 됩니다.
// 📁 sayHi.js
export function sayHi(user) {
  console.log(`Hello, ${user}!`);
}
// 📁 main.js
import { sayHi } from "./sayHi.js";
sayHi("Jake"); // Hello, Jake!

모듈은 브라우저에서 어떻게 실행되나요?

  • 브라우저가 모듈을 가져오고 평가 후에 실행합니다.

모듈의 특징을 알고 있나요?

로컬에서는 동작하지 않고 HTTPS 로만 동작합니다.

  • 로컬에 있는 파일을 대상으로 import/export 를 적용하면, 동작하지 않습니다.
  • 모듈을 테스트하고 싶다면, 라이브 서버를 열어야 합니다.

언제나 strict mode 로만 작동합니다.

<script type="module">
  a = 5; // error
</script>
  • strict mode 로 작동하기 때문에 위의 코드는 에러를 던집니다.

각 모듈은 Module-level scope 를 가집니다.

// 📁 user.js
const user = "Jake";
// 📁 hello.js
console.log(user);
<!-- 📁 index.html -->
<!DOCTYPE html>
<script type="module" src="user.js"></script>
<script type="module" src="hello.js"></script>
  • Module-level scope 로 각 모듈의 스코프가 나누어져 hello.js 는 user.js 의 변수에 접근할 수 없습니다.

여러번 import를 수행해도 단 한번만 평가됩니다.

// alert.js
alert("HELLO!");
<!DOCTYPE html>
<script type="module">
  import "./alert.js";
  import "./alert.js";
  import "./alert.js";
  import "./alert.js";
</script>

여러번 import 를 해도 HELLO! 는 단 한번만 출력됩니다.

한번만 평가되기 때문에 불러온 모듈의 값을 변경하고 다시 불러와도 유지됩니다.

export const person = {
  name: "Jake",
};
<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>모듈 테스트</title>
  </head>
  <body>
    <script type="module">
      import { person } from "./person.js";
      console.log(person); // Jake
      person.name = "Jax";
      console.log(person); // Jax
    </script>

    <script type="module">
      import { person } from "./person.js";
      console.log(person); // Jax
      person.name = "Jax";
      console.log(person); // Jax
    </script>
  </body>
</html>
  • 한번 import 한 모듈의 오브젝트 프로퍼티 값을 바꾸면 다시 불러와도 유지됩니다.
  • import 를 두번해도 처음 불러온 person.js 를 재사용하기 때문입니다.
  • 이러한 기능은 많은 자바스크립트 파일에서 같은 모듈을 쓸 때 같은 모듈을 여러번 불러오지 않아도 되게 만들어줍니다.
  • 이 특징을 이용해 모듈 설정 (module configuration) 이 가능합니다.
    • 회원 정보를 가지고 있는 객체를 import 한 뒤에 이름을 설정해주면 해당 회원 정보를 import 하여 쓰는 모든 객체에 영향을 미칩니다.

import.meta

  • 현재 모듈에 대한 정보를 제공해줍니다.
  • import.meta.url 은 모듈의 위치를 가리킵니다.

모듈의 this 는 undefined 입니다.

  • 일반 브라우저에서의 this 는 전역 객체이며, Node 환경에서의 this 는 전역 객체인 것과 차이가 있습니다.
<script>
  console.log(this); // window 객체가 출력됨
</script>

<script type="module">
  console.log(this); // undefined 가 출력됨
</script>

브라우저에 특화된 모듈의 특징을 알고 있나요?

지연 실행

  • 모듈 스크립트는 항상 defer 속성을 붙인 것과 동일하게 실행됩니다.
    • defer 속성에 대한 자세한 내용은 이 포스팅에서 확인할 수 있습니다.
  • 모듈 스크립트도 defer 속성의 특징을 동일하게 가지고 있기 때문에 모듈 스크립트는 항상 완전한 HTML 페이지를 볼 수 있습니다.
    • DOM 요소에도 접근 가능합니다.
<script type="module">
  console.log("모듈 스크립트:" + typeof button); // undefined
  console.log("모듈 스크립트:" + document.getElementById("button")); // null
</script>

<script>
  console.log("일반 스크립트:" + typeof button); // object
  console.log("일반 스크립트:" + document.getElementById("button")); // [object HTMLButtonElement]
</script>

<button id="button">Button</button>

단, HTML 문서에서 button 엘리먼트를 사용하지 않는다면, typeof button 은 계속 undefined 를 출력합니다.
button 변수는 DOM 에서 button 엘리먼트에 접근할 때 생성되기 때문입니다.

인라인 스크립트에도 async 적용이 가능합니다.

  • 일반 script 태그에서는 src 속성이 없다면 async 적용이 불가능합니다.
  • type="module" 인 경우에는 src 속성이 없는 인라인 스크립트여도 async 적용이 가능해집니다.
  • 외부 스크립트나 DOM 에 의존하지 않는 스크립트를 작성할 때 유용합니다.
<script async type="module">
  import { counter } from "./analytics.js";
  counter.count();
</script>

이전에 언급했지만, src 속성값이 동일한 외부 스크립트는 한번만 평가됩니다.

<script type="module" src="a.js"></script>
<script type="module" src="a.js"></script>

외부 사이트에서 모듈 스크립트를 불러오려면 CORS 헤더가 필요합니다.

  • 외부 웹사이트에서 CORS 헤더를 제공받아야 합니다.
    • Access-Control-Allow-Origin: *
<script type="module" src="http://cross-site.com/source.js"></script>

경로가 없는 모듈은 금지됩니다.

  • Node.js 나 번들링 도구가 있다면, 경로가 없는 모듈도 가능합니다.
  • 그러나 기본 스펙을 사용할 때 경로가 없는 모듈은 금지됩니다.
import { sayHi } from "sayHi"; // Error!
import { sayHi } from "sayHi.js"; // OK!

호환성을 위한 nomodule 속성이 있습니다.

  • 모듈이 없는 경우에만 nomodule 속성의 스크립트가 동작합니다.
<script type="module">
  console.log("this browser supports module");
</script>

<script nomodule>
  console.log("this browser does not support module");
</script>

빌드 도구를 사용한다면, 모듈에 어떤 일이 벌어지나요?

  • <script type="module" src="entry.js"><script> 에서 src 에 들어갈 메인 진입점 모듈을 선택합니다.
  • 주요 모듈을 분석하여 모듈간의 의존관계를 파악합니다.
  • 모듈 전체를 한데 모아 큰 파일을 만듭니다. (설정에 따라 여러 개의 파일을 만드는 것도 가능합니다.)
    • 이 과정에서 import 문이 번들러 내의 함수로 변환되어 기존 기능은 그대로 유지됩니다.
  • 기타 변형 및 최적화를 진행합니다.
    • 사용되지 않는 코드 (구조적으로 도달 불가능한 코드) 는 삭제됩니다.
    • 쓰임새가 없는 모듈을 삭제합니다. (트리 쉐이킹 (tree-shaking))
    • console, debug 와 같은 개발 관련 코드는 삭제합니다.
    • 바벨에 설정된 타겟 버전이 있다면, 해당 버전으로 코드를 변환합니다.
    • 공백 제거, 변수 이름 줄이기 등으로 산출물의 크기를 줄입니다.
  • 번들을 거치면, 일반 스크립트를 취급하는 것과 동일하게 취급할 수 있습니다.
<!-- 웹팩과 같은 툴로 번들링 과정을 거친 스크립트인 bundle.js -->
<script src="bundle.js"></script>

레퍼런스

https://ko.javascript.info/modules-intro

반응형
저작자표시 비영리 (새창열림)

'자바스크립트 > 인터뷰' 카테고리의 다른 글

클로저 (Closure) 란 무엇인지 설명해주세요.  (0) 2023.02.08
호이스팅이란 무엇인가요?  (0) 2023.01.26
메모이제이션이란 무엇인가요?  (0) 2023.01.26
자바스크립트에서 URL 을 인코드하거나 디코드하는 방법에 대해서 알고 있나요?  (0) 2023.01.26
자바스크립트의 TDZ (Temporal Dead Zone) 에 대해서 간단히 설명해주실 수 있나요?  (0) 2023.01.18
    '자바스크립트/인터뷰' 카테고리의 다른 글
    • 클로저 (Closure) 란 무엇인지 설명해주세요.
    • 호이스팅이란 무엇인가요?
    • 메모이제이션이란 무엇인가요?
    • 자바스크립트에서 URL 을 인코드하거나 디코드하는 방법에 대해서 알고 있나요?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바