반응형

컴퓨터 공학/JavaScript 39

TCO (Tail Call Optimization) 개념 및 예제

개념 TCO (Tail Call Optimization)은 재귀 함수 호출을 최적화하기 위해 컴파일러 및 프로그래밍 언어에서 사용되는 기술입니다. 많은 프로그래밍 언어에서 함수가 다른 함수를 호출하면 호출자가 새 스택 프레임을 콜스택으로 push 합니다. 이 스택 프레임에는 로컬 변수 및 반환 주소와 같은 호출자의 상태 정보가 포함되어 있으므로 프로그램은 호출된 함수가 반환될 때 컨트롤을 반환할 위치를 알 수 있습니다. 그러나 Tail Call에서는 호출 함수의 마지막 작업이 호출을 수행하는 것이며 호출 후 추가 처리를 수행하지 않습니다. 이 경우 콜스택에 새 스택 프레임을 push 할 필요가 없으며 프로그램에서 현재 스택 프레임을 재사용할 수 있습니다. 이렇게 하면 메모리를 절약하고 Stack Over..

pkg 모듈 실행 시 "(0, assert_1.default)(!this.bar)" 에러 발생하는 경우

발생문제 Node.js를 v14에서 v16으로 버전업 후 pkg 모듈을 통해 실행파일을 생성하려고 하면 아래와 같은 에러가 발생할 수 있습니다. > pkg@5.7.0 > Fetching base Node.js binaries to PKG_CACHE_PATH fetched-v16.15.0-win-x64 [ ] 0%> Not found in remote cache: {"tag":"v3.4","name":"node-v16.15.0-win-x64"} > Building base binary from source: built-v16.15.0-win-x64 > Fetching Node.js source archive from nodejs.org... > Error! AssertionError [ERR_ASSERTI..

VSCode에서 JavaScript CommonJS의 export 객체 속성들 <Find Reference>에 검색되지 않는 문제

문제 JavaScript에서 CommonJS 형식인 module.exports를 통해 객체를 export할 수 있습니다. 아래 코드는 math.js 내의 산술연산 함수들을 export하고 있습니다. 그리고 math.js의 함수를 사용하는 index.js 가 있습니다. 지금 상황에서는 index.js가 math.js의 sum과 subtract 함수를 import 하여 사용하고 있는데요, 만약, 다양한 코드 영역에서 sum 함수를 import하여 사용하고 있을 때, sum 함수를 참조하고 있는 모든 영역을 찾고 싶을 때 어떻게 해야 할까요? VSCode에서는 기능을 통해 선택한 속성을 참조하는 코드 영역을 모두 찾아줍니다. 그런데, 위 코드처럼 CommonJS 형식으로 export한 속성들은 같은 파일 내에..

Cloudflare Workers와 Notion API로 유저 데이터 관리하기

소개 사이드프로젝트로 개발중인 온라인 게임의 유저 정보를 기존에는 유저 로컬 환경에 파일로 보관하고 있었는데, 정식으로 출시되면 클라우드 서버에서 관리할 필요가 있기에 알아보던 중 노마드코더라는 개발자 유튜버가 소개한 Cloudflare Workers와 Notion API를 이용하여 프로토타입 수준의 데이터베이스 (이하 DB)를 구축할 수 있는 것으로 보여 직접 적용해보기로 하였습니다. 본 포스팅은 Windows 10 환경 개발자를 대상으로 소개합니다. 준비물 Node.js v12+ Visual Studio Code 노션 (Notion) 계정 Postman 작업 순서 우선, 유저 정보를 보관할 데이터베이스를 Notion으로 만들고, 만들어진 데이터베이스에 유저 데이터를 관리하는 Cloudflare Wor..

JavaScript로 interface 모사하기

소개 JavaScript에는 class만 존재하고, interface가 없습니다. 따라서, interface를 이용한 아키텍처를 불완전하게 적용할 수 밖에 없습니다. class만으로 interface와 비슷한 기능을 하도록 모사하는 방법을 제안합니다. Step 1. interface base 생성 프로젝트에서 소스 폴더 내에 interfaces 폴더를 생성하고, 그 안에 base.interface.js 파일을 만들어 다음과 같이 작성합니다. /** * 인터페이스 정의 헬퍼 함수 * * @template T * @param {T} newInterface * @returns {T} */ function defineInterface(newInterface){ const NOT_IMPLEMENTED = "thr..

Node.js - async_hooks 소개

프롤로그 클라이언트-서버 모델에서 클라이언트는 서버에게 다양한 요청을 보냅니다. 일반적으로 서버는 클라이언트의 요청 정보를 식별하기 위해 클라이언트가 적재하는 헤더의 식별 정보를 사용합니다. 예를 들어, HTTP 통신에서 클라이언트는 헤더 ‘[x-request-id]’에 요청 고유 식별자를 적재하여 서버에 보냅니다. 일반적으로 서버는 여러 클라이언트가 보내는 동시다발적인 요청을 시간 순서에 따라 로그에 기록합니다. 이때, 서버는 각 요청에서 발생한 로그에 헤더 ‘x-request-id’를 함께 기록해두는데, 이는 나중에 특정 요청에 대한 로그 내역을 찾기 위해 요청의 고유 식별자인 ‘x-request-id’로 필터링을 걸면 해당 요청 로그만 손쉽게 열람할 수 있습니다. async_hooks가 생긴 이유 ..

윈도우에서 NVM 설치 및 사용하기

NVM (Node Version Manager) Node.js의 여러 버전을 직접 다운로드 및 설치할 필요없이 터미널에서 명령어만 입력하여 손쉽게 버전을 변경할 수 있도록 지원하는 서비스입니다. 오리지널 nvm은 오직 Mac과 리눅스 전용으로 만들어졌습니다. 그렇기 때문에 윈도우 사용자는 NVM 서비스를 사용할 수 없었습니다. 하지만, 윈도우 사용자를 위한 NVM이 제공되면서 이제 윈도우에서도 사용할 수 있습니다. NVM for Windows 다운로드 https://github.com/coreybutler/nvm-windows/ GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically writ..

Function.bind(this, ...)가 필요한 경우

예를 들어, 다음과 같이 두 함수 foo, bar가 있다고 하자. const foo = (a: string, b: string, c: string) => { return `${a}-${b}-${c}` } const bar = (func: (a: string, b: string)=> string) => { return func('wow', 'amazing') } 이때, bar의 파라미터로 foo를 넘겨주고 싶은데, 파라미터 개수가 다르다. 따라서, foo의 첫 번째 파라미터는 'world'로 고정하여 bar에 넘겨주고 싶을 때, Function.bind(this, ...)를 사용할 수 있다. bar(foo.bind(this, 'world')) // wolrd-wow-amazing foo.bind(this,..

쿼리 대신 TypeOrm으로 DB 통신하기 (샘플)

웹 앱에서 MariaDB, MySQL 등의 RDB와 통신할 때 보통 쿼리와 파라미터를 넘기는데, 사용하는 DB, 테이블, 칼럼이 많아지면 쿼리도 많아지게 되면서 나중에는 프로젝트에 쿼리 문자열로 가득차게 된다. TypeOrm 패키지는 쿼리 대신 객체와 클래스를 이용해서 DB와 통신할 수 있는 방법을 제공한다. 타입스크립트에서 기본 예제를 소개한다. 우선 프로젝트에 mysql, reflect-metadata, typeorm을 설치한다. $ npm install --save typeorm $ npm install --save reflect-metadata $ npm install --save mysql tsconfig.json 파일에 다음의 속성을 추가한다. { "compilerOptions": { "exp..

반응형