λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Back-end/Node.js

CommonJS 와 ES(6) λͺ¨λ“ˆ ν‚€μ›Œλ“œ ( require vs import ) 차이

by ciocio 2021. 11. 14.

πŸ“  κ³΅λΆ€ν•˜κ²Œ 된 계기

 

require 와 import 의 차이가 κΆκΈˆν•΄μ„œ νŒŒλ³΄λ‹€κ°€ ... CommonJS 와 ECMAScript κΉŒμ§€ μ‚΄νŽ΄λ³΄κ²Œ λ˜μ—ˆλ‹€.

ν•˜λ©΄μ„œ λŠλ‚€κ±°μ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬λž‘ν•˜λŠ” κ°œλ°œμžκ°€ λ§Žμ€ 것 κ°™λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ¬΄ν•œν•œ 잠재λ ₯에 λ†€λΌλ©΄μ„œλ„, κ·Έκ±Έ ν™•μž₯μ‹œν‚€λŠ” κ°œλ°œμžλ“€μ΄ μžˆκΈ°μ— λ‚΄κ°€ μ΄λ ‡κ²Œ νŽΈν•˜κ²Œ 

코딩을 ν•  수 μžˆλŠ” 게 μ•„λ‹Œκ°€ μ‹Άλ‹€ γ…Ž

 

 

πŸ“Œ  CommonJS

 

μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄μ˜ ν™œλ™ μ˜μ—­μ„ 더 λ„“νžˆκΈ° μœ„ν•΄ 쑰직된 그룹이닀.


λΈŒλΌμš°μ € 이외에도

 

βœ”  Server-side JS applications 

βœ”  CLI tools

βœ”  Desktop GUI-based applications

βœ”  Hybrid applications

 

λ“± λ‹€μ–‘ν•œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄κ°€ 쓰일 수 μžˆλ„λ‘ ν‘œμ€€ν™”λœ 라이브러리λ₯Ό μ œκ³΅ν•œλ‹€.

( Python, Ruby, Java 와 같이 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν’λΆ€ν•œ μ–Έμ–΄λ₯Ό λ³Έλ°›μ•„

λ‹€μ–‘ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ APIλ₯Ό λ§Œλ“€μ–΄ μ œκ³΅ν•˜λŠ” 것 κ°™λ‹€ )

 

πŸ“Ž  Server-side JS μ£Όμš” 쟁점

 

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λΈŒλΌμš°μ €μš© 언어일 λ•Œ κ°€μ‘Œλ˜ ν•œκ³„μ λ“€

 

πŸ”Ή  μ„œλ‘œ ν˜Έν™˜λ˜λŠ” ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ—†λ‹€.

πŸ”Ή  DBλ₯Ό μ—°κ²°ν•  수 μžˆλŠ” ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€κ°€ μ—†λ‹€.

πŸ”Ή  λ‹€λ₯Έ λͺ¨λ“ˆμ„ μ‚½μž…ν•˜λŠ” ν‘œμ€€μ μΈ 방법이 μ—†λ‹€.

πŸ”Ή  μ½”λ“œλ₯Ό packaging ν•˜κ³ , λ°°ν¬ν•˜κ³ , μ„€μΉ˜ν•˜λŠ” 방법이 ν•„μš”ν•˜λ‹€.

πŸ”Ή  dependency 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 곡톡 νŒ¨ν‚€μ§€ λͺ¨λ“ˆ μ €μž₯μ†Œκ°€ ν•„μš”ν•˜λ‹€.

 

-->  κ²°κ΅­ " λͺ¨λ“ˆν™” " κ°€ ν•„μš”ν•˜λ‹€.

-->  CommonJS 의 μ£Όμš” λͺ…μ„ΈλŠ” 이 λͺ¨λ“ˆλ“€μ„ μ–΄λ–»κ²Œ μ •μ˜ν•˜κ³ ,

       μ–΄λ–»κ²Œ μ‚¬μš©ν•  것인지에 λŒ€ν•œ 고민의 결과라고 ν•  수 μžˆλ‹€.

 

πŸ“Ž  λͺ¨λ“ˆν™”

 

πŸ”Έ  Scope  :  λͺ¨λ“  λͺ¨λ“ˆμ€ 각자의 독립적인 μ‹€ν–‰ μ˜μ—­μ΄ μžˆμ–΄μ•Ό ν•œλ‹€.

 

// fileA.js

var a = 5;
var b = 7;

// fileB.js

var a = 10;
var b = 1;

// μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄λŠ” νŒŒμΌλ§ˆλ‹€ 독립적인 μŠ€μ½”ν”„κ°€ 있기 λ•Œλ¬Έμ—, 
// 파일 ν•˜λ‚˜μ— λͺ¨λ“ˆ ν•˜λ‚˜λ₯Ό μž‘μ„±ν•˜λ©΄ λ‹€λ₯Έ νŒŒμΌμ— μžˆλŠ” λͺ¨λ“ˆκ³Ό 좩돌이 생기지 μ•ŠλŠ”λ‹€.
// 같은 μ΄λ¦„μ˜ μ „μ—­ λ³€μˆ˜λ₯Ό λ‹€λ₯Έ νŒŒμΌμ— 각각 μž‘μ„±ν–ˆμ„ λ•Œ 였λ₯˜κ°€ 생기지 μ•ŠμŒ !

 

πŸ”Έ  Definition  :  λͺ¨λ“ˆ μ •μ˜λŠ” exports 객체λ₯Ό μ΄μš©ν•œλ‹€.

 

// fileA.js

var a = 5;
var b = 7;

exports.sum = function(num1, num2){
  return a + b + num1 + num2;
};

// fileB.js

var a = 10;
var b = 1;

// fileA.js 처럼 exportλͺ¨λ“ˆ(μ „μ—­ 객체)을 μ‚¬μš©ν•˜κ²Œ 되면, ν•΄λ‹Ή λͺ¨λ“ˆμ΄ μ™ΈλΆ€λ‘œ κ³΅κ°œλœλ‹€.
// λ‹€λ₯Έ νŒŒμΌλ“€μ€ 곡개된 이 λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€ μ‚¬μš©ν•  수 있게 λœλ‹€.

 

πŸ”Έ  Usage  :  λͺ¨λ“ˆ μ‚¬μš©μ€ require ν•¨μˆ˜λ₯Ό μ΄μš©ν•œλ‹€.

 

// fileA.js

var a = 5;
var b = 7;

exports.sum = function(num1, num2){
  return a + b + num1 + num2;
};

// fileB.js

var a = 10;
var b = 1;

var moduleA = require("fileA");

moduleA.sum(a, b);  // 5+7+10+1 = 23

// require() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ exports둜 인해 곡개된 λͺ¨λ“ˆμ„ 뢈러올 수 μžˆλ‹€.
// ν•¨μˆ˜ sum은 μ„ μ–Έλœ ν™˜κ²½μ„ κΈ°μ–΅ν•˜κΈ° λ•Œλ¬Έμ— fileA의 a와 b 값을 κ°€μ Έμ˜¬ 수 μžˆλ‹€.

 

β€» μš”μ¦˜ var λ³€μˆ˜ μ„ μ–Έ ν‚€μ›Œλ“œλŠ” 잘 μ•ˆμ“°μ§€λ§Œ, μ „μ—­ λ³€μˆ˜μž„μ„ κ°•μ‘°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν–ˆλ‹€ !

 

이처럼 CommonJS λŠ” ν˜„μž¬ μ‹€μ§ˆμ μΈ ν‘œμ€€ 역할을 ν•˜κ³  μžˆλ‹€.
λŒ€ν‘œμ μœΌλ‘œ Node.js κ°€ 이 λͺ…μ„Έλ₯Ό λ”°λ₯΄κ³  μžˆλ‹€. ^___^

 

 

πŸ“Œ  ECMAScript

 

Ecma international 에 μ˜ν•΄ μ œμ •λœ ECMA-262 기술 κ·œκ²©μ— μ˜ν•΄ μ •μ˜λœ λ²”μš© 슀크립트 언어이닀.

ECMAScript specification ( ECMAScript 사양 ) 이라고도 λΆ€λ₯Έλ‹€.

슀크립트 μ–Έμ–΄κ°€ μ€€μˆ˜ν•΄μ•Όν•˜λŠ” κ·œμΉ™, μ„ΈλΆ€ 사항, 지침을 μ œκ³΅ν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 이 ECMAScript 사양을 μ€€μˆ˜ν•˜λŠ” λ²”μš© 슀크립트 언어이닀.


πŸ“Ž  μ‚¬μš© μ˜ˆμ‹œ

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 읽고 μ‹€ν–‰ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ μ’…λ₯˜μ—λŠ”

βœ” κ΅¬κΈ€μ˜ V8,

βœ” λͺ¨μ§ˆλΌ νŒŒμ΄μ–΄ν­μŠ€μ˜ SpiderMonkey,

βœ” λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈ μ—£μ§€μ˜ Chakra 등이 μžˆλ‹€.

 

πŸ“

각 엔진은 λͺ¨λ‘ μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄λ₯Ό 읽고 해석할 수 μžˆμ§€λ§Œ μˆ˜ν–‰ λŠ₯λ ₯ (Performance) 이 μ°¨μ΄λ‚œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄λ₯Ό μ²˜λ¦¬ν•˜λŠ” 둜직이 각자 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€ !!

 

πŸ“

λ˜ν•œ 각 엔진이 μ§€μ›ν•˜λŠ” ECMAScript 사양이 λ‹€λ₯΄λ‹€.

λˆ„κ°€, μ–Όλ§ˆλ‚˜ μ΅œμ‹  버전을 μ§€μ›ν•˜λŠ”μ§€, 폭 넓은 닀양성을 μΆ”κ΅¬ν•˜λŠ” 지에 따라 ν•΄μ„μ˜ 폭이 달라진닀.

κ·Έλž˜μ„œ " ECMAScript ν˜Έν™˜μ„± " μ΄λΌλŠ” 단어가 λ‚˜μ˜€λŠ” 것이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 λ‹΄λ‹Ήν•˜λŠ” νšŒμ‚¬μ˜ μ—…λ°μ΄νŠΈμ— 따라 μ“Έ 수 μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ λ¬Έλ²•μ˜ μ’…λ₯˜μ™€ 양이 달라진닀 γ…‹γ…‹ wow

" 이 λΈŒλΌμš°μ €λŠ” μ–΄λ–€ λ²„μ „μ˜ ECMAScript λ₯Ό μ§€μ›ν•˜λ‚˜μš” ? "
" ECMAScript 의 μ–΄λ–€ κΈ°λŠ₯을 μ§€μ›ν•˜λ‚˜μš” ? "

λ“±μ˜ μ§ˆλ¬Έμ„ ν•  수 μžˆλ‹€ !!

.

.

.

.

πŸ’₯ ECMAScript ν˜Έν™˜μ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜¨κ²Œ Babel ... πŸ’›πŸ’ͺ

 

 

πŸ“Œ  require 와 import 차이 ?

 

μ•„λ‹ˆ κ·Έλž˜μ„œ require λž‘ import 의 차이가 λ­λ‚˜κ΅¬ ..!

require 은   CommonJS 의 ν•¨μˆ˜
import λŠ” ES6 의 ν‚€μ›Œλ“œ

 

βœ”  require

 

const mysql = require("mysql");

 

CommonJS 의 ν•¨μˆ˜λ‘œ, μ›ν•˜λŠ” λͺ¨λ“ˆμ„ 뢈러올 수 μžˆλ‹€.

ES6 사양을 μ§€μ›ν•˜μ§€ μ•ŠλŠ” ν™˜κ²½μ΄κ±°λ‚˜, Babel κ³Ό 같은 인터프리터가 없을 땐 require 을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

 

βœ”  import

 

import mysql from "mysql"

 

ES6 의 ν‚€μ›Œλ“œλ‘œ, μ›ν•˜λŠ” λͺ¨λ“ˆμ„ 뢈러올 수 μžˆλ‹€.

 

 

πŸ“  μΆ”κ°€λ‘œ 곡뢀할 것

 

CommonJS 와 ES6 λŠ” 근본적으둜 λͺ¨λ“ˆμ„ 내보내고 λΆˆλŸ¬μ˜€λŠ” 방식이 λ‹€λ₯΄λ‹€.

ES6 은 CommonJS μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ” Named Parameter κΈ°λŠ₯도 μžˆμœΌλ‹ˆ, 두 λ°©μ‹μ˜ 차이점 μ΅ν˜€λ†“μ„ 것.

 

 

 

 

 

 

 

μ°Έμ‘°

 

https://www.daleseo.com/js-module-import/

https://d2.naver.com/helloworld/12864

https://wormwlrm.github.io/2018/10/03/What-is-the-difference-between-javascript-and-ecmascript.html

 

λ°˜μ‘ν˜•

'Back-end > Node.js' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Node.js npmκ³Ό package.json  (0) 2021.08.05
Node.js λŠ” 뭐야? 일단 μ„€μΉ˜ν•΄λ΄  (0) 2021.08.04

λŒ“κΈ€