Node.js란
Node.js는 자바스크립트를 스크립트 언어 이상으로 프로그래밍 언어 역할을 할 수 있도록 지원하는 플랫폼이다. node.js를 이용해서 자바스크립트로 백엔드를 구현할 수 있으며, 대부분의 자바스크립트를 실행할 수 있게 해주는 엔진이다.
공식 홈페이지에서는 "V8 JavaScript엔진으로 빌드된 JavaScript 런타임"이라고 나와있다.
stackoverflow에서는 1번째로 많이 사용되는 프레임 워크라고 한다.
node.js를 사용하는 곳으로는 넷플릭스, 에어비앤비, 링크드인, NASA가 있다.
싱글 스레드: 한 개의 스레드에서 모든 작업을 처리한다. => 요리사가 한명
이벤트 루프 기반: 비동기적으로 작업을 처리함 => 주문이 들어와야만 일함
논블로킹 I/O: I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리함 => 한명이 일하는데, 노련해서 라면 1개 물 올려놓고, 볶음밥 함

스프링과 비교
1. 멀티 스레드: 각 요청을 별도의 스레드에서 처리한다.
- 장점: CPU 집약적인 작업 처리에 유리, 멀티코어 활용
- 단점: 스레드 관리가 복잡할 수 있으며, 메모리 소비가 많을 수 있음
- 동기적 처리, 비동기 지원: 기본적으로 동기적으로 요청을 처리하고, 비동기 작업을 지원한다.
- 장점: 동기적 작업은 직관적이고, 비동기 작업은 @Async와 CompletableFuture 등을 통해 추가할 수 있다.
- 단점: 비동기 처리를 위해 추가적인 설정이 필요하며, 복잡한 구조가 될 수 있음
- 블로킹 I/O, 논블로킹 I/O 지원: 기본적으로 블로킹 I/O 방식을 사용하고, Spring WebFlux 등을 통해 논블로킹 I/O를 사용할 수 있다.
- 장점: 비동기 I/O 처리가 가능하면 높은 확장성을 제공
- 단점: 기본적으로 블로킹 I/O에 의존하기 때문에, I/O 작업이 많은 애플리케이션에서는 성능에 제한이 있을 수 있음
모듈은 애플리케이션에서 재사용 가능한 코드 덩어리로, 특정 기능이나 작업을 수행하는 파일이다.
이러한 모듈은 코드의 구조화와 재사용성을 높이는데 중요한 역할을 한다.
크게 내장모듈과 사용자 정의 모듈, 외부 라이브러리 모듈로 나눌 수 있다.
내장 모듈은 node.js의 핵심적인 기능을 제공하는데 사용된다.
대표적인 내장 모듈은 다음과 같다.
개발자가 애플리케이션의 요구 사항에 맞게 직접 작성한 모듈이다. node.js는 개발자가 원하는 대로 모듈을 정의하여 애플리케이션에서 재사용할 수 있도록 지원한다. 사용자 정의 모듈을 불러올 때는 require()를 통해 불러올 수 있다.
만드는 방법은 다음과 같다.
// math.js
const add = (a,b) => a+b;
const subtract = (a,b) => a-b;
// 내보내기
module.exports = {add,subtract}
//불러오기
const math = require('./math');
const sum = math.add(5,3);
const diff = math.subtract(5,3);
console.log(sum) // 8
console.log(diff) // 2;
라이브러리는 여러 개의 모듈이 모여서 특정 작업을 효율적으로 처리할 수 있도록 미리 작성된 코드의 집합이다. 개발자는 라이브러리를 통해 복잡한 작업을 직접 구현하지 않고, 필요한 기능만을 선택적으로 사용할 수 있다. 즉, 라이브러리가 도서관이라는 뜻 처럼 모듈을 책을 빌리듯이 내가 필요한 것을 골라내어 사용할 수 있다는 말과 같다.
Node.js에서 사용하는 기본적인 패키지 관리 도구로 외부 라이브러리나 모듈을 설치하고 관리하는데 사용된다. npm 사이트에 들어가서 라이브러리를 검색하여 찾고자 하는 라이브러리가 존재하는지를 찾아볼 수 있다.
1. 모듈 설치: 외부 라이브러리나 패키지 설치
npm install <패키지명>
npm i <패키지명>
package.json파일을 생성할 수 있다. 이파일은 프로젝트에 필요한 의존성과 설정 정보를 포함한다.(버전같은게 들어있다.)npm init
npm update <패키지명>
npm uninstall <패키지명>
package.json파일에 의존성이 기족되므로, 이를 통해 팀원과 동일한 환경에서 작업할 수 있도록 도와준다.package.json에 정의된 스크립트를 실행할 수 있도록 도와준다. 대표적으로 빌드, 테스트, 서버시작 등을 쉡게 실행할 수 있도록 해준다.npm run <스크립트명>
package.json 와 package-lock.json 및 추가설명
install -g <패키지명>
라이브러리를 설치할때 다음과 같은 명령어로 되어있을 텐데, 이는 글로벌의 약자로 내 컴퓨터에 있는 모든 프로젝트에 해당 패키지를 다운로드 하는것이므로 되도록이면 빼고 설치하는것을 권장함- package.json
npm을 이용해서 다운받은 라이브러리를 표시해줌
- package-lock.json
package.json에 기록된 버전을 더욱 정확하게 기록한 파일이다.
아스키코드로 아트를 할때 사용하는 라이브러리이다.
npm install figlet
var figlet = require("figlet");
figlet("Hello World!!", function (err, data) {
if (err) {
console.log("Something went wrong...");
console.dir(err);
return;
}
console.log(data);
});
3.이를 실행해 보면
_ _ _ _ __ __ _ _ _ _
| | | | ___| | | ___ \ \ / /__ _ __| | __| | | |
| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | | |
| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|_|
|_| |_|\___|_|_|\___/ \_/\_/ \___/|_| |_|\__,_(_|_)
콜백함수
콜백 함수는 함수의 매개변수로 변수 또는 값을 전달하는 것이 아니라, 함수를 전달하는 것을 말한다.figlet의 사용예제
figlet의 사용예제를 보면 figlet함수를 불러와서 앞에는 텍스트를, 뒤에는 function을 사용하는걸 볼 수 있다. 이때 익명함수를 쓰는것은 다시 쓰이지 않기 때문이다.
이렇게 되면 figlet은 Hellow world!!라는 문자열을 받아서 아스키 아트를 만든 다음에 두번째 매개변수 function 함수를 실행하여 콜백함수가 된다.
http 모듈
http 모듈에 createServer함수에서 할일을 다 한 다음에, onRequest 콜백 함수를 실행시켜준다.
프레임워크
내가 만들고 싶은 서비스를 구현하는데 필요한 모든 일을 틀 안에서 하는것
프레임워크는, 필요해보이는 라이브러리(모듈)을 미리 다 틀 안에 넣어뒀다.
!!! node.js는 플랫폼이지 프레임워크나 라이브러리 아님