얄코님의 '얄코의 Node.js (Korean ver.)' 강의를 듣고 정리한 내용입니다.
얄코의 Node.js (Korean ver.) 강의 | 얄팍한 코딩사전 - 인프런
얄팍한 코딩사전 | , 🇰🇷 This course is designed for Korean-speaking learners. If you speak English, Japanese, Vietnamese, or any other language, please take t
www.inflearn.com
1. Node.js란
Node.js → 자바스크립트란 언어를 알아듣는 프로그램
Ryan Dahl이 V8 엔진을 임베딩하고 libuv 등의 추가 부품을 제작하여 Node.js 완성
한 번에 하나의 작업만 처리하는 싱글 스레드로 동작하지만, 시간이 오래 걸리는 파일 읽기, 네트워크 요청, 타이머 등은 백그라운드에서 처리하고, 그 결과가 준비되면 이벤트와 콜백 함수로 알려준다.
Node.js는 싱글 스레드 + 이벤트 루프 구조로, 여러 작업을 동시에 효율적으로 처리
파일 읽기, 네트워크 요청 등은 논블로킹 비동기 방식으로 처리되어, 한 작업이 끝날 때까지 다른 작업이 지연되지 않음
개발자는 콜백 함수만 작성하면 되고, 멀티스레딩이나 동기 처리는 Node.js가 알아서 처리
2. REPL(Read-Eval-Print Loop)
코드 파일을 따로 작성하지 않아도 터미널 등에 특정 언어의 코드를 입력하면 바로 결과가 나오는 환경
‘node’ 명령어를 입력하여 REPL 세션을 열어줄 수 있다.
5+5를 입력하면 10이 반환 → 5+5를 10으로 대체할 수 있다는 뜻
표현식: 특정 값을 반환하는 코드 조각
Node.js의 REPL에 표현식을 입력하면 결과로 그 반환값이 아래와 같이 출력됨
console.log(1);을 입력하면 1과 undefined가 반환됨
→ 콘솔의 로그 메소드는 뭔가를 반환하는 용도의 함수가 아니기 때문에, 반환값으로 undefined를 가짐
Node.js의 REPL에서 언더스코어(_)는 마지막 평가 결과를 참조하는데 사용된다
for문과 함수도 입력 가능하다.
또한 모듈도 불러올 수 있다.
명령어 ‘.help’ → 명령어들의 목록과 각각에 대한 설명을 확인할 수 있다.
명령어 ‘.editor’ → 텍스트 편집기와 같은 모드 실행
명령어 ‘.exit’ → REPL 종료
명령어 ‘.save’ → 저장
명령어 ‘.load’ → 해당 파일에 작성된 모든 코드가 입력되어 실행된 다음, 실행된 결과들이 출력되어 나타남
명령어 ‘.break’, ‘.clear’ → 코드 작성 중 취소 가능
3. Promise, async/await
콜백 함수로 짜던 코드를 쉽게 작성하고 읽을 수 있게 해주는 syntactic sugar
콜백 함수를 사용할 때:
어떤 함수가 일을 마치고 실행할 일을 그 안에 인자로 넣고, 또 그 함수가 일을 끝내면 할 일을 인자로 넣고를 반복
Promise를 사용할 때:
resolve: 시간을 소모하는 일이 성공적으로 마치고 나면 수행할 일
‘then’ 메서드: 각서 작성자가 하는 일이 성공 또는 실패시 할 일을 인자로 받음
async/await를 사용할 때:
‘async’라는 키워드가 붙은 함수, 또는 Node.js의 ESM 최상위 스코프에서만 사용 가능
‘await’은 뒤에 오는 프로미스 작업이 완료될 때까지 코드의 진행을 멈춘 다음 그 결과를 반환
→ 비동기 작업이 이뤄질 동안 다음 코드가 실행되는 것을 멈추는 역할
4. Module
프로그래밍 코드를 한 곳에 작성하지 않고 기능과 목적별로 나누어 작성한 것
→ 코드를 여러 곳에서 재사용할 수 있고 코드의 이해, 수정, 관리도 수월해진다.
처음에는 CommonJS가 기본 모듈 시스템으로 사용, 이후에 ECMAScript에서 ES Module을 공식적으로 표준화
CommonJS
기본으로 제공되는 module 객체를 사용해서 모듈을 외부로 내보냄 (module.exports 사용)
const PI = 3.14;
function add(a,b) {
return a + b;
}
module.exports = add;
‘require’ 함수를 사용해서 외부의 모듈을 불러옴
const add = require('./math.js');
console.log(add(1,2));
내보내는 값의 이름과 불러오는 값의 이름이 일치할 필요는 없음 (해당 문서 내에서 일관적으로 사용하면 됨)
여러 값들을 하나의 객체로 감싸서 내보내도 됨
const PI = 3.14;
function add(a,b) {
(...)
}
class MathOps {
(...)
}
module.exports = { add, MathOps, PI };
사용할 때는 다음과 같이
const math = require('./math');
const x = math.add(math.PI, 1);
const y = new math.MathOps().mul(x, 2);
(...)
불러오는 쪽에서도 구조 분해 할당을 사용해도 됨
ex) const { add, PI, MathOps } = require(’./math’);
다른 모듈에서도 같은 이름으로 내보낸다면? 콜론과 함께 작성하자
const { add: addMath } = require('./math');
const { add: addVector } = require('./vector');
(...)
exports라는 객체에 원하는 이름으로 항목을 추가해서 내보낼 수 있다.
// module.exports = {
// add: (a, b) => a + b,
// (...)
// }
// 를 아래와 같이 바꿀 수 있다.
exports.add = (a, b) => a + b;
exports.subt = (a, b) => a - b;
(...)
module.exports의 exports와 exports.add의 exports는 같은 메모리상 주소를 가리킨다.
주의: 이 두 방식을 같이 사용하면 안된다.(새로운 값을 할당하는 순간 그것이 가리키는 메모리상 주소가 달라지기 때문)
CommonJS는 한 번 불러온 모듈을 캐싱한다는 사실을 기억하자
ES Module
ES Module을 사용하고 싶다면, 둘 중 하나를 설정하자
- package.json에 “type”: “module” 입력
- 모듈로 사용할 문서의 확장자를 js가 아닌 mjs로 지정
ES Module에서, 한 문서에서 여러 값을 내보낼 때 선언 및 할당되는 곳 앞에 export를 붙인다.
그리고 import와 from을 사용하여 가져온다.
(별표를 사용해서 하나의 객체로 묶어서 가져올 수 있다. → import * as math from ‘./math.js’
해당 모듈을 대표하는 값을 내보낼때는 앞에 export를 붙인다. 그리고 import 할 때는 원하는 이름으로 가져다 사용할 수 있다.
모듈의 대표 값(export default)은 중괄호 밖에, 다른 값들(export만)은 중괄호 안에 넣으면 된다.
다른 모듈에서 같은 이름의 값들이 내보내어질 때에는?
방법1. 별표를 사용해서 각 모듈을 객체로 묶어 import
import * as math from './math.js';
import * as vector from './vector.js';
console.log(math.add(1,2));
console.log(vector.add(3,4));
방법2. 각각을 다른 이름으로 불러오기(as 활용)
import { add as addMath } from './math.js';
import { add as addVector } from './vector.js';
ES Module도 한 번 불러온 모듈을 캐싱한다는 사실을 기억하자
→ 캐싱되지 않게 하려면 경로에 서로 다른 쿼리 스트링을 붙여주면 됨
import { getCount } from "./counter.js?^v=1";
// 다른 파일
import { getCount } from "./counter.js?^v=2";
ES Module에서는 각 모듈이 필요한 시점에 비동기적으로 임포트함으로써 프로그램의 초기 로딩 시간을 단축하고 효율을 높일 수 있다.
import("./math.js").then((math => {
(...)
}
// or
const vector = await import("./vector.js");
ES Module은 모듈을 내부적으로 비동기 방식으로 로드한다.
→ 최상위 스코프에서 await 바로 사용 가능
5. Nodemon
Node.js 환경에서의 개발을 효율적으로 만들어주는 도구
npm i -g nodemon으로 설치 가능
→ 맥에서는 사용자 권한 에러가 남
시스템 디렉토리가 아닌 홈 디렉토리에 전역 패키지가 설치되도록 하자 (홈 디렉토리는 사용자 권한으로 다룰 수 있음)
mkdir -p ~/.npm-global (홈 디렉토리에 npm global이라는 폴더 생성)
npm config set prefix ~/.npm-global (npm이 해당 디렉토리를 전역 설치 경로로 사용하도록 설정)
echo ‘export PATH=$HOME/.npm-global/bin:$PATH’ >> ~/.zshrc source ~/.zshrc (전역 패키지 실행 파일의 위치를 컴퓨터의 PATH 목록에 추가)
node 대신 nodemon 명령어를 사용해서 실행
→ nodemon이 실행 중인 상태에서 해당 문서의 코드를 수정한 다음 저장하면 코드가 재실행되어 바뀐 결과가 출력
nodemon 명령어를 같이 실행할 파일명을 붙이지 않고 실행하면 해당 프로젝트 폴더의 index.js 파일을 실행 (바꾸고 싶으면 package.json의 “main”을 수정하자)
루트에 nodemon.json을 만들면 설정을 추가할 수 있다.
exec: 실행할 명령어 설정
watch: 감시할 디렉토리 또는 파일의 이름들을 문자열의 배열로 작성(이 곳의 코드가 수정되면 nodemon이 코드를 재실행)
ext: 어떤 확장자를 가질 파일을 감시할지 설정
ignore: 감시 대상에서 제외될 대상 설정
'Study > Node.js' 카테고리의 다른 글
| [Node.js 강의 정리] Call stack, Event Loop, EventEmitter, child_process, cluster, worker_threads 등에 관하여 (1) | 2025.06.19 |
|---|---|
| [Node.js 강의 정리] 파일 시스템, TCP/UDP, HTTP, 버퍼와 스트림, 각종 모듈에 관하여 (0) | 2025.06.19 |