소스 코드 작성히 콜백 지옥 빠져나가기... 기본적인 회피는 가능함!
Node.js 개발 시에 편한 싱글 스레드의 개념은 분명 대단히 효과적입니다. 단순한 구성을 하는데 적합하다는 것이 콜백 지옥을 만드는 원인이 됩니다.
분명한 것은 단순한 계산과 단순한 처리에는 이 방식이 엄청 효과적입니다.
하지만, 네트워크 대기가 발생하거나, 파일 저장 등의 규모 있는 작업이 발생하면 Node.js개발에서는 무조건 기다리는 형태로 구현됩니다.
다음의 코드들을 살펴보면 이 문제를 더 상세하게 알 수 있습니다.
특히, DB를 호출하게 되면 시간이 소요되기 때문에 이것을 순서대로 진행하기 위해서는 피라미드 형태로 구성되는 소스코드의 구성이 발생하게 됩니다. DB 호출하고 그 데이터를 얻어서 어떤 처리를 하는 순서대로 진행이 되어야 하기 때문이죠.
그런데, 문제는 이렇게 '순차적'으로, '하나의 흐름'만 발생된다면 상관이 없습니다만. 내부에서 '분기'가 발생하고 익명 함수들이 사용되면서 바로 콜백 지옥은 발생합니다.
Node.js의 기본은 이런 분기 없이 한 번에 하나의 형태로 나열하는 것이 원칙상 맞습니다. 그래서, Node.js로 RESTFull API를 구성할 때에는 이런 처리 방식으로 API들을 나열하듯이 구성되는 것이 맞습니다. 내부에서는 최소한의 분기만 사용하는 것이 원칙이 되어야 하는 것이 맞습니다.
처음부터 콜백 지옥을 만나지 않도록 Node.js의 소스코드를 구현하는 것이 분명 최선입니다.
하지만, 실제 일이 그런 '이상적인 환경'을 만나기는 매우 어렵습니다.
Async와 함수화, 병렬화, 동기 함수, Promise 등을 적절하게 혼용하여 사용하면 적당한 혼란은 방어가 가능합니다.
가장 권장되는 방법은 Promise방법과 Async함수를 사용하는 방법입니다. 하지만, 이 역시 모든 것을 해결해주지는 않습니다. 이 방법 역시, 중첩되고 호출되는 형태를 가지면서 Node.js에서의 혼돈스러운 서버 구조를 만들 수밖에 없습니다.
더군다나, 실제 Node.js로 개발한다고 하더라도, AJAX 기반이거나 HTML5등의 페이지 작업이 동시에 발생하면서, 이 문제는 더더욱 가중됩니다.
Node.js의 특성상 웹서비스 개발이라는 기본 구조가 바뀌는 것은 아니기 때문이죠.
SPA형태로 만들면서 웹 트랜잭션을 추적하면서 모니터링을 해야 하는 시기는 사실상 실제 개발을 하고, 본격적인 서비스를 개시하는 시기부터 그 필요성에 대해서 느끼게 됩니다.
물론, 사용자의 속도와 사용성이 그렇게 중요하지 않다면, 위에서 나열한 해결 방법만으로도 어느 정도 해결은 가능합니다.