Native Extention
으로 개발된 라이브러리는 특정 V8
버전에 종속된다는 심각한 단점을 함께 가지고 있습니다. Node.JS
이 버전업되면서 사용하는 V8
엔진도 함께 업데이트되는 경우, V8
의 내부코드가 달라질 가능성이 큽니다.즉, 새로운
V8
버전에서는 기존의 라이브러리가 동작하지 않게 될 가능성이 매우 높다는 것입니다.위와같은 문제를 해결하기 위해 추상화된 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
버전을 사용하지 않는 사용자는 반드시 에러가 발생합니다.