๐Ÿ“œ JavaScript์˜ ๋ชจ๋“ˆํ™”์™€ npm์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

joonยท2025๋…„ 2์›” 3์ผ
2

1. JavaScript์˜ ๋ฐœ์ „๊ณผ ๋ชจ๋“ˆํ™”์˜ ํ•„์š”์„ฑ

์ดˆ๊ธฐ JavaScript๋Š” ์›น ํŽ˜์ด์ง€์— ๊ฐ„๋‹จํ•œ ๋™์  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์ฐจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต์žกํ•ด์ง€๊ณ  ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ณ ๋ คํ•œ ๋ชจ๋“ˆํ™”(Moduleization)๊ฐ€ ์ค‘์š”ํ•œ ์š”์†Œ๋กœ ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript๋Š” ํ•˜๋‚˜์˜ ์ „์—ญ ์Šค์ฝ”ํ”„(Global Scope)์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•  ๋•Œ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ถฉ๋Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


2. JavaScript ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๋ฐœ์ „ ๊ณผ์ •

๐Ÿ›๏ธ 1) IIFE (์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„์‹)

๋ชจ๋“ˆํ™”์˜ ์ดˆ๊ธฐ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(IIFE, Immediately Invoked Function Expression)์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์˜ค์—ผ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

(function() {
    var privateVariable = "์ด ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.";
    
    function privateFunction() {
        console.log("์ด ํ•จ์ˆ˜๋„ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }
})();

๐Ÿ“Œ ๋ฌธ์ œ์ 

  • ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต๊ณ , ๊ฐ ๋ชจ๋“ˆ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ปธ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

๐Ÿ›๏ธ 2) CommonJS (์„œ๋ฒ„ ์‚ฌ์ด๋“œ JavaScript)

Node.js๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋„ JavaScript๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ์ด์— ๋งž๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ธ CommonJS๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. CommonJS๋Š” require์™€ module.exports๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

// ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ
module.exports = {
    sayHello: function() {
        console.log("Hello, CommonJS!");
    }
};

// ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
const myModule = require('./myModule');
myModule.sayHello(); // Hello, CommonJS!

๐Ÿ“Œ ๋ฌธ์ œ์ 

  • CommonJS๋Š” ๋™๊ธฐ์ (Synchronous)์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ›๏ธ 3) AMD (Asynchronous Module Definition)

CommonJS์˜ ๋™๊ธฐ์  ๋กœ๋”ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” AMD(Asynchronous Module Definition) ๋ฐฉ์‹์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ RequireJS๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

define(['moduleA', 'moduleB'], function(moduleA, moduleB) {
    moduleA.doSomething();
    moduleB.doSomething();
});

๐Ÿ“Œ ๋ฌธ์ œ์ 

  • ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
  • CommonJS์™€ AMD๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ›๏ธ 4) ES6 ๋ชจ๋“ˆ (ECMAScript 2015)

2015๋…„, ES6(ECMAScript 2015)์—์„œ ๊ณต์‹์ ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. import์™€ export๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ์‹  JavaScript ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

// ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ
export function greet() {
    console.log("Hello, ES6 Modules!");
}

// ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
import { greet } from './myModule.js';
greet(); // Hello, ES6 Modules!

โœ… ์žฅ์ 

  • ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๋ชจ๋‘์—์„œ ๋™์ž‘ ๊ฐ€๋Šฅ
  • ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ํ•ด๊ฒฐ์ด ์šฉ์ด
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

3. npm(Node Package Manager)์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

์•ž์„œ ์‚ดํŽด๋ณธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๋ฐœ์ „๊ณผ ํ•จ๊ป˜, JavaScript ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด์—๋Š” ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ํด๋”์— ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="lightbox.js"></script>
<script src="fancybox.js"></script>

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„ ๋ฒ„์ „ ์ถฉ๋Œ: ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” jQuery 1.x๋ฅผ ์š”๊ตฌํ•˜๊ณ , ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” jQuery 3.x๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€: ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ผ์ผ์ด ์ˆ˜๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜์กด์„ฑ ๋ฌธ์ œ: ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฐพ์•„์„œ ์„ค์น˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 2010๋…„, npm(Node Package Manager)์ด ๋“ฑ์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.


4. npm์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์—ญํ• 

๐Ÿ“ฆ 1) ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ

npm์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install express

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด node_modules ํด๋”์— ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜๊ณ , package.json ํŒŒ์ผ์— ์ถ”๊ฐ€๋˜์–ด ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“œ 2) package.json์„ ํ†ตํ•œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ

package.json ํŒŒ์ผ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ชฉ๋ก๊ณผ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

{
  "name": "my-project",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.17.1",
    "lodash": "^4.17.21"
  }
}

ํŒ€์›๋“ค์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ํ•œ ์ค„๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install

๐Ÿš€ 3) npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์‹คํ–‰ ์ž๋™ํ™”

npm์€ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก scripts ์„น์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

"scripts": {
    "start": "node app.js",
    "test": "jest"
}

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ ๋ช…๋ น์–ด๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

npm start

5. npm ์ดํ›„์˜ ๋ฐœ์ „: Yarn๊ณผ pnpm

npm์˜ ๋“ฑ์žฅ ์ดํ›„, ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ๋“ค์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Yarn (2016๋…„, Facebook ๊ฐœ๋ฐœ)
    npm๋ณด๋‹ค ๋” ๋น ๋ฅธ ์†๋„์™€ ์ผ๊ด€๋œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ๋ชฉํ‘œ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • ๋ณ‘๋ ฌ ์„ค์น˜
    • ์˜คํ”„๋ผ์ธ ์บ์‹œ ๊ธฐ๋Šฅ
  • pnpm
    ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ๋น ๋ฅธ ์„ค์น˜ ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

    • ๋™์ผํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ค‘๋ณต ์ €์žฅํ•˜์ง€ ์•Š์Œ
    • ์˜์กด์„ฑ ํ•ด๊ฒฐ ์ตœ์ ํ™”

์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์€ ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŽฏ ๊ฒฐ๋ก : npm์ด ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ

๋ฌธ์ œ์ npm ๋“ฑ์žฅ ์ด์ „npm ๋“ฑ์žฅ ์ดํ›„
ํŒจํ‚ค์ง€ ์„ค์น˜์ง์ ‘ ๋‹ค์šด๋กœ๋“œnpm install ๋ช…๋ น์–ด๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์น˜
์˜์กด์„ฑ ๊ด€๋ฆฌ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌpackage.json์„ ํ†ตํ•ด ์ž๋™ ๊ด€๋ฆฌ
๋ฒ„์ „ ์ถฉ๋Œ๊ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค๋ฅธ ๋ฒ„์ „ ์‚ฌ์šฉ ๊ฐ€๋Šฅpackage-lock.json์„ ํ†ตํ•ด ๋™์ผํ•œ ๋ฒ„์ „ ์œ ์ง€
์‹คํ–‰ ์ž๋™ํ™”๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•ด์•ผ ํ•จnpm ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ„์†Œํ™”

npm์˜ ๋„์ž…์œผ๋กœ JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํš๊ธฐ์ ์œผ๋กœ ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” ํ”„๋ก ํŠธ์—”๋“œ(React, Vue)์™€ ๋ฐฑ์—”๋“œ(Node.js) ๊ฐœ๋ฐœ์—์„œ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€