3. 노드 기능 알아보기
REPL
브라우저의 콘솔 탭에서 자바스크립트 코드를 입력하고 실행하듯이
노드에서 컴파일 없이 즉석으로 코드를 실행해주는 콘솔이다.
터미널창에 node
라고 입력하면 실행된다.
모듈
특정한 기능을 하는 함수나 변수들의 집합
WARNING
모듈은 file://
프로토콜과 같이 로컬에서 직접 파일을 여는 경우에는 동작하지 않는다.
HTTP 또는 HTTPS 프로토콜을 통해서만 동작한다.
(즉, 로컬 서버라도 있어야 동작한다.)
엄격 모드로 실행됨
모듈은 항상 엄격 모드(use strict)
로 실행된다.
선언되지 않은 변수에 값을 할당하는 등의 코드는 에러를 발생시킨다.
모듈 레벨 스코프
모듈은 자신만의 스코프가 있다.
따라서 모듈 내부에서 정의한 변수나 함수는 다른 스크립트에서 접근할 수 없다.
단 한번만 평가됨
동일한 모듈이 여러 곳에서 사용되더라도 모듈은 최초 호출 시 단 한번만 실행된다.
실행 후의 결과를 모듈을 사용하는 모든 곳에 내보낸다.
// admin.js
export let admin = {
name: "John"
};
// 1.js
import { admin } from './admin.js';
admin.name = "Pete";
// 2.js
import { admin } from './admin.js';
console.log(admin.name); // Pete 출력됨
this는 undefined
모듈은 자신만의 스코프를 가지므로 최상위 레벨의 this
는 undefined
가 된다.
EventEmitter
객체의 이벤트에 리스너를 직접 관리할 수 있다.
주로 이벤트에 내가 원하는 콜백을 리스너로 달아주기 위해 사용한다.
사용 방법은 아래와 같다.
const EventEmitter = require('events');
const myEvent = new EventEmitter();
myEvent.addListener('이벤트명', 콜백함수);
// ...
메서드명 | 기능 |
---|---|
on(이벤트명, 콜백) addListener(이벤트명, 콜백) | 이벤트에 콜백을 연결한다. |
emit(이벤트명) | 이벤트를 호출한다. |
once(이벤트명, 콜백) | 이벤트가 몇번 호출되든 첫 호출에 딱 한번만 실행되는 리스너다. |
removeAllListeners(이벤트명) | 해당 이벤트에 연결된 모든 리스너를 제거한다. |
removeListener(이벤트명, 리스너) off(이벤트명, 콜백) | 해당 이벤트에 연결된 특정 리스너를 제거한다. |
listenerCount(이벤트명) | 현재 리스너가 몇 개 연결되어 있는지 출력해준다. |
예외 처리하기
노드는 예외처리가 중요하다. 예외가 발생하면 실행중인 노드 프로세스를 중단시킨다.
서버의 경우에는 예외가 발생하면 서버가 중단되는것이다.
예외를 처리하는 방법은 예외 발생 코드를 try/catch
로 감싸주는 것이다.
노드 자체에서 해결해주는 에러
해당 에러들은 우리가 따로 핸들링하지 않아도 알아서 처리되므로 노드가 중단되지 않는다.
- 노드 내장 모듈의 에러
- Promise의 에러
다만 프로미스의 에러는 노드 버전이 올라감에 따라 바뀔 수 있기 떄문에 catch를 붙여주는 것을 권장한다.
예측 불가능한 에러를 처리하는 방법
- uncaughtException
처리하지 못한 에러가 발생했을 때 uncaughtException 이벤트리스너를 사용하면 콜백함수를 실행시켜주고 프로세스가 유지된다.
process.on('uncaughtException', (err) => {
console.error('예기치 못한 에러', err);
})
노드 공식 문서에 따르면 해당 이벤트는 최후의 수단으로 사용할 것을 명시하고 있다.
uncaughtException
이벤트는 이벤트 발생 후에 다음 동작이 제대로 동작하는지 보증하지 않는다고 한다.
따라서 에러 기록 용도로 사용하는 것이 좋다.