Node.js 필수 인가?

개인적으로 C/C++ 말고 가정 선호하는 언어(?)는 Perl이다. 사실 언어라고 하기도 뭐한 것이 일반적인 shell script에 비해서 조금 더 복잡한 일을 할 수 있는데, C처럼 컴파일해야 되거나 platform에 dependant한 일을 하지 않아도 되는 일에 주로 사용한다. 속도같은 것은 진작에 포기했다고 봐야 맞을 것이 이렇게 허술하게 기술해도 잘 돌아가는 언어(?)들의 특징이라고 본다.

사실 perl은 오래전부터 쓰여져왔고 내가 기억하기로는 java가 완전히 떠버리기 전에 사람들이 많이 써왔으니까 shell script만은 못해도 유구한 역사를 자랑하고 있다고 봐야할 것 같다.

java가 나왔을 때는 javascript 형태로 web page에서 많이들 사용을 했다. 주로 web page의 property를 프로그램의 형태로 바꿔 주는 기능 때문에 웹 페이지에 효과를 준다거나 프로그램적인 요소를 더하기 위해서 썼다가 맞을 것 같다. 온전히 java를 application 제작을 하기 위해서는 java applet 이란 게 있어서 컴파일해서 패키지 형태로 된 것을 다운로드 받아서 웹 브라우져에서 구동을 시켰다.

지금은 node.js라고 해서 javascript를 node라는 해석기로 실행하는 것이 있다. 그러니까 javac로 컴파일하고 그것을 java라는 애플리케이션을 불러다가 컴파일된 것을 실행하는 것이 아니라 자바 스크립트 그 자체를 실행하는 것이다. 이와 비교되는 것이 php라고 perl과 비슷한 문법을 갖는 언어인데 주로 웹서버에서 실행하는 것으로 예전만해도 마이크로소프트의 asp 같은, 좀 진화된 형태의 cgi 였었다.

처리 속도를 비교해보면 JIT라고 해서 just-in-time compiler의 성능이 엄청나게 좋아져서 스크립트 언어지만 스크립트 같지 않게 매우 빨라졌다. 사실 java JIT은 96에 나온 것이니까 역사만도 20년이 넘는데 어찌보면 그만큼이나 성숙한 기술이다.

왜 이런 얘기를 하느냐면 인터넷을 통해서 하는 일의 경우 C로 하는 것은 좀 불편한 면이 있다. 이미 많은 class library들이 있어서 불러다가 개발하면 되지만 뭔가 바뀔 때마다 매번 컴파일을 해야한다는 불편함이 있는 반면 javascripts는 작성/디버깅이 매우 쉽고 편하다. perl의 경우는 실제로 실행해보면 매우 느리다는 문제점이 있다. 결국 java라고 보기도 뭐한 것이 (컴파일을 안해도 되니까) 그렇다고 예전처럼 웹페이지에 붙어서 돌릴 필요도 없고 컴파일을 안해도 되고 또 그 자체가 웹서버/웹브라우저가 되어 일을 할 수 있으니까 php처럼 html에 삽입되어 돌아가는 놈들과도 차별이 되고 npm이라고 엄청나게 큰 커뮤니티의 지원을 받으니 개발하기 더 없이 편하게 된 것이다.

예전 같으면 APM이라고 해서 apache 설치하고 PHP 설치하고 MySQL 같은 거 설치해서 웹사이트 하나 꾸렸던 것 같은데 (물론 지금도 그렇게 하는 곳이 많지만), node js로 하면 node만 설치하고 필요한 기능들은 npm에서 가져와서 끼워넣고 개발자는 그것들을 그저 연결하기만 하면 된다. php도 커뮤니티가 커져서 다른 이들이 이미 만들어놓은 것들을 불러다 쓸 수 있게 커지긴 했다만, perl 기반이라 java만큼 세련된 맛은 또 없다. 물론 언어가 세련되었다고 더 일을 잘하란 법은 없다만.

생각보다 php처럼 html에 끼워 쓰는, 사실 비표준이라 그 자체가 http 서버도 아니라 별도 해석기로 존재하는 기술이 방법이 오래 연명하고 있는 것을 보면 좀 신기할 때가 있다.

어쨌든 다시 생각해보면 IoT라고 해서 매우 작은 SoC들이 세상 여기저기에 존재해서 서로 인터넷으로 연결되어 정보를 주고 받는 세상이 되어가는데, 사실 그 중심은 web interface에 있다고 본다. 정보의 전달 차원에서 web interface는 비효율적이긴 하지만 웹 브라우져는 거의 대다수의 사람들이 가지고 있으니까 그 접근성은 대단히 높다. 어떤 정보든 html의 형태로 표현해주기만 하면 누구든 이해할 수 있는 수준으로 알아볼 수 있으니까 말이다. 그런 의미에서 그런 소형기기들이 저마다의 웹 서버를 구동해서 사용자가 언제든 접속해서 정보를 가져갈 수 있도록 하고, 또 필요에 따라 다른 IoT 장치들이 접속해서 주기적으로 데이터를 가져오고 하려면 node.js 만한 도구가 없다고 본다.

예전처럼 어떤 daemon이 하나 떠서 사용자가 정리해놓은 configuration 읽어서 정해진 일을 규칙적으로 수행하는 경우엔 데이터를 주고 받는 것이나 모든 과정들이 정해진 패턴대로 가야하고, 정해진 룰에 벗어나는 일이 생길 것을 대비해서 계속해서 관리를 해주어야 하지만, node.js로 서버와 클라이언트의 스크립트를 구현하고 배포하게 하면 데이터의 포멧이나 형태 변화에 더 robust하게 할 수 있고 IoT node가 늘고 줄고 하는 것에 대해서도 능동적으로 대처를 할 수 있지 않을까 하는 것이다.

말로만 중얼거리면 사실 감이 안오는데, 사실 나도 node.js로 된 소형 관리 서버를 굴려보기 전까진 뭔가 했는데, 막상 사용해보니 그 편리성에 계속 놀라게 된다. 그 자체가 서버의 형태로 존재할 수 있고 서버자원으로 존재하는 모든 것들과 유기적으로 접속이 가능하기 때문에 쉽게 해결 할 수 있다.

이를테면 local에 node하나가 늘어난 것을 avahi (bonjour)를 체크해서 해당 노드를 기존 서비스 노드 그룹에 자동으로 포함시키고 해당 노드로부터 데이터를 읽어와서 관리하고 통계내고 하는 일들을 한다고 치면 node.js 같은 경우에는 큰 어려움 없이 그것도 npm의 지원을 받아서 쉽게 마무리할 수 있는 반면 php라든가 그 외 방법을 이용하면 생각보다 많이 골치 아파진다. 흔하지 않는 방법으로 코딩해서 문제를 해결하려고 들면 그 코드는 내가 계속 관리해야 하는 부담을 떠안는 반면, npm의 모듈을 가져다 쓰게 되면 해당 모듈의 owner가 계속 관리해주기 때문에 안정성에 대한 부담도 크게 줄어드는 장점까지 있다.

node.js로 개발하는 것은 필수가 아닐까 하고 적다보니 말이 길어졌는데, 충분히 배워볼만 하고 C/C++에 익숙한 사람이 java에도 익숙하듯 또 그 옛날에 javascript 넣고 페이지 안 만들어본 사람 없으니까 충분히 배우기 쉬운 언어/개발체제(?)라 보여진다. 단시간에 원하는 목표를 이루는 서버를 간편하게 올리고 관리 또한 간편하게 한다는 면에서 이만한 솔루션이 있을까 싶다.