노드js에서 에러 처리가 왜 중요한지 알려면 먼저 노드js를 동작하게 하는 V8 엔진의 특성부터 파악하는 것이 순서이다.
먼저 일반적인 코드의 실행 과정을 살펴보자.
코드의 실행 과정 : 파싱(parsing) 👉 컴파일링(compiling) 👉 실행 (executing)
파싱(parsing)
코드를 토큰 단위로 분할해서 AST(Abstract Syntax Tree)구조로 만든다.
컴파일링(compiling)
인간의 코드(고수준 언어)를 기계가 이해할 수 있는 코드(저수준 언어)로 변환한다. 컴파일을 하는 방법은 두 가지가 있다.
컴파일러 사용
👉 전체 코드를 스캔하여 최적화된 바이트 코드로 변환한다. (optimized byte code)
👉 실행할 최적화 코드를 만드는 과정에서 코드 에러를 미리 발견할 수 있다.
👉 초기 컴파일 과정에서 시간이 많이 걸리고 메모리 사용률이 높아지지만 이후에는 최적화된 코드로 실행하기 때문에 처리 속도가 빠르다.
인터프리터 사용
👉 코드를 한 줄씩 스캔하여 바이트 코드로 변환한다.
👉 코드를 한 줄씩 변환하며 바로 실행하기 때문에 error를 만나면 프로그램이 종료된다.
👉 최적화된 코드 실행에 비해 속도가 느리다.
V8 엔진은 처음에 인터프리터 방식으로 코드를 변환하지만 반복되는 코드, 함수 등의 패턴을 파악하여 컴파일하여 성능을 향상시킨다.
인터프리터 (코드 패턴 파악) 👉 프로파일러 (최적화 방법 도출) 👉 컴파일러 (최적화)
설명만 들었을 때는 장점들만 모아둔 최적의 해석 방식 같지만 코드의 작동 패턴이 바뀌거나, 성능이 오히려 저하된다고 판단될 때는 이 모든 과정이 역순으로 진행되면서 디컴파일링이 발생하고 이를 다시 인터프리터로 넘기기 때문에 개발자가 코드를 작성하는 단계부터 최적화를 고려한 코딩이 필요해진다.
참고자료
https://www.geeksforgeeks.org/how-v8-compiles-javascript-code/
https://velog.io/@colki/Udemy-Interpreter-Compiler
https://dkwjdi.tistory.com/194