• 로그인
  • 장바구니에 상품이 없습니다.

Nodejs의 장점이 뭐냐면

 

0:00 Node.js가 뭐냐면 

1:52 장점 

 

 

 

웹서버를 만들고 싶으면 여러 언어와 프레임워크가 있는데

이 중에 자바스크립트 기반의 Node.js를 사용하는 사람들이 많습니다. 

일단 쉽고 성능도 어느정도 나와서 많이 쓰는 것도 있고 

(Bun이나 Fastify 사용시 Rust, Go로 만든 서버와 성능이 삐까뜨는 벤치마크도 많습니다)

non-blocking I/O, 비동기처리가 가능하다는 장점이 있어서 쓴다고 하는데 그게 대체 무슨 뜻인지 알아봅시다. 

 

 

 

 

Node.js가 뭐냐면

 

자바스크립트라는 언어가 있습니다.

실은 서버만들고 그런 용도는 아니고 

html 웹페이지에 여러가지 기능을 넣기 위해 만들어진 언어입니다.

그래서 비유하자면 html 따까리 언어가 자바스크립트임 

 

근데 자바스크립트를 짜놨으면 이걸 누가 실행해줘야하지않겠습니까

실은 여러분들이 짠 자바스크립트는 누가 실행하냐면 웹브라우저가 책임지고 실행해줍니다. 

 

크롬브라우저안에도 자바스크립트 실행엔진이 있습니다. 

구글이 V8이라고 이름을 지어놨는데

이걸 하도 성능좋게 잘 만들어서

이걸 자랑삼아서 똑 떼어서 독립적인 실행파일로 출시했는데 이걸 Node.js라고 부릅니다. 

그래서 Node.js는 자바스크립트 파일 실행기일 뿐입니다. 

이거 설치하면 컴퓨터 아무데서나 자바스크립트로 작성한 파일을 실행할 수 있습니다.

(멋있는 말로 Node.js를 자바스크립트 런타임이라고 부름)

 

 

그래서 Node.js만 쓰면 코드에디터, 윈도우 프로그램 이런 온갖 프로그램을 만들 수 있다보니까

사람들이 Nodejs로 웹서버도 만들기 시작한 겁니다. 

그런데 특유의 간결한 문법과 성능 덕분에 인기가 아직 많습니다.

 

그리고 웹개발할 때 프론트엔드에서 자바스크립트를 꼭 사용하기 때문에

프론트엔드 할 줄 알면 Node.js로 백엔드 서버개발도 매우 쉽게 배울 수 있다는 것도 장점입니다. 

언어 하나로 프론트엔드랑 백엔드 전부 작성가능 

 

 

 

 

 

Non-blocking I/O

 

왜 성능이 좋은지 잠깐 짚고 넘어가봅시다. 

Node.js는 non-blocking 이라는 장점 덕분에 보다 빠릿빠릿한 웹서버를 만들 수 있는데

예를 들어 지금부터 영화예매 서비스를 하나 만든다고 합시다.

 

 

어떻게 코드짜냐면 

1. 누가 영화예매 요청을 하면

2. 영화를 예매해서 결과를 유저에게 보내주는 프로그램을 하나 만들기 

끝입니다. 

 

 

 

근데 Node.js 말고 파이썬 자바스프링 같은거 대충 써서 일반방식으로 서버를 만들어놓으면 어떤 일이 일어나냐면 

기본적으로 먼저 온 순서대로 차례차례 예매 요청을 처리해줍니다.

거의 모든 프로그래밍 언어는 차례로 한 줄 한 줄 실행되기 때문에

영화예매 서비스를 만들어도 기본적으로 그렇게 동작합니다.

 

 

 

근데 이렇게 하면 문제가 있습니다. 

예를 들어 영화표 발급해주는데 1초 걸리는데

200장을 예매하는 미친놈이 있으면 어떻게 되죠? 

이놈 처리하는데 200초가 소요되겠군요.

 

근데 이러면 뒤에 있던 고객도 200초를 대기해야하는 불상사가 일어납니다.  

그래서 서버 대충만들면 중간중간 어려운 요청이 들어오면 서버 기능이 전체적으로 느려질 수 있습니다. 

 

 

근데 Node.js를 사용해서 서버를 만들어놓은 경우 어떤 식으로 처리를 해주냐면 

1. 우선 유저들이 들어오면 요청부터 전부 받습니다 

2. 그 다음에 빨리빨리 처리가 완료되는 순서대로 유저에게 결과를 보내줍니다.

그래서 늦게온 유저도 1장만 예매한다면 빨리빨리 결과를 받아볼 수 있는 겁니다. 

200개 예매하던 미친놈은 똑같이 200초 후에 받아보면 되는거고요. 

 

이런식으로 요청들을 처리해주는걸 멋진말로 non-blocking, 비동기 처리라고 합니다. 

중간에 시간이 오래걸리는 작업을 만나면 그걸 잠깐 제껴두고 다른거부터 우선 처리한다는 소리입니다. 

 

 

 

 

물론 정확히 말하면 

Node.js 안에서 비동기처리를 지원하는 코드를 작성해야 이런 식으로 효율적인 처리를 매우 쉽게 구현할 수 있는건데

대부분의 코드가 비동기처리를 지원하는 코드기 때문에 그냥 기본으로 저렇게 동작하는구나라고 생각해도 됩니다. 

참고로 파일입출력, DB입출력 이런거 전부 비동기처리가 매우 쉽습니다. 

 

 

 

 

서버 확장하면 되는거 아님?

 

물론 고객이 많으면

1. 창구 갯수 (thread)를 늘리거나

2. 창구 처리속도를 늘리거나 (CPU를 업그레이드) 하는 식으로도 대응가능합니다.

 

근데 thread를 늘린다고 하면 

많은 창구에서 데이터를 동시에 가져다쓰고 수정하고 삭제하고 그럴텐데

그럼 데이터의 정확도가 떨어질 수도 있습니다.  

정확도 떨어지는걸 막기 위해 락을 걸면 또 그만큼 처리속도가 늦어질 수도 있고요.

그런 문제가 발생할 수도 있기 때문에 비동기식 처리를 하려고 온갖 노력을 하는 웹서버들이 많은데

Node.js 쓰면 기본이 비동기처리임 

 

 

 

 

 

Node.js 단점

 

CPU를 많이 갈궈야하는

- 이미지변환

- 동영상압축

- 숫자계산

이런 작업이 많이 들어가야하면 관련 라이브러리같은것도 적고 싱글스레드라 성능도 좋지 않을 수 있어서 

그런 기능이 필요하면 Node.js는 별로일 수 있는데

그래서 비교적 가벼운 요청을 많이 처리해야하는 SNS, 게시판 같은거 만들 때 좋다는 인식이 있습니다. 

하지만 무거운 작업이 필요하면 별도의 스레드에서 처리하도록 코드 짤 수는 있어서 큰 문제는 아닐 수 있습니다.

 

Node.js는 싱글스레드에서 동작해서 코어와 스레드가 여러개 달린 CPU를 비효율적으로 사용한다고 알려져 있는데

실은 맞긴 합니다만

내부적으로는 파일입출력이나 가비지 컬렉션같은 부가작업 할 때는 스레드를 여러개 알아서 사용해줍니다.

아니면 맘에 안들면 cluster 기본 라이브러리 같은걸로 서버하나를 여러 스레드로 운영하게 만들 수도 있습니다.

 

자바스크립트에 원래 타입시스템이 없어서

타입관련 버그들 많다고 싫어하는 사람들도 있었는데

지금은 타입스크립트 쓸 수 있어서 별 걱정 안해도 됩니다. 

 

 

 

 

 

 

 

 

 

SEE ALL Add a note
YOU
Add your Comment

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠