How NAN Born


`Native Extention`으로 개발된 라이브러리는 특정 `V8`버전에 종속된다는 심각한 단점을 함께 가지고 있습니다. `Node.JS`이 버전업되면서 사용하는 `V8`엔진도 함께 업데이트되는 경우, `V8`의 내부코드가 달라질 가능성이 큽니다.


즉, 새로운 `V8`버전에서는 기존의 라이브러리가 동작하지 않게 될 가능성이 매우 높다는 것입니다.


![](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F012c1b31-cc1b-4b22-bc4c-f3445a125ab6%2FUntitled.png?table=block&id=97be0b4f-36d1-4520-a8be-1982666a6c9c&cache=v2)


위와같은 문제를 해결하기 위해 추상화된 Native ExtentionNative Abstractions for Node가 만들어졌습니다. 인터페이스에 가까운 형식으로 추상화를 지원하는데, 절대 바뀌지 않을 인터페이스를 정한 뒤에, 각 V8버전에 맞춘 NAN가 만들어지는 식입니다.

간단하게 말하자면, 각 `V8`엔진의 버전마다 1:1로 대응되는 `NAN`이 존재하고 있으며, 이 `NAN`들은 모두 동일한 인터페이스를 유지하고 있으니, 나중에 `V8`의 버전이 바뀌더라도 그에 대응되는 `NAN`로 **갈아끼우면** 된다는 것입니다.


특히 `NAN`은 `Node.JS`의 초창기부터 함께해온 생태계이기 때문에, `NAN`으로 작성된 **코드**는 모든 `Node.JS`버전에서 사용할 수 있다는 것을 보장합니다. 따라서, `모든(이전) 버전에서 동작가능한 Native Extention 코드`을 만들기 위해서는 반드시 `NAN`를 사용하여 작성되어야 합니다.

## **아직 문제는 남아있다**
이렇게만 설명하면 `NAN`은 마법같은 무언가라고 생각되지만, 심각한 `디메리트` 도 있다는 것을 알 수 있습니다. `V8`의 버전이 바뀔 때 마다, 그 `V8`에 맞게끔 `NAN`을 바꿔끼우고 `다시 컴파일`해야 합니다. 말 그대로 **코드**만 호환되는 것입니다.


이것은 버전 호환성이 깨진다는 것을 의미하기 때문에, 개발자가 설정한 `V8` 버전을 사용하지 않는 사용자는 반드시 에러가 발생합니다.




> [[DeepDive] NodeJS C++ Addon 깊게 입문하기](https://aerocode.net/341)











