How NAN Born

Creator
Creator
Seonglae ChoSeonglae Cho
Created
Created
2020 Jun 18 3:7
Editor
Edited
Edited
2022 Jun 23 8:2
Refs
Refs
Native Extention으로 개발된 라이브러리는 특정 V8버전에 종속된다는 심각한 단점을 함께 가지고 있습니다. Node.JS이 버전업되면서 사용하는 V8엔진도 함께 업데이트되는 경우, V8의 내부코드가 달라질 가능성이 큽니다.

즉, 새로운 V8버전에서는 기존의 라이브러리가 동작하지 않게 될 가능성이 매우 높다는 것입니다.
 
 
notion image
 
 
위와같은 문제를 해결하기 위해 추상화된 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 버전을 사용하지 않는 사용자는 반드시 에러가 발생합니다.
 
 
 
 
 
 
 
 
 
 
 
 

Recommendations