[Node.js] C++ Addon ์ ์ฉ
Node๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋๋ก๋, js ์ฝ๋๋ง์ผ๋ก๋ ๋ถ์กฑํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ฑ๋ฅ ๋๋ฌธ์ด๋ผ๋ ์ง, ๋ค๋ฅธ unsafeํ ํ๋์ด ํ์ํ๋ค๋ ์ง, C++์ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ธ ํ์๊ฐ ์์ ๋ ๋ง์ด๋ค.
๋คํํ๋ Node๋ C++์ฉ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
์ ์ด์ Node ์์ฒด๊ฐ C++๋ก ๊ตฌํ๋ผ์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค๋ง..
์ฌ์ค ์ฐ๊ธฐ๋ ๋ชน์ ๋ถํธํ ํธ์ด๋ค.
์ผ๋จ ํด๋ณด์
๊ฐ์ฅ ๋จผ์ ํ์ํ ๊ฒ์ node-gyp์ด๋ค. ๋น๋ ๊ด๋ จ ์์ ๋ค์ ์ ๋ถ ์ฒ๋ฆฌํด์ฃผ๋ ๋ ์์ด๋ค.

๊ทธ๋ฆฌ๊ณ , C++ ์ปดํ์ผ๋ฌ๋ ์ธํ
๋ ์ํ์ฌ์ผ ํ๋ค.
์๋์ฐ๋ผ๋ฉด VSC, ๋ฆฌ๋
์ค๋ฉด GCC. ์์ผ๋ฉด ์ปดํ์ผ์ ๋ชปํ๋ค.
ํ์ด์ฌ๋ ์์ด์ผ ํ๋ค๊ณ ํ๋ค...
๋ค ๊ฐ์ท๋ค๋ฉด ์ด์ ์์ค๋ฅผ ์์ฑํด๋ณด์.
๊ฐ๋จํ๊ฒ "world" ํ
์คํธ๋ง ๋ฐํํ๋ ํจ์๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
๊ฒ๋๊ฒ ์กฐ์กํ๋ค.
node.h๋ node-gyp์์ ์์์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ณธ ํค๋์ด๋, ๋ญ ๋ฐ๋ก ์ฐพ์ ํ์๋ ์๋ค.
GetReturnValue์ Set์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด, ์์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ธ์ํ๊ณ ๊บผ๋ด๊ฐ๋ค๊ณ ํ๋ค.
์ฝ๋๋ค.
#include <node.h>
//๋ด๋ณด๋ผ ๊ตฌํ ํจ์
void Foo(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
//๋ฐํ๊ฐ ์ค์
args.GetReturnValue().Set(
v8::String::NewFromUtf8(isolate, "world", v8::NewStringType::kNormal)
.ToLocalChecked()
);
}
//Foo ํจ์๋ฅผ hello๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ด๋ณด๋
void Initialize(v8::Local<v8::Object> exports) {
NODE_SET_METHOD(exports, "hello", Foo);
}
//Node gyp ๊ท๊ฒฉ์ผ๋ก ๋ด๋ณด๋?
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
๊ทธ๋ฆฌ๊ณ binding.gyp๋ผ๋ ํน์ํ ์ค์ ํ์ผ์ ๋ฃจํธ ๊ฒฝ๋ก์ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ฐ ์๋์ ๊ฐ์ด ์ณ์ค๋ค.
target_name์ ๋ฐฉ์ถ๋ ๋ชจ๋์ ์ด๋ฆ์ด๊ณ ,
source๋ c++ ์์ค๋ค์ด๋ค.
์ ๋ ๊ฒ ํด๋๊ณ node-gyp configure๋ฅผ ํ๋ฉด ์ด๋ฐ์ ๋ฐ ์ค์ ํ์ผ๋ค์ด ์์ฑ๋๊ณ

build๋ฅผ ํตํด c++ ์์ค๋ค์ node์์ ๋์๊ฐ ์ ์๊ฒ๋ ๋ง๋ค์ด์ค ์ ์๋ค.

build๊ฐ ๋ฌธ์ ์์ด ์๋ฃ๋๋ค๋ฉด, build/Release ๊ฒฝ๋ก๋ก ์ ๋์จ ๋ชจ๋์ด ์๊ฒจ์์ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ addon.node๋ฅผ js ํ์ผ์ฒ๋ผ ๊ฐ๋ค์ธ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ง์ด๋ค.

๋๋ฅ
์ฐธ์กฐ
https://medium.com/@moony211/c-%EB%AA%A8%EB%93%88%EB%A1%9C-native-node-js-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-1-%EB%B6%80-nan-%EC%86%8C%EA%B0%9C-e5350cb2b5f7
https://github.com/nodejs/nan
https://jameshfisher.com/2019/04/20/nodejs-addon-hello-world/