etc
Node.js, Express, MongoDB
Node.js란
Node.js는 Chrome의 V8 엔진으로 빌드된 자바스크립트 런타임이다. 기존에 자바스크립트는 브라우저에서만 구동 가능한 언어였다. 구글이 매우 빠른 자바스크립트 엔진인 V8을 출시하자 이를 바탕으로 브라우저 외 환경에서 자바스크립트 런타임을 구축하기 시작했다.
이벤트 기반
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. 예시로 클릭이나 네트워크 요청 등이 있을 수 있다.
논 블로킹
논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 뜻한다. 반대로 블로킹이란 이전 작업이 끝나야만 다음 작업을 수행하는 것을 의미한다. 논 블로킹 방식은 모든 작업이 동시에 처리될 수 있다는 전제하에 블로킹 방식보다 훨씬 빠르다. (ex. 시간이 오래 걸리는 블로킹 코드를 setTimeout으로 묶어 백그라운드에서 처리하도록 함.)
싱글 스레드
엄밀히 말하자면 싱글 스레드로 동작하지 않는다. 노드를 실행하면 프로세스를 하나 생성하고, 해당 프로세스에서 스레드들을 생성하는데 내부적으로 스레드를 여러개 생성한다. 그중에서 우리가 제어할 수 있는 스레드는 하나이기에 싱글 스레드라고 여겨진다. Node.js는 싱글 스레드 논블로킹 방식으로 움직이기 때문에 매우 효율적으로 일처리가 가능하고 멀티 스레드에 비해서 프로그래밍이 비교적 쉽다는 장점이 있다. (워커 스레드라는 기능을 사용하면 멀티 스레드 구현이 가능하다. 스레드풀의 경우는 자동으로 멀티스레드를 사용한다. 암호화, 파일 입출력 등 작업에서 사용된다.)
그렇다면 언제 Node.js를 사용하면 좋을까?
노드는 싱글 스레드, 논블로킹 모델로 사용하므로 해당 모델의 장단점과 크게 다르지 않다. 서버는 기본적으로 I/O를 많이 수행하는데 노드는 많은 양의 I/O 작업을 논블로킹 모델로 효율적으로 처리할 수 있다. 하지만 CPU 부하가 큰 작업에는 적합하지 않다. 스레드 하나가 혼자서 감당하기 어렵기 때문이다. 정리를 하자면, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는 데 적합하다. 네트워크, 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있기 때문이다. 예시로 실시간 채팅 어플리케이션, 주식 차트, JSON 데이터를 제공하는 API 서버가 노드를 많이 사용한다.
싱글 스레드 방식의 프로그래밍은 러닝 커브가 멀티 스레드 방식보다 상대적으로 낮다. 하지만 싱글 스레드의 경우 하나뿐인 스레드가 오류가 발생하면 멈추기 때문에 잘 관리하도록 해야한다.
Express란
Express는 웹 서버 프레임워크이다. 웹 서버를 구성하기 위해서 많은 편의 기능들이 내장되어 있다. 대표적으로 미들웨어와 라우팅이라는 장점이 있다.
Express의 핵심은 미들웨어라고 해도 과언이 아니다. 뒤에 나오는 라우터도 미들웨어의 일종이다. 미들웨어를 통해 요청과 응답에 다양한 기능을 추가할 수 있다. 로그인 여부 체크 등..
라우팅의 경우 http 모듈을 사용해서 처리하려면, 굉장히 많은 분기가 필요하지만 Express 라우팅 기능을 사용하면 손쉽게 가능하다.
MongoDB란?
MongoDB는 NoSQL 데이터베이스로 자바스크립트 문법을 사용한다는 특징이 있다. MongoDB를 사용하면 자바스크립트만으로 웹 애플리케이션을 구축할 수 있다.
NoSQL, SQL 특징
NoSQL에는 고정된 테이블이 없다. SQL의 경우 테이블을 만들 때, 칼럼과 자료형, 옵션 등을 정의하지만 몽고디비는 컬렉션을 만들면 끝이다. 어떠한 데이터든 들어갈 수 있다.
MongoDB는 MySQL과 달리 JOIN 기능이 없다. 흉내를 낼수는 있지만, 하나의 쿼리로 여러 테이블을 합치는 작업이 항상 가능하지는 않다.
몽고디비의 가장 큰 장점은 확장성과 가용성이다. 데이터의 일관성을 보장해주는 기능이 약한 대신, 데이터를 빠르게 넣을 수 있고 여러 서버에 데이터를 쉽게 분산시킬 수 있다.
어플리케이션에 꼭 한가지 데이터베이스만 써야되는 것은 아니다. 상황에 맞게 올바른 데이터베이스를 선택하면 된다. 데이터의 일관성이 필요한 항공 예약의 경우는 MySQL로, 채팅 혹은 빅데이터와 같은 일관성이 필요없고 데이터 양이 많은 경우는 MongoDB 도입을 고려해볼 수 있다.
Mongoose란?
ODM(Object Document Mapping)이라고 불린다. 몽고디비 자체가 이미 자바스크립트인데 굳이 자바스크립트 객체와 매핑시키는 이유는 몽고디비에 없어서 불편한 기능들을 몽구스가 보완해주기 때문이다. (참고. MySQL은 ORM은 시퀄라이즈가 있다.)
ODM이란 프로그래밍 언어 Object와 Document를 매핑시켜 호환성을 만들어내고 간편한 CRUD를 가능케한다.
스키마라는 기능을 사용할 수 있다. NoSQL은 테이블이 없어서 자유롭게 데이터를 넣을 수 있지만, 때로는 자유로움이 불편함을 초래한다. 잘못된 자료형을 넣을 수 있고 다른 도큐멘트에는 없는 필드의 데이터를 넣을 수도 있다. 몽구스는 몽고디비에 데이터를 넣기 전에 노드 서버단에서 데이터를 한번 필터링 하는 역할을 한다.
MySQL에 있는 JOIN 기능을 populate로 어느정도 보완한다. 관계가 있는 데이터를 쉽게 가져올 수 있다. 쿼리 한번에 데이터를 합쳐서 가져오는 것은 아니지만, 이 작업을 우리가 직접 하지 않아도 되므로 편리하다.