Node의 정의
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드 된 자바스크립트 런타임입니다.
node는 서버도 아니고 JS엔진도 아니다.
JS엔진을 사용 한 JS런타임이다. (런타임 : 프로그램이 실행되는 환경)
JS는 원래 브라우저다.
노드 없었을 땐 JS는 원래 브라우저다.
HTML에다가 스크립트,소스 등을 넣었다. 그럼 같이 읽었다 즉
HTML이 없으면 JS를 못읽었다.(HTML에 종속되어 있다.)
node.js를 쓰면 HTML이나 브라우저의 종속성에서 벗어난 것이다.
브라우저,HTML이 없어도 실행할 수 있는 환경인 것이다.
이게 왜 중요한가?
JS가 app,게임 등 다양한 환경에서 만들 수 있다는 것이다.
노드는 서버 아닌가요?
엄밀히 말하면 서버가 아니라 서버로 쓸 수 있는 런타임이다.
자바로 치면 JRE : 런타임 | JDK : 노드 | JAVA : JS
ts도 실행하려면 런타임이 있어야겠지.
ts 런타임은 디노라고 있다.
노드의 내부구조
내부 구조는 c++로 만들었다고 한다.
노드의 특징
크게 두가지를 꼽자면 이벤트기반,논블로킹IO가 있는데
이벤트 기반 : 이벤트를 발생시켜 동작하는 것
- 이벤트 발생: 클라이언트가 서버에 데이터를 요청한다.
- 이벤트 리스너: "요청이 들어오면 뭘 해야겠다"라고 미리 적어둔 이벤트 핸들러가 작동한다.
- 이벤트 처리: 요청에 맞는 작업(예: 데이터베이스 조회)을 수행하고, 결과를 응답으로 보낸다.
Non-blocking I/O
I/O는 인풋과 아웃풋이다.
인풋과 아웃풋을 막지 않는다? 그럼 막는건 뭐지?
블로킹 I/O에 대해 먼저 알아봤다.
예를 들어 비동기 처리하는 동작이 10초 걸린다고 치자.(이 동작을 A라고 칭하겠다.)
메인쓰레드는 하나씩 처리할 수 있는데 중간에 A가 껴있으면 10초동안 멈춰야 한다.
그럼 사용자는 결과를 10초+다른 일처리시간까지 걸리는 것이다!
상당히 비효율적이다.
그래서 노드는 비동기 작업을 지원한다.
즉, 비동기 처리를 사용하여 blocking을 하지 않는다는 것이다.
동기는 코드가 순서대로 실행 , 비동기는 코드가 순서대로 실행되지 않을 수도 있다는 특징이 있다.
비동기 + 논블로킹이 "동시에 돌아간다"고 생각하는데 이건 매우 힘든 일이다.
사실 메인쓰레드가 아닌 백그라운드에서 돌아가는 것이다.
프로세스와 쓰레드
기본적으로 프로그램 하나(크롬) 띄울 때마다 프로세스가 하나씩 띄워진다고 생각하면 된다. (프로세스)
이 안에 작은 탭들 (쓰레드)
근데 사실 노드는 싱글쓰레드가 아니다.
프로세스 안에 몇개 쓰레드가 뜨는데 우리가 컨트롤 할 수 있는 건 딱 하나이기 때문에
그래서 싱글스레드라고 표현한다. 사실 멀티 쓰레드다.
노드14버전부턴 원한다면 멀티쓰레드를 할 수 있다. 왜 이게 좋냐면
원하면 뭐 두개씩 쓸 수 있는 거다. 인스타하는 중에 페이스북 알람 받기 이런 것이 대표적이다.
어 그럼 왜 노드는 싱글로 썼나요?
멀티쓰레딩 하는게 상당히 어려워서 그렇다. -> 노드14버전부턴 가능성을 열어줬는데 많이 쓰진 않았다.
그래서 타협 방식이 주문만 받고 요리가 완료되면 말해주기 (비동기처리)
근데 이 경우에 주방/점원이 번아웃이 올 수 있으니 멀티 프로세싱이 등장했다. (음식점 체인점을 내는거다.)
멀티스레드는 너무 어려워서 추가해준거지 멀티쓰레드를 주로 쓰라고 한 게 아니다.
실무에서 쓸 일이 거의 없을 거라 한다.
그럼 멀티쓰레드는 쓸 일이 없을까요?
아니다. CPU작업이 빡센 일을 시킬 때 쓰면 유용하다.
ex) 이미지 리사이징,암호화
이런 진상들 때문에 멀티쓰레드를 열어준거다.
서버규모가 커지면 사실 자바든 뭐든 힘들어한다는 것도 기억하면 좋을 거 같다.
(참고로 노드는 js뿐 아니라 파이썬 같은 것도 불러올 수 있다.)
'Back-End > Node.js' 카테고리의 다른 글
Node.js 교과서 PART2 (1) (0) | 2025.01.19 |
---|---|
다시 시작하는 Node.js, 새로 시작하는 CS (0) | 2025.01.11 |
TodoList(Node.js) (0) | 2024.11.02 |
새로운 프로젝트 시작 (4) | 2024.10.09 |