참 오랜만에 글을 쓴다. 거의 두 달 만인거 같은데 수습기간때 정신 없기도 했고 집 구한다고 주말마다 돌아다니는 판국에 공부할 시간이 없었다. 이제 이사도 끝나고 정규직도 됐고 딱히 집에오면 할게 없기 때문에 개인 공부를 시작하려고 한다.
현재 업무는 C++을 사용하는 업무이기 때문에 업무에 도움이 되지는 않겠지만... 그쪽은 워낙 고여있기도 하고 학부 때 주구장창 C++만을 사용했기 때문에 Node 공부하는게 나을 것 같다고 판단했다. 회사에 나를 지도해줄 시니어 개발자가 없다는게 흠이긴 하지만... 그래도 혼자라도 계속 공부하는 개발자로 남고싶다. 회사 입사하고나서 개발공부보다 주식시장 법규나 제도 공부를 훨씬 많이했다. ㅠㅠ... 아직도 어렵다. 주식 왜케 어렵냐고!
공부는 Node.js 교과서 이책을 가지고 할 예정이다. 서점가서 여러책을 비교해봤는데 이게 제일 괜찮아보였다! 2020년 9월에 개정해서 새로운 판을 내기도 했고 무엇보다 전에 인턴할 때 봤던 엄청 똑똑하던 형이 보던 책이라 맘에 들었다...!! 잡설은 이만하고 정리 시작합니당~~ 틀린부분 지적은 환영입니다!
서버란?
서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램이다.
클라이언트란 요청을 보내는 주체로 브라우저, 데스크톱, 모바일 또는 다른 서버일 수 있다.
서버의 역할
예를 들어 네이버를 방문한다고 생각해보면 주소창에 https://www.naver.com을 입력(요청)을 한다. 브라우저는 주소에 해당하는 컴퓨터(서버)의 위치를 파악한 후 페이지를 받아와서 브라우저(클라이언트)에 띄웁니다.(응답)
모바일 앱의 경우 플레이스토어나 애플 스토어에서 설치버튼(요청)을 누르면 다운로드(응답)이 시작됩니다. 이 때는 사용자의 모바일기기가 클라이언트 구글과 애플이 서버입니다.
서버라고 해서 응답만 하는 것은 아니고 다른 서버에 요청을 보내기도 합니다. 이때는 요청을 보낸 서버가 클라이언트의 역할을 하는 것입니다.
노드는 자바스크립트 프로그램이 서버 역할을 수행하게 할 수 있다. 굳이 노드를 사용해서 서버를 만드는 이유를 알려면 노드의 특성을 알아야 한다.
자바스크립트 런타임
노드는 자바스크립트 런타임입니다. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 말한다.
노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해주는 자바스크립트 실행기라고 보면 된다.
기존에는 자바스크립트 프로그램을 웹브라우저 위에서만 사용할 수 있었지만 이제 크롬을 시작으로 자바스크립트 런타임을 내장하고 있어 자바스크립트 프로그램을 실행할 수 있다.
노드는 V8과 더불어 libuv라이브러리를 사용한다. 이 둘은 C와 C++로 구현되어 있다.
libuv 라이브러리는 노드의 특성인 이벤트 기반, Non-blocking I/O를 구현하고 있다.
이벤트 기반(Event-Driven)
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. 클릭이나 네트워크 요청등이 있다.
이 시스템에서는 특정 이벤트가 발생할 때 어떤 동작을 할지 미리 등록해 두어야 하는데 이를 Event Listener에 Callback함수를 등록한다고 표현한다.
노드도 이벤트 기반 방식으로 동작하므로, 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백함수를 호출한다. 발생한 이벤트가 업석나 이벤트를 다 처리하면 다음 이벤트 발생까지 대기한다.
이벤트 루프(Event Loop)
이벤트 기반 모델에서는 이벤트 루프 개념이 등장한다. 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할지를 판단하는 역할을 한다. 여러 이벤트가 동시에 발생했을 떄 어떤 순서로 콜백함수를 호출할지 판단하는 개념이다.
노드는 함수 호출 부분을 발견하면 호출 스택에 함수를 넣는데 쌓고 실행한다.
백그라운드(Background)
setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳.
자바스크립트로 작성되어있지 않음
여러 작업이 동시에 수행될 수 있음
태스크 큐(Task Queue)
이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너들의 콜백함수들을 보냄
정해진 순서대로 콜백들이 줄을 서 있어 콜백 큐라고도 부름
논 블로킹I/O
이전 작업이 완료될 떄까지 대기하지 않고 다음 작업을 수행하는 것
블로킹은 이전 작업이 끝나야만 다음 작업을 수행
논블로킹이 블로킹보다 같은 작업을 더 짧은 시간에 처리할 수 있으나 동시에 처리해도 되는 일만 처리해야 함
노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리하곤 하기 때문에 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약할 수 있음
싱글스레드
노드는 싱글 스레드이기 때문에 코드가 동시에 실행될 수 없다고 알려짐
엄밀히 말하자면 싱글 스레드가 아니라 사용자가 직접 제어할 수 있는 스레드가 한개임
자주 공부해야하는데 요즘 회사 끝나고 운동하고 고양이 놀아주면 바로 기절을 해버려서....
일단 사내 스터디에 들어가긴 햇는데 얼마나 더 짬을 내서 공부할 수 있을지는 모르겠다. 5월부터는 본격적으로 바빠지기 시작할 것 같아서 야근이 있을 수도 있고 ㅠ.ㅠ 암튼 그래도 힘내서 공부해야지
댓글 영역