Express, Koa, Meteor, Sails.js: 묵시록의 네 가지 프레임워크
게시 됨: 2022-03-11JavaScript는 웹 애플리케이션에 대한 엄청난 수요로 인해 최근 몇 년 동안 가장 인기 있는 언어 중 하나가 되었습니다. 여러 브라우저를 코딩하는 동안 JavaScript는 프론트 엔드 개발자에게 거의 유일한 선택입니다. 대안으로 CoffeeScript, TypeScript 또는 Dart가 있다고 주장할 수 있습니다. 그러나 진실은 CoffeeScript가 궁극적으로 JavaScript로 귀결되는 구문 설탕으로 대부분 간주된다는 것입니다. TypeScript는 선택적 정적 타이핑, 클래스 및 인터페이스와 같은 여러 객체 지향 언어 기능을 포함하는 JavaScript의 상위 집합이며 아직 초기 단계입니다. Dart는 또한 C와 같은 구문을 가진 객체 지향 언어이지만 여전히 주류 브라우저용 JavaScript로 컴파일됩니다.
Node.js의 탄생과 급속한 성장으로 JavaScript는 더 이상 프론트엔드 개발에 국한되지 않으며 백엔드 개발은 더 이상 프론트엔드 코더를 위한 로켓 과학이 아닙니다. 사람들은 자바스크립트를 프론트엔드, 웹 서버, 데스크탑 애플리케이션, 임베디드 시스템, 데이터베이스 등 모든 상황에 적합한 은총알처럼 생각하는 경향이 있습니다. 목록은 계속해서 길어지고 있습니다. 사실, JavaScript의 광범위한 청중을 감안할 때 Node.js+MongoDB+AngularJS/React는 상당한 양의 풀 스택 웹 개발자를 만들었습니다. 그러나 Node.js는 경량화되어 웹 애플리케이션 개발 속도를 높이기 위해 웹 서버로서 기본적인 기능만 제공합니다. npm 패키지로 사용할 수 있는 좋은 프레임워크 중 하나는 현실 세계에서 더 나은 선택이 될 것입니다.
이 게시물에서 우리는 개발자들이 계속해서 바퀴를 재발명해야 하는 부담을 덜어준 잘 알려져 있고 시간 테스트를 거친 Node.js 프레임워크 중 일부를 살펴볼 것입니다. 보다 구체적으로 이 기사에서는 Express, Koa, Meteor 및 Sails.js를 살펴보겠습니다. 이러한 각 프레임워크가 서로 어떻게 스택되는지 파악하는 대신 이러한 각 프레임워크가 뛰어난 핵심 영역과 다양한 프로젝트 요구 사항과의 관련성을 살펴보겠습니다.
Express: 미니멀리스트 웹 프레임워크
Express는 Node.js 비즈니스에서 가장 큰 거래입니다. 모든 Node.js 플레이어는 그것에 대해 들어 보았고 눈치 채지 않고 사용하고 있습니다. 현재 4세대이며 이를 기반으로 하거나 개념에서 영감을 받아 구축된 Node.js 프레임워크가 꽤 있습니다.
성능
대부분의 개발자는 Node.js의 원시 속도를 좋아하며 프레임워크 선택과 관련하여 완벽주의자는 성능 위험을 경멸할 수 있습니다. Express는 기본 라우팅, 미들웨어, 템플릿 엔진 및 정적 파일 제공과 같은 웹 애플리케이션 기능과 함께 Node.js 위에 씬 레이어를 제공하므로 Node.js의 급격한 I/O 성능이 손상되지 않습니다.
Express는 의견이 없는 최소한의 프레임워크입니다. MVC, MVP, MVVM 또는 기본적으로 유행하는 모든 것과 같은 일반적인 디자인 패턴을 적용하지 않습니다. 단순함을 좋아하는 사람들에게는 불필요한 학습 곡선 없이 원하는 대로 애플리케이션을 빌드할 수 있기 때문에 다른 모든 프레임워크 중에서 큰 장점입니다. 이는 역사적 부담이 없는 새로운 개인 프로젝트를 생성할 때 특히 유리하지만 프로젝트 또는 개발 팀이 성장함에 따라 표준화가 부족하면 프로젝트/코드 관리에 대한 추가 작업이 발생할 수 있으며 최악의 경우 유지 관리가 불가능해질 수 있습니다. .
발전기
프레임워크는 의견이 없지만 특정 프로젝트 폴더 구조를 생성하는 생성기가 있습니다. express-generator npm 패키지를 설치하고 generator 명령으로 애플리케이션 스켈레톤을 생성한 후, 이미지, 프런트 엔드 정적 JavaScript, 스타일시트 파일 및 HTML 템플릿 파일을 구성하는 데 도움이 되도록 명확한 계층 구조를 가진 애플리케이션 폴더가 생성됩니다.
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
미들웨어
미들웨어는 기본적으로 요청 및 응답 개체 모두에 대한 전체 액세스 권한이 있는 기능입니다.
이름에서 알 수 있듯이 미들웨어는 실제 비즈니스 논리 또는 다음 수준의 미들웨어에 제어를 넘기기 전에 일부 필터링 명령을 적용합니다. 일부 일반적인 작업에는 사용자 로그인 상태 확인, 사용자 권한 확인 또는 교차 사이트 공격 방지와 같은 미들웨어가 가장 잘 추출됩니다.
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
Express 애플리케이션은 본질적으로 미들웨어 기능의 호스트가 있는 Node.js입니다. 자신의 미들웨어를 사용자 정의하거나 프레임워크의 내장 미들웨어를 활용하려는 경우 Express는 프로세스를 자연스럽고 직관적으로 만들었습니다.
템플릿 엔진
템플릿 엔진을 사용하면 개발자가 백엔드 변수를 HTML 파일에 포함할 수 있으며, 요청 시 템플릿 파일은 실제 값으로 보간된 변수를 사용하여 일반 HTML 형식으로 렌더링됩니다. 기본적으로 express-generator는 Pug(원래 Jade로 알려짐) 템플릿 엔진을 사용하지만 Mustache 및 EJS와 같은 다른 옵션도 Express와 원활하게 작동합니다.
데이터베이스 통합
최소한의 프레임워크인 Express는 패키지 내에서 데이터베이스 통합을 필수 측면으로 간주하지 않으므로 특정 데이터베이스 사용에 전혀 의존하지 않습니다. MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch 등 특정 데이터 저장 기술을 채택하는 동안 특정 npm 패키지를 데이터베이스 드라이버로 설치하기만 하면 됩니다. 이러한 타사 데이터베이스 드라이버는 CRUD 명령을 수행할 때 통합 구문을 준수하지 않으므로 데이터베이스 전환이 매우 번거롭고 오류가 발생하기 쉽습니다.
Koa: 차세대 JavaScript 기능 활용
Koa는 Express 뒤에 있는 팀에서 개발했으며 목표는 코어 내에 미들웨어를 번들로 묶지 않음으로써 최소한의 Express를 최소화하는 것입니다. 미들웨어가 없다는 점을 제외하면 Koa는 Express와 매우 유사하고 가볍고 의견이 없습니다. 그러나 Koa를 진정으로 돋보이게 하는 것은 ES6 Generator 기능을 사용하여 콜백을 완전히 없애는 방법입니다.
우아한 제어 흐름
Javascript는 비동기 프로그래밍 언어이며 언어 자체의 본능과 Node.js의 단일 스레드 이벤트 구동 메커니즘으로 인해 콜백이 도처에 있으므로 악명 높은 콜백 지옥입니다.
콜백 중첩을 평면화하는 한 가지 방법은 Async.js를 사용하는 것입니다. Async.js는 하나의 기능을 다른 기능에 포함하지 않고 여러 기능을 매핑, 병렬화, 직렬화 또는 반복하는 기술을 제공한 다음 콜백 기능으로 제어 흐름을 전달합니다. 하나의 콜백 및 하나의 오류 처리 기능은 함께 그룹화된 대량의 기능에 충분합니다. Async.js 메서드로. 그러나 Async.js는 콜백 전체를 지울 수 없습니다. Async.js로 Node.js 코드를 작성할 때 코드 들여쓰기는 여전히 오른쪽으로 치우치는 경향이 있지만 깊지는 않습니다.
또 다른 깔끔한 방법은 then-able Promise를 사용하는 것입니다. 평판이 좋은 타사 Promise 라이브러리에는 bluebird 및 q가 있습니다. 최신 버전의 JavaScript인 ES6에서는 Promise가 표준화로 채택되었습니다. 간단히 말해서, Promise는 구현 블록/함수를 Promise "then" 함수 무리와 연결하여 함수가 순차적으로 실행되고 반환되도록 보장합니다. 다음 "then" 함수가 실행되도록 각 구현 블록/함수의 끝에서 "해결"하거나 제어 흐름이 오류 처리로 바로 이동하도록 다음 구현을 "거부"합니다. 이런 식으로 모든 오류 처리 기능을 한 곳으로 집계하고 콜백을 철저히 제거합니다.

이제 ES6은 게임 체인저인 ES6 Generator를 제공합니다. 이 개념은 JavaScript에서는 새로운 것이지만 프로그래밍 세계에서는 전혀 새로운 것이 아닙니다. ES6 Generator는 위에서 아래로 코드 줄을 실행하는 대신 C의 중단과 같습니다. ES6 Generator는 실행->중지하고 다른 것을 실행->남은 것을 끝내기 위해 돌아오는 수단을 도입합니다.
Koa는 JavaScript 비동기 프로그래밍에 대처하는 우아한 방법을 제공하기 위해 ES6 Generators를 활용하므로 순수한 Koa 애플리케이션에서는 콜백을 볼 수 없습니다. Koa에서 ES6 Generator의 일반적인 사용 사례 중 하나는 미들웨어 캐스케이딩으로, 사용자 정의된 미들웨어가 불쾌한 콜백 없이 차례로 실행할 수 있습니다.
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
이 최첨단 기술이 Async.js, Promise 또는 이벤트 이미터와 같은 구식 솔루션보다 우수하다고 단언할 수는 없지만 한 가지는 이 새로운 개념에 익숙해지는 데 시간이 걸린다는 것입니다. 비전통적인 제어 흐름 시퀀스를 사용하면 코드 디버깅에 추가 어려움이 발생할 수 있습니다.
Meteor: 웹, 모바일 및 데스크탑용 프레임워크
Meteor는 올인원 JavaScript 프레임워크입니다. Express 및 Koa의 단순화 철학과 달리 서버, 모바일, 데스크톱 및 웹 앱을 포괄하는 전체 패키지인 전체 스택 프레임워크로 정의함으로써 다른 극단으로 이동합니다.
일대일 패키지
내부를 자세히 살펴보면 Meteor가 실제로 Node.js+Blaze/AngularJS/React+Cordova+MongoDB임을 알 수 있습니다. Node.js와 MongoDB는 각각 서버 측 비즈니스 로직과 데이터 저장을 담당합니다. Blaze, AngularJS 또는 React 중 하나가 프런트 엔드 UI를 처리합니다. 그리고 가장 유명한 모바일 하이브리드 앱용 HTML 솔루션인 Cordova는 웹 페이지를 모바일 보기에 연결합니다.
데이터 동기화
백엔드와 프론트엔드가 데이터를 공유하는 주요 프로세스는 다음과 같습니다.
- 클라이언트가 데이터 또는 특정 HTML 보기를 요청합니다.
- 서버는 데이터베이스에서 데이터를 검색하고 일부 템플릿 엔진을 사용하여 HTML 보기와 데이터를 혼합하고 프런트 엔드로 다시 보냅니다.
- 클라이언트는 사용자 친화적인 방식으로 데이터/보기를 렌더링하고 표시합니다.
최신 단일 페이지 웹 애플리케이션은 위의 프로세스를 약간 조정합니다. AngularJS를 예로 들면 HTML 템플릿을 프론트 엔드 JavaScript 파일, 스타일 시트 및 이미지와 같은 다른 자산과 함께 정적 파일로 넣습니다. 그런 다음 AngularJS는 Ajax RESTful API를 사용하여 백엔드에 데이터를 요청하여 HTML 템플릿에 데이터를 채웁니다. 어느 쪽이든 백엔드 개발자는 프론트엔드의 데이터 변경 요청을 처리하고 데이터베이스에 변경 사항을 저장할 책임이 있습니다.
Meteor를 다른 프레임워크와 구별하는 기능 중 하나는 서버와 프론트 엔드/모바일 앱 간의 데이터 동기화 메커니즘입니다. Meteor에서 클라이언트는 서버 데이터베이스에서 복제의 작은 부분인 미니 데이터베이스 섀도 복사본을 보유합니다. 클라이언트가 데이터를 변경하려고 할 때 서버 측에서 일관된 데이터베이스 API를 사용하여 CRUD 명령을 수행하면 데이터 변경 사항이 자동으로 서버로 전송되어 실제 데이터베이스에 저장됩니다. 서버는 데이터 수정 사항을 감지할 때마다 업데이트된 데이터를 해당 데이터를 구독하는 특정 클라이언트에 푸시합니다. 이 양방향 데이터 동기화는 수동 개입 없이 자동으로 수행됩니다. 이 마법을 만들기 위해 Meteor는 WebSocket을 사용하여 내부에서 클라이언트와 서버를 연결하여 한쪽 끝의 모든 데이터 변경 사항이 다른 쪽 끝에서 즉시 반영되도록 합니다.
빌드 자동화 도구
Meteor는 기본 모바일 기능과 HTML/JavaScript/CSS를 번들로 제공하는 라이브러리인 Cordova의 도움으로 Isobuild라는 Meteor의 빌드 도구를 사용하여 서버 및 웹 앱 애플리케이션을 관리할 뿐만 아니라 Meteor를 사용하여 iOS 및 Android 앱을 쉽게 구축할 수 있습니다. 생성된 모바일 앱은 JavaScript를 실행하거나 WebView 내에 HTML 페이지를 표시하는 하이브리드 앱입니다. 이 해결 방법은 기본 모바일 앱과 비교할 때 일부 사용자 경험을 손상시킬 수 있지만 많은 사람들에게 웹 앱과 동일한 코드 기반으로 모든 것을 관리할 수 있다는 것은 상당한 판매 포인트이며 엄청난 개발 비용을 절약할 수 있습니다.
전반적으로 Meteor는 고도로 자동화된 프레임워크입니다. 이 높은 수준의 자동화는 개발자의 삶을 훨씬 더 쉽게 만들어 주지만 성능 및 확장성 제한을 위태롭게 하는 비용이 따릅니다. 사용자 기반이 늘어남에 따라 자동화된 데이터 동기화 기술이 확장의 관문이 됩니다. 다른 수동 조정 백엔드 기술과 동일한 용량과 성능을 달성하기 위해 Meteor는 일반적으로 훨씬 더 많은 서버 하드웨어와 대역폭 리소스를 사용합니다. 따라서 Meteor는 모든 주요 플랫폼에 대한 프로젝트의 프로토타입을 만들고자 한다면 훌륭한 출발점이자 완벽한 도구 상자가 될 수 있습니다. 클라이언트 기반.
Sails.js: Node.js를 위한 우수한 MVC 프레임워크
Sails.js는 Express와 많은 유사점을 공유합니다. 프로젝트 생성기, 미들웨어 및 템플릿 엔진입니다. 실제로 Express와 개발 속도를 높이기 위해 더 높은 수준의 기능을 기반으로 구축되었습니다.
MVC
Sails.js는 핵심에서 Model-View-Controller 디자인 패턴을 채택합니다. Ruby on Rails 또는 Laravel에서 온 사람들은 Sails.js 앱의 구조가 너무 익숙하다는 것을 알게 될 것입니다. Model은 데이터베이스 테이블/컬렉션 스키마를 반영하는 데이터 모델을 나타내고, View는 데이터가 채워진 HTML 뷰이며, Controller는 모든 서버 측 비즈니스 로직을 넣는 곳이며 데이터와 뷰 사이의 접착제 역할을 합니다.
실시간 커뮤니케이션
클라이언트가 매번 서버 데이터를 쿼리해야 하는 HTTP 요청이나 서버를 유휴 모드로 만드는 긴 폴링 연결과 달리 Socket.io는 클라이언트와 서버 간에 양방향 이벤트 기반 통신을 설정합니다. Sails.js는 Socket.io를 통합하고 더 높은 추상화 수준 API로 마무리하여 더 많은 편의를 제공하므로 Sails.js는 채팅 앱이나 멀티플레이어 게임을 만드는 데 특히 적합합니다.
데이터베이스 ORM
백엔드 로직과 실제 데이터베이스 조작 사이에는 Waterline이라는 중간 ORM 계층이 있습니다. 간단히 말해서, 이 ORM 도구는 개발자가 SQL 대 NoSQL, 스키마 대 스키마 없는 등과 같은 다양한 데이터베이스 쿼리 언어에 대해 걱정할 필요 없이 다양한 데이터베이스에 액세스할 수 있는 일관된 구문을 제공합니다.
Sails.js에는 중급 자동화 학위가 있습니다. 서버 측 로직에 중점을 두고 프로덕션 준비가 되어 있으며 성능이나 향후 확장성을 희생하지 않으면서 Express보다 빠른 개발 속도를 제공합니다. 특히 많은 양의 MVC 패턴 애호가의 경우 Sails.js는 학습 곡선이 상당히 매끄럽습니다.
마무리
이 기사는 다른 Node.js 프레임워크의 순위를 매기는 것이 아니라 Node.js 개발자가 처음부터 프로젝트를 빌드할 때 가장 적합한 도구 상자를 선택할 수 있도록 군중에서 눈에 띄는 각 프레임워크의 빛나는 부분을 나열합니다.
그렇다면 웹 개발을 위해 가장 좋아하는 Node.js 프레임워크는 무엇입니까? 위에서 논의한 것 외에 다른 프레임워크를 선호합니까? 아래 의견 섹션에 알려주십시오.
- 도대체 왜 Node.js를 사용할까요? 사례별 자습서
- Cabin Fever 코딩: Node.js 백엔드 튜토리얼
- Node.js/TypeScript REST API 빌드, 1부: Express.js