노드제이에스
노드제이에스(node.js)는 자바스크립트(JavaScript) 언어를 사용하여 서버 측 응용 프로그램을 개발할 수 있는 오픈소스 기반의 입출력(I/O) 프레임워크이다. 2009년 라이언 달(Ryan Dahl)이 개발했다. 기존의 자바스크립트는 프런트 엔드(front end) 개발에 주로 사용되었으나, 노드제이에스(node.js)의 출현으로 자바스크립트를 이용하여 서버 측의 백 엔드(back end)까지 개발할 수 있게 되었다.블록체인 기반의 암호화폐 중에서 리스크(Lisk)와 시그마체인(Sigma Chain)이 노드제이에스를 사용하여 개발되었다.
목차
개요[편집]
V8 (자바스크립트 엔진)으로 빌드 된 이벤트 기반 자바스크립트 런타임이다. 웹 서버와 같이 확장성 있는 네트워크 프로그램 제작을 위해 고안되었다. 파이썬으로 만든 트위스티드, 펄로 만든 펄 객체 환경, 루비로 만든 이벤트머신과 그 용도가 비슷하다. 대부분의 자바스크립트가 웹 브라우저에서 실행이 되는 것과는 달리, 서버 측에서 실행된다. 일부 CommonJS 명세[1]를 구현하고 있으며, 쌍방향 테스트를 위해 REPL 환경을 포함하고 있다.
역사[편집]
2009년 Ryan Dahl은 플리커의 파일 업로드 진행 표시줄을 보았을 때, 파일이 얼마나 업로드되었는지 알기 위해서는 서버에 쿼리를 전송해야 한다는 점을 보고 조금 더 쉬운 방법을 찾다가 고안해 내었으며, 그가 일하던 Joyent라는 회사에서 개발 및 운영을 담당하고 있다.최초 버전은 2009년 리눅스 기반으로 출시되었고, Inangural JSConf EU conference에서 Ryan Dahl의 발표 직후 국제적인 관심을 끌기 시작했다. 패키지 매니저인 npm은 2011년에 처음 소개되었다.2011년 6월 마이크로소프트는 Joyent와 파트너십을 맺고 같은 해 7월 윈도용 최초 버전을 출시했다.[1]
배경[편집]
릴리스 | 코드네임 | 출시일 | LTS 상태 | 활동적인 LTS 시작일 | 유지보수 시작일 | 유지보수 종료일 |
---|---|---|---|---|---|---|
v0.10 | 2013-03-11 | 수명 종료 | - | 2015-10-01 | 2016-10-31 | |
v0.12 | 2015-02-06 | 수명 종료 | - | 2016-04-01 | 2016-12-31 | |
v4 | Argon | 2015-09-08 | 수명 종료 | 2015-10-01 | 2017-04-01 | 2018-04-01 |
v5 | 2015-10-29 | LTS 없음 | N/A | 2016-06-30 | ||
v6 | Boron | 2016-04-26 | 활동 중 | 2016-10-18 | 2018-04-18 | 2019-04-18 |
v7 | 2016-10-25 | LTS 없음 | N/A | 2017-06-30 | ||
v8 | Carbon | 2017-05-30 | 활동 중 | 2017-10-31 | 2019-04-01 | 2019-12 예정 |
v9 | 2017-10-01 | LTS 없음 | N/A | 2018-06-30 | ||
v10 | Dubnium | 2018-04-24 | 활동 중 | 2018-10-30 | 2020-04 예정 | 2021-04 예정 |
특징[편집]
빠른 프로퍼티 접근(Fast Property Access)[편집]
모든 JavaScript Engine이 프로퍼티를 저장하기 위하여 사전식 데이터 구조(Dicitionary-like data structure)를 이용하는데 반하여, V8 은 hidden class를 이용한다. 이 둘의 차이는 단순하게 이야기해서 Hashing과 Pointer의 차이라고 할 수 있다.V8은 객체에 새로운 프로퍼티를 추가할 때 hidden class를 생성하고, hidden class에 프로퍼티의 정적인 위치(offset)를 저장함으로써 실제 데이터가 저 장되어 이는 위치에 대한 Pointer를 제공한다. 이로 인해 동적 룩업이 필요 없어지고, 고전적인 클래스 기반의 최적화를 할 수 있다. 매번 프로퍼티를 추가할 때마다 새로운 hidden class를 생성하는 방식은 상당히 비효율적이지만, 다음 번에 같은 객체를 생성할 때 이전에 생성했던 hidden class를 재사용함으로써 객체 생성 비용을 줄일 수 있다.
동적인 기계어 코드 생성(Dynamic Machine code Generation)[편집]
V8은 JavaScript 소스 코드를 처음 컴파일 할 시 bytecode가 아닌 기계어 코드로 직접 변환한다. 따라서 중간에 bytecode를 기계어로 변환해 줄 인터프리터가 따로 필요 하지않다. 기계어로 컴파일 할 때는 인라인 캐싱 코드(Inline caching code) 기법을 이용한다.
효율적인 가비지 콜렉션(Efficient Garbage Collection)[편집]
V8은 Garbage Collection Cycle을 수행할 때 프로그램 실행을 멈추는데, 이때 객체의 heap 부분만 처리함으로써 프로그램이 멈추는 영향을 최소화한다. 또한 객체와 포인터가 메모리상에서 어디에 위치해 있는지 정확히 관리하여 메모리 누수를 피한다.[2]
장단점[편집]
장점[편집]
- Single Thread,비동기 IO처리에 기반한 속도가 빠르다.
- 파일I/O나 네트워크 처리를 이벤트 드리븐 방식으로 처리하기 때문에 보다 빠른 처리가 가능하다.
- CPU의 대기시간을 최소화 할 수 있다.
- CPU부하가 적고, 많은 커넥션을 동시에 처리해야 되는 구조에 적합하다.
- 자바스크립트를 이용하여 개발 할 수 있기 때문에 프론트엔드 개발자의 진입장벽이 낮다.
- 기존 Java서버(JSP, Apache, Tomcat)에 비하여 생산성이 높다.
단점[편집]
- Single Thread 모델이기 때문에 하나의 작업에 시간이 오래걸릴시 시스템 전체의 성능이 급격히 떨어진다.
- 이벤트 콜백 중심으로 코드가 중첩될 시 가독성이 떨어진다.
- 에러 발생시 프로세스 자체가 다운됨으로 주의해야한다.
- 멀티코어 활용을 위해 cluster모듈을 이용해야 하고, 세션을 공유할 경우 부가적인 작업이 요구됨.
문제점[편집]
가장 큰 문제는 에러가 생겼을 때 웹 서버가 통째로 죽어버리기 쉽다는 것이다. 멀티프로세스 혹은 멀티스레드라면 하나가 오류가 터져도 그 프로세스나 스레드만 정리하면 되지만 Node.js는 싱글스레드이므로 연결 중 하나에서 오류가 터지면 웹 서버가 싹 죽어버리는 것. 물론 웹 서버가 죽었을 때 자동으로 다시 실행시켜주는 모듈이 있지만 어쨌든 어느 한 연결의 오류로 연결된 전체 사용자가 일시적으로 서비스를 못 받는 문제가 터지기 쉽다.또한 프로그래밍이 까다롭다. 멀티프로세스인 경우에는 각각의 프로세스는 자기 혼자 돌아가는 것처럼 생각하고 프로그래밍 되어도 웹 서버가 알아서 관리해 주지만 Node.js는 신경써야 할 게 많다. 멀티프로세스 하듯이 했다가는 한 연결이 CPU를 차지하고 앉아서 다른 연결이 먹통이 되는 일이 생기기 쉽다. 특히 비동기화 처리를 위한 콜백함수가 난무하다 보니, 함수의 매개변수로 함수를 넘기고, 또 그 함수의 매개변수로 함수를 넘기고, 하는 게 줄줄이 이어지다 보면 상당히 복잡해진다. 코드도 알아보기도 힘들고 디버그도 오리무중이 되기 쉽다. 이러한 문제를 해결하기 위해서는 콜백함수를 함수 매개변수 부분에서 익명으로 정의하지 않고 별개로 정의하는 방법, EventEmitter를 사용하는 방법, Promise를 사용하는 방법 같은 것들이 있다. 아니면 타입스크립트를 쓰는 방법도 생각해 볼 수 있다. 자바스크립트는 단순성 때문에 초기 진입 장벽이 낮은 편이라서 뛰어드는 사람들이 많지만 점점 고급 프로그램을 짜게 되면 그 단순성 때문에 돌아버리게 되는 일이 쉽상이다. 즉 좀 더 복잡한 언어들은 대체로 고급 기능을 구현할 때에는 좀 더 쉽게 구현할 수 있게 돕는 도구들이 많지만 자바스크립트 같은 경우에는 그 단순한 것들을 잔뜩 이어 붙여서 고급 기능을 구현할 때가 많으므로 콜백 지옥과 같은 아득한 경지를 경험할 때가 종종 일어난다.Node.js가 자랑하는 빠른 성능은 Node.js가 처리속도가 뛰어나서라기보다는 싱글스레드 기반의 비동기 처리 방식 때문이라, 이 점을 제대로 이해 못하고 프로그래밍하면 오히려 기존 웹 서버보다도 느릴 수 있다. 보통 데이터베이스나 디스크 입출력을 많이 하는 반면 웹 서버에서 연산을 많이 하지 않는 웹 페이지라면 Node.js가 확실히 빠르지만 그 반대의 경우라면 Node.js가 별 힘을 쓰지못한다. 자바스크립트의 속도가 많이 빨라진 건 사실이지만 연산을 많이 해야 하는 작업에서는 그닥 효율이 좋지는 않다.[3]
활용[편집]
Node.js는 기존의 강자들보다는 역사가 짧지만 정말 무서운 속도로 성장하고 있다. 사실 Node.js 자체는 뭔가 작고 소박해 보이는데, 여기에 어마어마한 모듈 군단이 가세하면서 확장성이 왕창 넓어졌다. npm 패키지 관리자는 Node.js에 어마어마한 날개를 달아주게 되는데, 중앙집중식 패키지 저장소에서 원하는 모듈을 손쉽게 검색하고 설치할 수 있기 때문에 Node.js의 활용 폭을 어마어마하게 넓혀 주었다. 다른 프로그래밍 언어도 없는 건 아니지만 패키지의 수나 성장속도가 정말 어마어마하게 빨라서 '혹시 이런 모듈 없나?' 하고 검색하면 우루루 쏟아져 나올 정도다. 또한 npm 설정 파일을 잘 만들어 두면 내 컴퓨터에서 개발했다가 웹 서버로 옮긴다든가 할 때, 설정 파일을 가져가서 npm을 돌려주면 내 웹 애플리케이션에서 사용했던 모듈을 몽땅 가져오므로 의존성 관리도 편리하게 할 수 있다.최근 들어서는 엔터프라이즈급 서비스들이 Node.js로 이전하는 사례들이 나타나면서 더욱 주목 받고 있다. 대표적인 예가 페이팔. 유명한 PHP 기반 블로그 플랫폼인 워드프레스를 호스팅 서비스하는 WordPress.com도 2015년 칼립소 프로젝트를 공개했다. 이를 통해 PHP 및 MySQL을 들어내버리고 Node.js 기반으로 옮겨갔다.[4]
- 입출력이 잦은 어플리케이션
- 데이터 스트리밍 어플리케이션
- 데이터를 실시간으로 다루는 어플리케이션
- JSON API 기반 어플리케이션
- 싱글페이지 어플리케이션
각주[편집]
- ↑ 1.0 1.1 1.2 〈구글 웹서버〉, 《위키백과》
- ↑ seungwoohong, 〈NodeJS의 소개와 특징〉, 《티스토리》, 2017-11-12
- ↑ 〈내위키 웹서버〉, 《내위키》
- ↑ 〈Node.js 활용〉, 《Worldpress 공식홈페이지》
참고자료[편집]
- 〈구글 웹서버〉, 《위키백과》
- seungwoohong, 〈NodeJS의 소개와 특징〉, 《티스토리》, 2017-11-12
- 〈내위키 웹서버〉, 《내위키》
- 〈더 리큐어 서버〉, 《더 리큐어》
- 〈Node js 활용〉, 《WordPress 공식홈페이지》
같이 보기[편집]