웹 개발자라면, 사이트 성능에 관심을 둘 수 밖에 없습니다.
그런데, 많은 사용자들이 몰리는 사이트라면, Lock이 걸리거나 메모리 부족 등의 이유로
사이트가 뻗는 일이 종종 생깁니다.
그런데, 이런 문제를 덜어줄 수 있는 방법이 node.js입니다.
node.js가 자바스크립트로 실행된다는데, 무슨 말이죠? 웹브라우저에서 실행되나요?
node.js는 자바스크립트 엔진을 채택했을 뿐, 일반적인 자바스크립트와는 다릅니다.
하지만, 자바스크립트를 알고 있다면, 동일한 문법으로 node.js를 사용할 수 있죠.
node.js는 주로 네트워크 애플리케이션을 위해 사용되는 서버 사이드 처리를 위해 활용됩니다.
보통, 아파치, 톰캣, 레진 등의 HTTP 서버에, php, jsp 등의 프로그램 언어를 얹혀
서버측 프로그램이 실행됩니다.
그런데, node.js는 그 자체만으로 HTTP 서버를 대체할 수 있고,
이에 더해 php, jsp, 닷넷 등의 기능을 대체할 수 있습니다.
HTTP 서버를 만들 수 있다는 것은, low 레벨까지 접근한다는 의미로,
간편한 자바스크립트 + 서버 제작이라는 흥미로운 작업이 가능합니다
node.js가 왜 속도가 빠르죠?
코드 상의 이해가 없다면, 완벽히 설명하기 어렵지만, 간략히 말씀드리면
비동기의 이벤트 기반으로 작동되기 때문입니다.
프로그램이 실행될 때, 하나의 작업이 CPU를 점유하고 있으면
다른 작업들은 대기 상태에 있습니다.
이에 반해, node.js는 비동기형이기에 하나의 작업이 끝나기까지
CPU를 계속 점유하는 것이 아니라... 그 사이 분주히 다른 작업들도 수행합니다.
즉, A 작업 시작하고... (대기 없이) B, C 작업 시작하며,
그 사이 A 작업의 다른 요청을 처리하고, B 작업을 종료함과 동시에
새로운 D 작업을 시작할 수 있습니다.
매우 효율적으로 작업이 가능하다는 걸 느낄 수 있죠.
이런 비동기 작업으로 효율을 낼 수 있는 건, 이벤트 기반이기 때문인데...
비동기 작업으로 가능한 이유가, 이벤트 발생시에만 해당 작업들을 수행하기에
계속 해당 작업에 붙잡혀있을 필요가 없기 때문입니다.
node.js가 속도가 빠르다면, 그것으로만 작성하면 되겠네요??
그렇지 않습니다. node.js는 제한된 상황에서만 최고의 성능을 발휘합니다.
우선, 멀티 스레드가 아닌 싱글 스레드로 작동됩니다.
즉, CPU가 여러개라도, 하나의 CPU만 활용하게 됩니다.
그에 따른 단점이 존재하죠.
그에 더불어, 비동기형으로 실행되는 작업 단위 자체가 CPU를 많이 사용하는 경우,
속도가 확연히 줄 수 있습니다.
비동기형으로 실행된다 하더라도... 비동기형의 소규모 작업 단위의
처리 시간이 길어지면, 동기형이 대기하듯...
다른 작업들이 대기하게 됩니다. 즉, 성능이 줄게 됩니다.
node.js가 속도를 발휘하는 작업은, 작업 단위들이 CPU를 많이 사용하지 않고,
단순 IO(입출력) 처리가 많은 경우입니다.
그래서, 그런 경우에 활용할 수 있죠.
node.js로 이점이 있는 작업의 예가 있나요?
예를 들어, 빈번한 소켓 통신이 이루어지는 채팅 서버, 스트리밍 서버 등에 사용하면
상당히 좋은 성능을 발휘합니다. CPU 작업이 적은 단순한 데이터 교환 작업인데다...
대다수가 동시에 작업하는 환경이기 때문에, 이러한 대용량 IO 작업에
최적화됩니다.
node.js는 데이터베이스를 사용할 수 있나요?
물론입니다. mysql, 오라클 등의 데이터베이스 작업이 가능합니다.
다만, 앞서 말씀드린 장단점이 적용된 작업에 쓰이면 좋습니다.
또한, 대표적인 NoSql인 MongoDB와의 궁합이 좋습니다.
MongoDB 역시 빠른 속도를 자랑하고, json 형태로 매핑하기에, 자바스크립트 엔진인
node.js와 작업이 편합니다. 그 쓰임새 및 특성도 node.js와 매우 잘 어울립니다.
어떤 작업 시, node.js를 추천하나요?
웹개발 분야에 대해 생각해보면, 그 자체만으로 모든 서비스를 만드는 것은 비효율적이고
많은 파생 문제를 일으킬 수 있습니다
전체 웹서비스 중, node.js에 최적화된 작업만 처리하는 것이 좋습니다.
채팅 서비스와 웹서비스 중, 빈번한 처리는 node.js로 만들고,
나머지 처리는 일반 HTTP 서버로 처리할 수 있겠죠.