가이드 개발 가이드

fibjs란 무엇인가요?

fibjs는 웹 백엔드 개발을 위해 설계된 애플리케이션 서버 개발 프레임워크입니다. Google V8 JavaScript 엔진을 기반으로 구축되었으며 기존 콜백과 다른 동시성 솔루션을 사용합니다. fibjs는 Fiber(파이버)를 사용하여 비동기 호출로 인한 비즈니스 복잡성을 프레임워크 수준에서 격리함으로써 개발 난이도를 크게 줄이고 사용자 공간에서 잦은 비동기 처리로 인해 발생하는 성능 문제를 줄입니다.

역사적인 이유로 JavaScript는 주로 브라우저 UI를 처리하는 데 사용됩니다. UI 개발은 일반적인 단일 스레드 이벤트 중심 모델이므로 JavaScript는 점차 주요 프로그래밍 패러다임으로 비동기 처리를 형성했습니다.

JavaScript의 성공으로 점점 더 많은 사람들이 JavaScript를 다른 시나리오에 적용하기 시작했습니다. 동시에 사람들은 많은 시나리오에서 비동기 처리가 가장 적절한 선택이 아니라는 사실을 점점 더 인식하고 있습니다.

자연으로의 회귀, 민첩한 개발

fibjs는 프레임워크 수준에서 파이버(Fiber)를 사용하여 비동기 호출로 인한 비즈니스 복잡성을 격리하고 비동기 I/O 처리를 보다 직관적인 동기 호출로 캡슐화합니다. 엔지니어는 일반적인 동기식 비즈니스 로직에 따라 코드를 작성하기만 하면 되며 비동기식 처리가 제공하는 큰 편리함을 누릴 수 있습니다.

다음 코드는 mysql 모듈의 문서에서 가져온 것입니다:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
conn.beginTransaction(err => { if (err) { throw err; } conn.query('INSERT INTO posts SET title=?', title, (error, results, fields) => { if (error) { return conn.rollback(() => { throw error; }); } var log = 'Post ' + results.insertId + ' added'; conn.query('INSERT INTO log SET data=?', log, (error, results, fields) => { if (error) { return conn.rollback(() => { throw error; }); } conn.commit((err) => { if (err) { return conn.rollback(() => { throw err; }); } console.log('success!'); }); }); }); });

fibjs에서도 동일한 작업이 수행되며 코드는 다음과 같습니다.

1 2 3 4 5 6
conn.trans(() => { var result = conn.execute('INSERT INTO posts SET title=?', title); var log = 'Post ' + results.insertId + ' added'; conn.execute('INSERT INTO log SET data=?', log); }); console.log('success!');

단순성을 찾고 있다면 다음과 같이 코드를 작성할 수도 있습니다.

1 2 3 4
conn.trans(() => conn.execute('INSERT INTO log SET data=?', 'Post ' + conn.execute('INSERT INTO posts SET title=?', title).insertId + ' added')); console.log('success!');

비교를 통해 다양한 프로그래밍 스타일에 따른 차이점을 명확하게 확인할 수 있습니다. 코드가 적다는 것은 오류가 적다는 것을 의미하며, 코드가 적으면 코드의 논리가 더 명확해집니다. 이 경우 개발 및 유지 관리 작업 모두에 도움이 됩니다.

높은 에너지를 수용하세요

응답성을 향상시키기 위해 서버를 확장하는 것은 상대적으로 쉽지만 개발 프레임워크를 선택할 때 성능은 여전히 ​​중요한 고려 사항 중 하나입니다. ES7이 도입되면서 새로운 비동기 개발 모델로 async가 JavaScript에 도입되었습니다. 그러나 비동기식으로 제공되는 동기식 프로그래밍 스타일을 즐기는 동시에 이것이 성능에 미치는 영향도 직면해야 합니다.

다양한 프로그래밍 스타일로 인한 성능 차이를 비교하기 위해 다음 테스트 코드를 사용할 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
var count = 1000; async function test_async(n) { if (n == count) return; await test_async(n + 1); } function test_callback(n, cb) { if (n == count) return cb(); test_callback(n + 1, () => { cb(); }); } function test_sync(n) { if (n == count) return; test_sync(n + 1); } async function test() { console.time("async"); await test_async(0); console.timeEnd("async"); console.time("callback"); test_callback(0, () => { console.timeEnd("callback"); }); console.time("sync"); test_sync(0); console.timeEnd("sync"); } test();

최신 v8에서 이 코드의 실행 결과는 다음과 같습니다.

1 2 3
async: 0.539ms callback: 0.221ms sync: 0.061ms

테스트 결과에서 비동기가 널리 사용될 때 서버는 비동기 함수의 호출과 반환을 처리하는 데 많은 시간을 소비한다는 것을 분명히 알 수 있습니다. 실제 서버 측 애플리케이션 테스트에서도 이 사실을 발견했습니다. 그러나 이러한 급격한 성능 저하는 절대 용납할 수 없습니다.

이에 반해 fibjs는 파이버 기술을 사용하고 JavaScript 언어 자체의 특성을 최대한 활용하며 V8 엔진의 우수한 성능을 극대화합니다. 엔지니어는 쉽게 서버 성능을 극대화할 수 있습니다.

납치당하지 않고 패러다임을 유연하게 선택

fibjs를 사용하기로 선택했다고 해서 동기식 개발 스타일을 사용해야 한다는 의미는 아닙니다. 실제로 fibjs는 여러분에게 익숙한 다양한 비동기 프로그래밍 패러다임을 지원하며 동기 스타일과 비동기 스타일 사이를 유연하게 전환할 수 있습니다.

그러나 콜백 함수든 비동기 함수든 전염성이라는 치명적인 결함이 있습니다. 함수가 콜백 또는 비동기 함수인 경우 이에 의존하는 다른 모든 함수도 콜백 또는 비동기 함수여야 합니다. 대규모 소프트웨어 개발에서는 막대한 개발 비용이 발생합니다.

간단한 서버 개발 시나리오를 예로 들어 보겠습니다. 프로젝트 초기에는 세션 데이터를 메모리에 저장하는 방식을 선택했는데, 이때 동기화를 이용하여 데이터를 직접 읽고 저장할 수 있으며, 이를 기반으로 완전한 비즈니스 기능을 개발할 수 있습니다. 비즈니스 규모가 확장됨에 따라 세션 데이터를 Redis나 MongoDB에 저장해야 하는데, 이때 세션 관련 작업을 비동기 모드로 변경해야 합니다.

이론적으로는 종속 기능의 요구 사항에 맞게 각 기능을 하나씩 수정할 수 있지만 이를 위해서는 모든 모듈을 완전히 이해하고 수정할 수 있는 능력이 필요합니다. 여러 사람이 공동으로 개발하거나 타사 모듈을 사용하는 경우 이는 거의 불가능합니다.

따라서 모든 공통 모듈에서는 비동기성과 성능 간의 관계 균형을 유지하기 위해 동기식 및 비동기식 인터페이스를 모두 제공해야 합니다. 일반 개발자는 일반적으로 비동기 인터페이스만 제공하기로 선택하므로 성능 문제가 발생합니다.

fibjs에서는 유사한 문제를 쉽게 해결하고 명시적 비동기의 통제되지 않은 전파를 피할 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var util = require('util'); function session_get(sid) { return sdata; } async function async_session_get(sid) { return sdata; } function callback_session_get(sid, cb) { cb(null, sdata); } data = session_get(sid); data = util.sync(async_session_get)(sid); data = util.sync(callback_session_get)(sid);

fibjs는 콜백 함수나 비동기 함수를 동기 함수로 변환하고 직접 호출할 수 있는 util.sync 함수를 제공합니다. 이러한 방식으로 우리는 서로 다른 프로그래밍 패러다임의 모듈을 쉽게 통합하고 개발 비용을 최소화하여 이를 동기화된 패러다임으로 변환하여 패러다임 전염으로 인한 재난을 효과적으로 피할 수 있습니다.

체험을 시작해 보세요

훌륭한 개발 경험을 할 준비가 되셨나요? 이제 설치를 시작해 보겠습니다.

👉【설치 및 실행환경