# 서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말함.
# 클라이언트 & 요청
클라이언트란 요청을 보내주는 주체로, 브라우저일 수도 있고, 데스크톱 프로그램일 수도 있고, 모바일 앱일 수도 있고, 다른 서버에 요청을 보내는 서버일 수도 있다.
# 서버 & 응답
응답은 컴퓨터에서 요청 받은 내용을 브라우저(클라이언트)에 띄어주는 역할.
웹이나 앱을 사용할 때 데이터(아이디, 비밀번호, 이메일 등)와 서비스의 데이터가 생성된다. 이 데이터를 어딘가에 저장하고, 그 어딘가에서 클라이언트로 데이터를 받아와야함. -> 이곳이 바로 서버.
서버라고 해서 요청에 대한 응답만 하는 것은 아니다. 다른 서버에 요청을 보낼 수도 있다. 이때는 요청을 보낸 서버가 클라이언트 역할 함.
# 노드는 자바스크립트 애플리케이션이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수도 있다. 다른 언어를 사용하지 않고 왜 굳이 노드를 사용해 서버를 만드는지 의문 들 수 있다. 노드의 특성을 알아보자
# 노드 특성
1. 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적(싱글 스레드)
2. 패키지의 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계
3. 자바스크립트 런타임. (기존에 자바스크립트 프로그램을 인터넷 브라우저 위에서만 실행할 수 있었음. 그걸 컴퓨터에서 실행할 수 있게 해주는 것)
4. 맨 위에서부터 한 줄씩 실행함.
1.1 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미함. 이벤트로는 클릭이나
네트워크 요청 등이 있을 수 있다.
이벤트 기반 방식으로 동작하므로 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출함. 발생한 이벤트가
없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기함.(이벤트 루프 이용).
이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할.
노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불림.
태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간. 콜백들이 이벤트 루프가 정한 순서대로
줄을 서 있으므로 콜백 큐라고도 함.
백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳.
이벤트 리스너 : 이벤트가 발생했을 때 그 처리를 담당하는 함수를 가리키며, 이벤트 핸들러라고도 . 지정된 타입의
이벤트가 특정 요소에 발생하면, 웹 브라우저는 그 요소에 등록된 이벤트 리스너를 실행시킴.
1.2 논블로킹 I/O
이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리 할 수 있다. 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저실행되게 하고, 그 함수가
다시 태스크 큐를 거쳐 호출 스택으로 올라오기를 기다리는 방식. 이 방식이 논블로킹 방식. 논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 의미.
1.3 싱글 스레드
스레드는 컴퓨터 작업을 처리할 수 있는 일손. 노드는 싱글 스레드이므로 주어진 작업을 혼자서 처리해야 함. 반대로 멀티 스레드인 시스템에서는 여러개의 스레드가 일을 나눠서 처리할 수 있다. 자바스크립트와 노드에서 논블로킹이 중요한 이유 바로 싱글 스레드이기 때문. 한 번에 한 가지 일 밖에 처리하지 못하므로 어떠한 작업에서 블로킹이 발생하면 다음 일을 처리하지 못함.
언뜻 보면 여러개의 일을 동시에 처리할 수 있기 때문에 멀티 스레드가 싱글 스레드보다 좋아 보임. 하지만 꼭 그런 것은 아님.
# 싱글 스레드와 멀티 스레드 차이
싱글 스레드 -> 점원 한명이 손님의 주문을 받아 주방에 넘기고, 주방에서 요리가 나오면 손님에게 서빙함.
여기서 블로킹 논블로킹을 적용하면,
블로킹은 손님 주문 받고 주방에 넘기고 주방에서 요리 나오고 손님에게 서빙 후에 또 다른 손님의 주문을 받음. (비효율적)
논블로킹은 손님 주문 받고 주방에 넘기고 주방에서 요리 하면서 손님에게 주문을 받고 요리 나오고
손님에게 서빙해줌. (효율적)
점원은 한명이지만, 혼자서 많은 일을 처리할 수 있다. 하지만 그 점원 한 명이 아파서 쓰러지거나 하면 큰 문제가 생길 수 있음. 또한 주문을 받거나
서빙을 하는 데 시간이 오래 걸린다면 주문이 많이 들어 왔을 때 버거울 수도 있다.
멀티 스레드 -> 손님이 올 때마다 점원이 한명씩 맡아 주문을 받고 서빙함. 언뜻 보면 싱글 스레드보다 좋은 방법인 것 같지만, 장단점이 있다.
일단 손님 한명당 점원도 한명이면 서빙 자체는 걱정이 없고, 점원 한명에게 문제가 생겨도 다른 점원으로 대체하면 되기 때문. 하지만 손님의 수가 늘어날수록 점원의 수도 늘어남.
손님 수가 줄어들었을 때 일을 하지 않고 노는 점원이 있다는 것도 문제가 됨. 점원을 새로 고용하거나 기존 직원을 해고하는 데 비용이 발생함.
3.1 런타임 뜻은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻함. 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해줌.
'개발 > node.js' 카테고리의 다른 글
[node] 환경변수 잡기 (0) | 2024.03.05 |
---|---|
[node] intellij express 프로젝트를 만들었는데, 프로젝트 안의 폴더가 안보일 시에 (0) | 2023.02.23 |
[node] app.js 해석 및 풀이 (프로젝트 생성 시 만들어지는 핵심 js) (0) | 2023.02.21 |
[node] Intellij Express Server 구축 방법 (0) | 2023.02.20 |
node.js 실행 할때 참고(node, typescript 등) (0) | 2022.11.25 |