티스토리 뷰
NodeJS는 크롬의 V8 엔진을 기반으로 만들어진 자바스크립트 런타임이다. NodeJS의 특징을 간단히 정리해둔다.
비동기 작업에 특화
NodeJS는 싱글 스레드 기반으로 동작한다. 그럼에도 불구하고 NodeJS가 좋은 이유는 비동기 작업에 특화되어 있기 때문이다. 비동기 작업에 특화돼있다는 것은 네트워크나 데이터베이스 요청, IO 작업 등을 처리하기 좋다는 말이다.
자바스크립트의 비동기 코드만 이해하고 있다면 비동기 작업을 노드에서 쉽게 처리할 수 있다. 다만 계산 집약적인 작업을 처리하기엔 노드가 싱글 스레드 기반으로 동작하기 때문에 좋지 않다고 한다.
이벤트 루프
노드에서 함수를 호출하면 다른 언어나 환경과 마찬가지로 Call Stack에 함수가 쌓인 뒤 호출된다. 다만 비동기 작업을 호출했을 경우엔 Call Stack 대신 Task Queue에 쌓여 처리된다. 자바스크립트 엔진으로 처리되는 것이 아닌 Native Code로 처리되는 것들이 Task Queue에 쌓인다고 생각하면 된다.
기억해야할 특징 중 하나는 Call Stack이 비어있어야 Task Queue의 작업을 꺼내와 처리할 수 있다는 것이다. setTimeout 함수를 이용해 예를 들어 살펴보자.
setTimeout(() => console.log('task queue'), 0)
console.log('call stack')
위 코드는 'task queue' 라는 메시지를 setTimeout 함수를 이용해 즉시 로그로 띄우도록 하고있다. 테스트해보면 알겠지만, 위 'task queue' 메시지는 항상 'call stack' 메시지 뒤에 나오게 된다.
왜냐하면 call stack이 task queue 보다 우선되기 때문이다. call stack이 비어야 task queue에 등록된 함수를 호출한다는 것만 기억하자.
모듈
노드는 코드의 집합을 모듈이라는 단위로 관리한다. 모듈은 특정한 기능을 담당하는 변수와 함수의 집합이다. 모듈을 잘 이용하면 프로젝트를 쉽게 구조화할 수 있다.
// testModule.js
const num = 100
const getNumStr = () => `num: ${num}`
module.exports = {
num,
getNumStr,
}
// executor.js
const { getNumStr } = require('./testModule')
console.log(getNumStr);
위 코드처럼 모듈을 내보낼 때는 module.exports를 사용하고, 모듈을 사용할 때는 require 함수를 이용한다.
내장 모듈
밑에서 알아보겠지만 외부의 모듈을 가져와 사용하기 위해선 npm으로 모듈을 설치한 뒤 이용해야 한다. 그러나 노드에 기본으로 내장된 모듈은 이런 설치가 필요없이 바로 사용할 수 있는데, 대표적인 예로 아래와 같은 모듈들이 있다.
- fs: 파일 시스템에 접근할 수 있도록 도와주는 모듈이다. 파일을 읽고 쓸 수 있다.
- path: 운영체제에 상관없이 경로를 쉽게 조작하도록 도와주는 모듈이다.
- os: 운영체제의 환경을 가져올 수 있도록 도와주는 모듈이다.
더 많은 내용은 아래 참고의 NodeJS API 링크를 참고하자.
패키지 매니저
NodeJS의 패키지 매니저는 Node Package Manager(npm)이다. NodeJS를 설치하면 npm은 기본적으로 설치돼있다. NodeJS로 프로그램을 만들 때 사용하는 대부분의 모듈은 npm을 이용해 설치해 사용한다.
npm은 종속성 관리를 package.json이라는 파일로 하는데, 이 파일에 패키지의 정보와 어떤 모듈이 어떤 버전으로 설치돼야 하는지 등이 저장된다.
빈 폴더에 아래와 같은 명령어를 입력하고 프로젝트의 정보를 입력하면 package.json이 생성된다.
$ npm init
이제 외부 패키지를 가져와 설치해보자. chalk라는 터미널 글씨를 이쁘게 하이라이팅 해주는 패키지를 설치해보자.
$ npm install chalk
위 명령어를 터미널에서 입력하고 기다리면 설치가 완료된다. 패키지를 설치하면 node_modules라는 폴더가 자동으로 생성되는 것을 볼 수 있다. 이 폴더에 설치한 패키지가 저장된다.
이제 설치한 패키지를 가져와 사용하면 된다. 아래와 같이 코드를 작성해 돌려보자.
// test.js
const chalk = require('chalk')
console.log(chalk.blue('TEST1'))
console.log(chalk.red.inverse('TEST2'))
console.log(chalk.yellow.underline('TEST3'))
위 코드를 실행하면 아래 그림 2와 같이 터미널에 이쁘게 글씨가 하이라이트된다.
npm이 지원하는 패키지를 찾아보고 싶다면 아래 참고 링크를 확인하자.
참고
NodeJS 내장 API
npm 패키지 찾아보기
- Total
- Today
- Yesterday
- @Qualifier
- Closure
- Express
- chunk
- spring batch
- Barycentric coordinates
- nodejs
- Bean
- mybatis
- spring
- Linux
- unity
- thymeleaf 변수 인식
- @Bean
- MySQL
- @Autowired
- JavaScript
- Bin
- 클로저
- @Component
- Check point within polygon
- npm
- Tasklet
- thymeleaf cannot resolve
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |