본문 바로가기

# Lang

(26)
# Lang/NodeTS 자바스크립트 및 NodeJS 메모리 누수 피하기 (+ 메모리 구조, 가비지 컬렉터) 개요 어느 프로그래밍 언어든지 마찬가지겠지만 해당 언어의 내부 메모리 구조와 가비지 컬렉션 전략을 이해하지 못하면 해당 언어가 낼 수 있는 최대의 성능을 올바르게 이끌어낼 수 없습니다. 유틸리티 정도의 작은 프로그램이라면 괜찮겠지만, 큰 규모의 프로그램을 작성해야 한다면 이야기는 달라지겠죠. 해당 포스트에서는 자바스크립트의 메모리 구조와 가비지 컬렉션에 대해 설명하고, 올바르지 않은 코딩 패턴에 대해 설명합니다. 선행 지식 해당 포스팅을 이해하기 위해 필요한 지식들을 설명합니다. 참조형 변수 C++과 다르게 자바스크립트는 변수의 타입이 참조형인지 값인지 코드에서 명확하게 보이지 않으므로 처음에는 둘의 구분이 어려울 수 있지만, 실제로는 매우 쉽습니다. 다음 2가지만 기억하세요. 배열과 객체는 레퍼런스(주..

2020. 9. 30. 14:31

# Lang/NodeTS C++ Addon [벤치마크] C++ 애드온을 도입하면 성능이 얼마나 향상될까? 시작하기에 앞서 사실 JavaScript는 꽤 빠르고 생산성도 높은 스크립팅 언어입니다. 특히 병렬성이 높은 작업에 대해서는 때때로 컴파일 언어보다 높은 성능을 보여주곤해서, 동시성이 높은 웹서버를 만들기 위한 선택지로 Node.JS + Express.js가 먼저 고려되는 경우가 많습니다. 하지만 병렬성을 요구하지 않는 연산에서는 약한 모습을 보여주는데, 수학적 연산이 집중된 암호학 분야는 특히 NodeJS가 꺼려하는 대표적인 분야 중 하나입니다. 그러나 이러한 종류의 연산은 C++ Addon을 사용하면 보완할 수 있다고 알려져있죠. 그렇다면 NodeJS에 C++ Addon을 도입하면 성능이 얼마나 향상될까요? 아무때나 C++ Addon을 도입하면 되는걸까요? 이 포스팅에서는 C++ Addon의 성능에 ..

2020. 3. 16. 09:28

# Lang/NodeTS C++ Addon [튜토리얼] C++ 크로스플랫폼 애드온 제작하기 이 포스팅은 이전 포스팅과 이어집니다. 크로스플랫폼 NodeJS에 C++을 도입한다면 장단점은 명확합니다. 좋든 좋지않든 C++의 거의 모든 장단점을 통채로 가져온다는 것이죠. C++의 모토인 원한다면 만들 수 있다는 장점을 가져온 것과 동시에, 타겟 플랫폼에 종속된다는 단점도 함께 가져온 것이죠. 예를 들어 Node.JS의 기본함수만으로는 동기적으로 쓰레드를 정지시키는 함수를 만들 수 없기 때문에, 이 기능을 사용하고 싶다면 C++의 힘을 빌려야합니다. 하지만 문제는 각 운영체제마다 sleep을 사용하는 방법이 다르다는 것입니다. 헤더 이름도 다르고, 함수 시그너쳐도 다르며, 함수 이름도 다릅니다. Windows #include // // sleep 1ms. Sleep(1); Linux #include..

2020. 3. 14. 20:47

# Lang/NodeTS C++ Addon [DeepDive] NodeJS C++ Addon 깊게 입문하기 Node.JS Foundation 구성요소 Native Extention에 대해 설명하기에 앞서, 먼저 Node.JS가 어떻게 구성되어 있는지에 대해 알아야 합니다. JavaScript Node.JS에서 실행가능한 프로그래밍 언어입니다. V8 자바스크립트 언어로 작성된 코드를 실행해주는 엔진입니다. 자바스크립트의 객체를 생성하거나, 함수를 호출하는 방법과 같은 매커니즘을 정의합니다. Libuv 비동기 실행과 라이프 사이클을 제공하는 C 라이브러리입니다. Node.JS의 모든 비동기 동작은 LibUv가 관리합니다. 기타 라이브러리 Node.JS는 V8이나 LibUv를 포함한 수많은 라이브러리의 집합체이며, 이러한 라이브러리들이 정적으로 링크되어 Node.exe를 이룹니다. Node.JS가 어떤 라이브러리를..

2020. 3. 11. 19:10

# Lang/NodeTS alias를 사용하여 import 구문을 깨끗하게 만들자! Alias 어떤 경로에 별명(Alias)을 붙이고 모듈을 불러올 때, 이 별명을 활용하는 것을 Alias imports라고 합니다. 또한 별명을 활용하면 상대경로 방식이 모두 제거되므로, Absolute imports로도 불립니다. 먼저, 아래의 코드를 리팩토링하는 것부터 시작해봅시다. 최종적으로는 한 줄로 축약되고, 이 과정에서 모든 ../../../는 제거될 것입니다. import { IColumnVisibility } from "../../../interfaces/IColumnVisibility"; import { ILicense } from "../../../interfaces/ILicense"; import { ISoftware } from "../../../interfaces/ISoftware..

2020. 2. 13. 17:26

# Lang/NodeTS barrel를 사용하여 import 구문을 깨끗하게 만들자! Barrel 배럴이란 개념을 사용하면 import 구문을 축약함으로써, 코드를 더 깨끗하게 유지보수할 수 있습니다. 이것을 요약하자면 여러 모듈을 묶어서 다시 export하는 모듈로 정의할 수 있는데, 아래 코드처럼 하지말고, ./impl/에 {a, b, c}를 export하는 배럴을 두면 한줄로 축약할 수 있습니다. // ./src/app.ts import { a } from "./impl/a"; import { b } from "./impl/b"; import { c } from "./impl/c"; console.log(a, b, c); 아래처럼요. // ./src/app.ts import { a, b, c } from "./impl/barrel"; console.log(a, b, c); 물론 아래..

2020. 2. 13. 16:41

# Lang/NodeTS 타입스크립트 런타임 타입 가드 타입 체크는 컴파일에 이루어진다. 타입스크립트의 타입 체크는 Only 컴파일 시간에 이루어집니다. 컴파일 시간에는 비교적 엄격하게 타입체크를 하는편이지만, 그 외에는 타입체크가 거의 없다시피 하기때문에, 런타임시에는 진짜 그 타입이 맞는지 체크하는 것이 어렵습니다. 이 와중에 any가 포함되면 믿었던 컴파일 타입체크도 무용지물이 되는데, 아래 코드가 오류없이 컴파일되는것만 봐도 알 수 있습니다. interface Args { n: number; s: string; } let invaildArgs: any = { num: 3, str: "str" }; let fakeArgs: Args = invaildArgs; console.log(fakeArgs.n, fakeArgs.s); 위의 코드에서 fakeArgs..

2019. 12. 17. 20:27

# Lang/NodeTS VSCode TypeScript 프로젝트 생성하기 타입의 세계에 오신것을 환영합니다! 타입스크립트는 이른바 타입이 존재하는 자바스크립트라고 불리며, 자바스크립트의 장점이자 단점이였던 지나치게 지나친 유연성을 엄격하게 강제하기 위해 만들어졌습니다. 타입검사가 없으니 잘못된 인자를 넘겨주는 경우가 부지기수였고, 다른 사람이 작성한 코드라면 십중팔구죠. function addTwoNumber(x, y){ return x + y; } const num = 123 ; const str = '456'; const ans = addTwoNumber(num, str); // '123456' 동적타입에 고통받으신 여러분들을 위해, 안전한 타입스크립트의 세계로 안내해드리겠습니다. 준비물 챙기기 타입스크립트의 세계를 경험하기 위해서는, 먼저 준비물부터 챙겨야 합니다. 먼저..

2019. 12. 5. 02:03