● 모듈
- 모듈(Module)은 프로그래밍에서 코드를 여러 개의 독립적인 단위로 분리하여 작성하고 관리하는 방법 중 하나이다. 모듈은 일반적으로 관련된 코드들을 그룹화하고, 다른 코드와 분리하여 개발과 유지보수를 쉽게 할 수 있도록 한다.
- 또한 모듈이란 여러 기능들에 관한 코드가 모여있는 하나의 파일로 다음과 같은 것들을 위해 사용한다.
- 그럼 기능1 / 기능2 / 기능3 이 적힌 JS파일 3개가 있어. 이거 3개 합쳐서 압축하면 모듈이라고 부르는거야?
- 아니요. 일반적으로 JavaScript 파일이 단순히 압축되었다고 해서 모듈로 처리되지는 않습니다. JavaScript 모듈은 일반적으로 특정 구문과 규칙을 따르는 파일입니다. ES6(ECMAScript 2015)부터는 import와 export 키워드를 사용하여 모듈을 정의하고 내보내는 방법이 정해져 있습니다.
- 따라서, 기능1, 기능2, 기능3과 같은 파일을 모듈로 사용하려면 해당 파일에서 export 키워드를 사용하여 해당 기능을 내보내고, 다른 파일에서 import 키워드를 사용하여 해당 기능을 가져와야 합니다. 모듈 로더(loader) 라이브러리를 사용하여 JavaScript 파일을 모듈로 로딩하고 처리할 수도 있습니다.
- OK. 그럼 예를들어 npm 에서 range 모듈처럼 어떤 식을 쉽게 계산해주는 것들도 특정 구문과 규칙을 따르니, 모듈이구나. 모듈들이 모이면 엄청나게 멋진 것들을 구현해낼 수 있겠네. 모듈들이 모이면 프로젝트, 라이브러리가될 수 있다고 알고있어. 그리고 이것들이 패키지라고 부를 수 있다고 하던데. 그럼 모듈들이 모인게 패키지야?
- 패키지와 모듈은 비슷한 개념이지만, 약간의 차이가 있습니다. 반면, 패키지(Package)는 모듈들의 집합이며, 이를 라이브러리, 프레임워크 등으로 사용할 수 있습니다. 패키지는 보통 여러 개의 모듈로 이루어져 있으며, 모듈들 간의 의존성 관리를 위해 패키지 매니저를 사용하여 관리됩니다. Node.js에서는 npm을 사용하여 패키지를 설치하고 관리합니다.
- 따라서, 패키지는 모듈보다 더 큰 개념입니다. 패키지는 여러 개의 모듈을 묶어서 관리하는 것이고, 모듈은 각각 하나의 파일에 구현된 기능을 의미합니다.
- 모듈(Module)은 일반적으로 하나의 파일에 구현된 기능을 가지고 있는 것을 의미합니다. 다른 모듈에서도 이 기능을 사용할 수 있도록 외부로 노출(export)되어야 합니다. Node.js에서는 module.exports 또는 exports를 사용하여 모듈을 외부로 노출시킬 수 있습니다.
- 그러면, export import 방식이 왜 다 다른거야? CommonJS AMD UMD 도대체 이런것들이 다 뭐야?
- JavaScript에서 모듈을 정의하고 가져오는 방법에는 CommonJS, AMD(Asynchronous Module Definition), UMD(Universal Module Definition) 등이 있습니다. 이 방식들은 각각의 목적과 환경에 따라 다른 방식으로 모듈을 정의하고 가져오기 때문에, 서로 다른 문법과 규칙을 가지고 있습니다.
- CommonJS: Node.js에서 사용하는 모듈 정의 방식으로, require() 함수를 사용하여 모듈을 가져오고, module.exports 또는 exports 객체를 사용하여 모듈을 내보냅니다. 이 방식은 서버 측 JavaScript 개발을 위해 개발되었으며, 동기적인 로딩 방식을 사용합니다.
- AMD: 브라우저에서 사용하는 비동기적인 모듈 정의 방식으로, define() 함수를 사용하여 모듈을 정의하고, require() 함수를 사용하여 모듈을 가져옵니다. 이 방식은 대규모 웹 애플리케이션 개발을 위해 개발되었으며, 비동기적인 로딩 방식을 사용합니다.
- UMD: CommonJS와 AMD 모듈 정의 방식을 모두 지원하는 유니버설 모듈 정의 방식으로, 모듈이 어떤 환경에서도 동작할 수 있도록 만들어졌습니다.
- 이러한 모듈 정의 방식들은 JavaScript에서 모듈을 사용하는 방법을 표준화하기 위해 ES6부터는 import와 export 키워드를 도입하여 표준화되었습니다. import와 export는 모듈을 정의하고 가져오는 데 있어서 간결하고 직관적인 방법을 제공하며, 브라우저와 Node.js 모두에서 사용할 수 있는 표준 방식입니다.
- 아하. 서버쪽에서 모듈을 다루는 방식들과 브라우저에서 모듈을 다루는 방식들이 달라서 정의가 안되고 있었구나. 그래서 ES6가 표준화시켰고.. 그럼 서로 가져다가 쓰니까 한 모듈이 없으면 프로그램이 아예 돌아가질 않거나 그럴 수 있겠구나. 그래서 의존성 이야기가 나오게 된것이고.. 그래서 그 의존성을 관리해주는 얘가 npm이고.. 그럼 npm은 모듈간의 의존성을 어떻게 해결해?
- 예를 들어, 만약 A 모듈이 B 모듈을 사용하고 있고, B 모듈이 C 모듈을 사용하고 있다면, A 모듈은 B와 C 모듈의 의존성이 있다는 것을 알고 있어야 합니다. 이를 위해 npm은 package.json 파일을 사용합니다.
- package.json 파일은 패키지 정보와 의존성 정보를 담고 있는 파일로, npm에서 패키지를 설치할 때 이 파일을 참고하여 의존성을 해결합니다. package.json 파일에는 패키지 이름, 버전, 설명 등 패키지에 대한 정보뿐만 아니라, 패키지가 사용하는 모듈에 대한 정보도 포함됩니다. npm은 이 정보를 바탕으로 패키지를 설치할 때 필요한 모든 모듈을 자동으로 설치합니다.
- 또한, npm은 패키지의 버전 관리를 지원하므로, 각 패키지가 의존하는 모듈의 버전 충돌 등을 방지할 수 있습니다. 따라서 npm을 통해 모듈을 관리하면 모듈 간의 의존성을 쉽게 관리하고 버전 충돌을 방지할 수 있습니다.