[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/