- 웹 서버는 HTTP를 이용하여 인터네 상에서 클라이언트의 요청을 처리하고 응답해주는 컴퓨터 또는 프로그램.
- 웹 서버는 클라리언트의 HTTP 요청을 받아 정적인 콘텐츠를 제공
- 필요한 경우 클라이언트의 요청을 웹 어플리케이션 서버(WAS)로 전달하여 처리할 수 있다.
- 웹 서버의 주요 업무는 복잡한 비즈니스 로직 수행보다는 요청된 콘텐츠나 데이터를 빠르게 반환하는 것
- 대표적인 웹 서버: Apache, Nginx
- 웹 서버와 협력하여 동적인 컨텐츠 제공
- 주로 데이터베이스 조회, 복잡한 계사노가 같은 비즈니스 로직 처리
- 클라이언트의 요청을 웹 서버로부터 전달 받아 처리, 결과를 다시 웹 서버에 반환.
- 정적인 데이터만 전달하는 웹 서버에 비해 처리 시간이 길어질 수 있음.
- 콘텐츠 생성이나 데이터베이스와의 상호작용이 필요할 때 주로 사용
- 사용자는 브라우저를 통해 HTTP request로 웹사이트를 웹 서버에 요청. 웹 서버는 HTTP request를 통해 웹사이트 데이터를 브라우저에 전송. 마지막으로 브라우저는 서버에서 받아온 데이터를 웹사이트 브라우저에 그려냄
- 기본적으로 브라우저가 웹 서버에 요청할 때는 주로 GET Method로 요청. POST, PUT, DELETE와 같은 다른 HTTP 요청 메서드도 존재하며 이들은 서버에 다른 타입의 요청을 보낼 때 사용됨.
Chrome V8 엔진으로 빌드된 JavaScript 런타임. 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적이다. Node.js 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 하다.
JS를 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경으로, 코어 라이브러리와 V8엔진, libuv라는 라이브러리를 통해 가능하다.
블로킹 방식은 프로그램이 특정 작업을 수행하는 동안 다른 작업을 중단시키는 방식이다.
반면에 논 블로킹 방식은 프로그램이 여러 작업을 동시에 처리할 수 있는 장점이 있다.
싱글 스레드는 스레드 하나를 사용하여 동시에 하나의 작업만을 처리.
여기서 스레드란 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위로, 여러 스레드를 사용하면 여러 작업을 동시에 처리할 수 있다. 그러나 이는 복잡성을 증가시키고 리소스를 더욱 많이 소모하게 한다.
호출 스택은 함수의 실행 순서를 추적하는 자료구조이다.
이벤트 루프는 여러 이벤트들과 같은 비동기 작업들을 모아서 관리하고 어떤 순서로 실행해야하는지 도와주는 도구이다.
function firstFunction() {
console.log('firstFunction 입니다.');
secondFunction();
}
function secondFunction() {
// 2 초간 기다린다.
setTimeout(function () {
console.log('secondFunction 입니다.');
}, 2000);
}
firstFunction();
console.log('전역 코드 실행 중!');
// print: firstFunction 입니다.
// print: 전역 코드 실행 중!
/** 2 초간 기다린다. **/
// print: secondFunction 입니다.
firstFunction은 호출 스택에 추가되고 실행되며 'firstFunction 입니다.'를 콘솔에 출력하고 secondFunction을 호출. 그 다음 secondFunction을 호출 스택에 추가하여 setTimeout 함수를 실행.
setTimeout은 비동기 함수이므로, JS는 이 작업을 이벤트 큐에 넣고 secondFunction을 호출 스택에서 제거.
그 다음 firstFunction도 호출 스택에서 제거하고, ‘전역 코드 실행 중!’을 콘솔에 출력.
2초 후, ‘secondFunction 입니다.’를 출력하는 작업이 이벤트 큐에서 호출 스택으로 이동하고 실행된다. 이때 호출 스택은 비어있기 때문에 이벤트 루프가 이 작업을 호출 스택으로 이동시킬 수 있었다.
Node.js에서 코드르이 재사용성을 높이기 위해 작성된 독립적인 코드 조각을 모듈이라 부른다.
이러한 모듈을 npm이나 yarn과 같은 패키지 매니저를 통해 업로드하여 다른 개발자들과 공유할 때, 이를 패키지라고 한다.
글로벌 환경에서 yarn을 설치한다.
# npm을 이용하여 전역 환경에 Yarn을 설치합니다!
npm install -g yarn
설치가 완료되었는지 확인하기 위해 yarn -v
명령어로 확인한다.
yarn itit
# package.json
{
"name": "package-manager",
"version": "1.0.0",
"main": "index.js",
"license": "MIT"
}
yarn add [패키지 명]
yarn add express
는 express
패키지 하나를 설치할 수 있다. 띄어쓰기로 구분하여 여러개의 패키지를 한 번에 설치하는 것도 가능하다.yarn add express mongoose jest
yarn add
명령어를 통해 설치된 패키지들이 저장되는 폴더이다.yarn
명령어가 입력되면 yarn.lock 파일과 package.json 파일을 기반으로 필요한 패키지를 설치한다.dependencies와 devDependencies
dependencies
yarn add [패키지명]
명령어를 통해 설치한 패키지들이 나열되는 곳- 프로젝트 실행과 배포(Deploy) 시 필수적으로 필요한 패키지의 이름과 버전 표시
devDependencies
yarn add -D [패키지 명]
명령어를 통해 설치한 패키지들이 나열되는 곳- 개발 또는 빌드(Build) 단계에서 필요한 패키지들을 설치할 경우 이곳에 포함된다.
- 빌드 단계: 테스트 코드 실행이나, TypeScript를 JavaScript로 변경하는 단계
명령어 | npm | yarn |
---|---|---|
dependencies 설치 | npm install | yarn |
패키지 설치 | npm install [패키지명] | yarn add [패키지명] |
dev 패키지 설치 | npm install --save-dev [패키지명] | yarn add --dev [패키지명] |
global 패키지 설치 | npm install --global [패키지명] | yarn global add [패키지명] |
패키지 제거 | npm uninstall [패키지명] | yarn remove [패키지명] |
dev 패키지 제거 | npm uninstall --save-dev [패키지명] | yarn remove [패키지명] |
global 패키지 제거 | npm uninstall --global [패키지명] | yarn global remove [패키지명] |
업데이트 | npm update | yarn upgrade |
패키지 업데이트 | npm update [패키지명] | yarn upgrade [패키지명] |
웹 프레임워크란 프로그래밍의 특정 부분을 추상화하여, 개발자가 더 높은 수준에서 프로그램을 작성할 수 있게 도와주는 도구이다.
Express.js의 가장 큰 특징 중 하나는 미들웨어를 지원이다. 미들웨어는 사용자의 요청과 응답사이에 위치하여 특정 기능을 수행한다.
app.js
파일을 생성한다.yarn init -y
뒤의
-y
는yarn init
명령 실행 시 프로젝트명이나 버전 등을 물어보지 않고 기본값으로 알아서 설정해주는 옵션이다.
{
"name": "spa-shop",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module"
}
yarn add express
// app.js
import express from 'express';
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(PORT, () => {
console.log(PORT, '포트로 서버가 열렸어요!');
});
node app.js