웹서버를 만들고 싶으면 여러 언어와 프레임워크가 있는데
이 중에 자바스크립트 기반의 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 기본 라이브러리 같은걸로 서버하나를 여러 스레드로 운영하게 만들 수도 있습니다.
자바스크립트에 원래 타입시스템이 없어서
타입관련 버그들 많다고 싫어하는 사람들도 있었는데
지금은 타입스크립트 쓸 수 있어서 별 걱정 안해도 됩니다.
개발환경 셋팅
1. nodejs 구글에 검색, LTS 버전 다운받아서 설치까지 합시다.
- 설치할 때 경로같은건 안만지는게 좋을 수도 있습니다.
- 윈도우는 chocolatey 같은거 설치안해도 됩니다.
2. 에디터는 VSCode 에디터
프로젝트 생성은
1. 코드짤 작업용 폴더를 하나 만들고
VSCode 에디터 켜서 상단 file - open folder 눌러서 에디터로 작업용 폴더를 오픈합시다.
(윈도우의 경우 작업 폴더는 onedrive 이런 폴더 안에 만들면 안됩니다)
2. server.js 파일을 하나 만들어줍시다.
거기다가 서버코드짤 것임
3. 에디터 상단 terminal 눌러서 터미널을 열 수 있는데
거기다가 npm init -y 를 입력합시다.
package.json 파일 생성해주는 명령어입니다.
4. 터미널에 npm install express를 입력합시다.
express라는 라이브러리를 설치하는 명령어입니다.
처음부터 쌩으로 코드짜면 너무 힘들기 때문에
사람들 많이 쓰는 express라는 라이브러리를 써서 서버를 만들 것임
5. server.js 파일안에 서버코드 작성
const express = require('express')
const app = express()
app.listen(8080, () => {
console.log('http://localhost:8080 에서 서버 실행중')
})
app.get('/', (요청, 응답) => {
응답.send('반갑다')
})
이제 express 라이브러리를 이용해서 쉽게 서버를 만들어볼 수 있습니다.
대충 설명하자면
- 맨 위의 2줄은 설치한 라이브러리 불러오는 코드고
- app.listen() 부분이 실제 서버 띄우라는 뜻입니다. 8080포트에 띄우라고 코드짰습니다.
- app.get() 부분은 누군가 내 사이트 메인페이지 접속하면 '반갑다'라는 글자를 보내라는 뜻입니다.
6. 코드짠걸 실행해봅시다.
http://localhost:8080으로 접속해봅시다.
PORT가 뭐냐면
여러분 컴퓨터는 항상 외부 컴퓨터와 통신할 수 있게 설계되어있습니다.
랜선만 꽂혀있으면 다른 사람이 여러분 컴퓨터로 접속을 할 수 있고 그렇습니다.
웹서버도 실은 다른 사람 컴퓨터에 접속하는 행위랑 똑같습니다. 접속하면 웹페이지를 보여주는 것일 뿐
하지만 평상시엔 남들이 내 컴퓨터에 무단으로 접속을 할 수는 없습니다.
여러분들이 컴퓨터에 구멍을 하나 뚫어놓아야 거기로 외부 사람들이 내 컴퓨터로 접속할 수 있습니다
구멍을 전문용어로 PORT라고 부르고 컴퓨터에는 내 맘대로 오픈할 수 있는 포트 구멍이 6만개 정도 있습니다.
그래서 아까 누가 내 컴퓨터에 접속할 수 있게 만들기 위해서
8080번째 포트하나를 맘대로 연겁니다.
이제 외부 컴퓨터가 여러분 아이피주소:8080이라고 브라우저 주소창에 입력하면
여러분 컴퓨터로 들어올 수 있게 되는 것입니다.
(터미널에 ipconfig 치면 뜨는 그 아이피주소임)
참고로 열 수 있는 포트는 6만개 정도 있는데
컴퓨터가 이미 예약해서 쓰고 있는 포트번호들도 여러개 있습니다.
그런건 쓰면 안됩니다.
터미널에서 npm으로 하는게 뭔가 안되면
Q. node server.js 터미널에 입력해도 반응이 없음
- 파일저장했나 확인합시다.
- 프로젝트 폴더경로상에 한글이 있으면 그걸 피해봅시다. C드라이브 바로 밑에 폴더 만드는 식으로요
Q. npm : command not found 에러
nodejs 설치가 이상해서 그럴 수 있기 때문에
nodejs 삭제했다가 공식 홈페이지에서 LTS버전 제대로 다운받아서 설치합시다.
맥도 brew 어쩌구 그런걸로 설치하지 마시고 다운받읍시다.
Q. 맥북에서 권한, permission이 없다 어쩌구 에러
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
폴더 수정 권한이 없다고 에러를 띄우는 것입니다.
위의 에러는 /usr/local/lib/node_modules 라는 폴더에 수정권한을 주면 됩니다.
sudo chown -R $USER 위에 에러 뜬 경로
터미널에 이거 입력해봅시다.
sudo npm install express
그래도 안되면 npm으로 뭔가 할 때 그냥 sudo라는 단어를 앞에 붙여서 실행합시다.
맥북 비번 입력하라고 하면 입력합시다.
Q. 윈도우 Powershell에서 빨간글씨로 허가되지않은 스크립트, 보안오류가 뜸
시작 - 검색 - Powershell 검색 - 우클릭 - 관리자 권한으로 실행한 뒤
Set-ExecutionPolicy Unrestricted 라고 입력해보고
에디터 껐다 켭시다.
Q. 윈도우도 npm으로 뭐 할때 권한이 없다 어쩌구 에러
그럼 powershell을 관리자 권한으로 열어서 실행하면 됩니다.
▲ 직접 작업폴더로 들어가서 상단에서 파일 - PowerShell 열기 - 관리자권한으로 PowerShell 열기 눌러서 터미널을 엽니다.
이렇게 연 다음에 npm install 어쩌구가 되면 앞으로 터미널에서 뭐 하라고 하면 터미널 이렇게 켜서 사용합시다.
이거 말고도 다른 에러가 있을 수 있어서
에러메세지는 직접 구글 검색해보는게 빠릅니다.
터미널에서 npm init -y 를 했는데
이 오류는 PowerShell 실행 정책(Execution Policy) 때문에 발생하는 문제야. Windows에서는 보안상의 이유로 일부 스크립트 실행을 제한하는데, npm.ps1 같은 PowerShell 스크립트가 차단된 거야.
해결 방법
1️⃣ PowerShell 대신 CMD(명령 프롬프트)에서 실행하기
- Win + R 누르고 cmd 입력 후 엔터
- 다시 npm init -y 실행
👉 CMD에서는 실행 정책이 적용되지 않아서 이 방법이 가장 간단해!
2️⃣ PowerShell 실행 정책 변경하기 (안전한 방법)
2-1) 현재 실행 정책 확인
보통 Restricted 또는 RemoteSigned일 거야.
2-2) 실행 정책을 일시적으로 변경해서 실행
이렇게 하면 현재 PowerShell 세션에서만 정책이 변경돼.
다시 npm init -y 실행해 보고, 완료되면 터미널을 닫으면 원래 설정으로 돌아와!
PowerShell은 Windows에 기본적으로 설치되어 있어! 실행하는 방법은 여러 가지가 있어.
1️⃣ Win + X 메뉴에서 실행 (가장 빠름)
- Win + X 키를 누름
- "Windows 터미널(관리자)" 또는 "Windows PowerShell(관리자)" 클릭
- 실행 후 명령어 입력
2️⃣ 실행 창에서 실행
- Win + R 누르고
- powershell 입력 후 엔터
👉 이렇게 하면 일반 사용자 권한으로 실행돼!
3️⃣ 검색해서 실행
- Win + S 누르고
- PowerShell 검색
- "관리자 권한으로 실행" 클릭하면 더 많은 작업 가능!
✅ 관리자 권한으로 실행해야 실행 정책을 변경할 수 있어!
관리자 권한이 필요하면 "Windows PowerShell(관리자)" 로 실행하는 걸 추천해!
위와 같은 방법으로 해결하였다 ! 항상 프로그램설치에는 어려움이 따르는것 같다
'Node.js, MongoDB' 카테고리의 다른 글
MongoDB 호스팅받고 셋팅하기 (1) | 2025.02.28 |
---|---|
웹페이지에 디자인 넣으려면 (0) | 2025.02.27 |
웹페이지 보내주려면 (라우팅) (3) | 2025.02.27 |