본 문서는 2022년 1월 18일 에 작성되었습니다.
작성 당시에는 해당 시리즈는 npm 이라는 이름이었습니다.
하지만, 여러 가지 이유로 기본기가 부족하다고 생각이 되어서 Node + Npm 시리즈로 바꾸게 되었습니다.
또한, 본 문서에서는 Node.js 에 대해서 알아보고자 합니다.
Node.JS 란 무엇일까요?
공식 사이트에서는 다음과 같이 설명하고 있습니다.
Node.js 는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다.
Node.JS 는 2개의 라이브러리를 사용하고 있습니다.
Runtime 으로서의 Node.JS 는 다음의 특징을 가지고 있습니다.
이벤트 기반이란 무엇일까요?
이벤트가 발생할 때, 미리 지정해둔 작업을 수행하는 방식을 의미한다.
이해를 돕기 위하여 아래의 코드를 봐주세요.
btn 을 클릭하는 이벤트가 발생하면 "hello" 를 출력하는 코드입니다.
const btn=document.querySelector("button");
btn.addEventListener("click", ()=>{
console.log("hello");
});
이러한 이벤트 기반 시스템에서는 이벤트 루프 라는 로직이 존재합니다.
이러한 이벤트 루프는
호출 스택이 비어있을 때 테스크 큐에 있는 함수를 호출 스택으로 가져옵니다.
따라서 호출 스택에 함수가 많으면 setInterval 등이 부정확 할 수 있습니다.
일반적으로 작업에는 두 가지가 존재합니다.
Node 는 기본적으로 논 블로킹 방식 으로 구현됩니다.
function process() {
// 오래 걸리는 작업
console.log("작업 끝");
}
console.log("시작"); // 1번
process(); // 3번
console.log("다음 작업"); // 2번
그러나 어떠한 경우 블로킹 방식 으로 구현하려면 다음과 같이 처리합니다.
function process() {
// 오래 걸리는 작업
console.log("작업 끝");
}
console.log("시작"); // 1번
setTimeout(process, 0); // 2번
console.log("다음 작업"); // 3번
Node 시스템은 스레드를 여러 개 가지고 있지만,
실질적으로 개발자가 사용할 수 있는 것은 싱글 스레드입니다.
하지만 Node 12 버전 이후에는 다음과 같은 경우에는 멀티 스레드가 구동됩니다.
하지만,
멀티 스레드 프로그래밍은 너무 어렵고
따라서 멀티 프로세싱을 제안하는 것 같습니다.
Node 는 서버로 동작할 수 있으며, 다음과 같은 장점, 단점이 존재합니다.
Node 는 기본적으로 서버를 내장하고 있습니다.
따라서 별도의 웹 서버를 설치해야 할 이유가 없습니다.
노드 외의 서버를 개발 하다보면 Apache, Nginx, IIS 등의 웹 서버를 설치 해야 합니다.
또한 Tomcat 같은 WAS(웹 애플리케이션 서버) 를 추가로 설치해야 하기도 합니다.
Node 는 웹 서비스 개발에 있어서 높은 생산성을 가지고 있습니다.
Node 는 I/O 에 특화되어 있기 때문에,
실시간 채팅 애플리케이션, 주식 차트, JSON 데이터를 제공하는 API 서버에 유리합니다.
Go 와 같은 비동기적 강점을 가진 언어 및 로드 밸런싱에 특화된 웹 서버에 비해서 속도가 느립니다.
Node 는 기본적으로 싱글 스레드로 돌아갑니다.
따라서 에러가 발생하면 서버가 다운될 위험성이 큽니다.
Node 14, npm 6 을 사용하고 있습니다.
설치 과정은 구글링으로 해결하였습니다.
ES2015+
ES2017 +
Frontend JavaScript
자세한 내용은 JavaScript 시리즈 을 참고해주세요
AJAX, Asynchronouse Javascript And XML
일반적으로 웹 서비스 비동기 처리에 대한 개념입니다.
이 개념이 나왔을 당시에는 XML 을 많이 썼으나, 최근에는 JSON 을 많이 쓰고 있습니다.
이러한 AJAX 기술은 새로 고침 없이 새로운 데이터를 불러오는 것 등을 가능하게 만들어줍니다.
이러한 라이브러리 Axios 를 이용한 코드를 통해서 AJAX 를 구현하는 두 가지 방법을 적어 보겠습니다.
// Promise 방식
function getData() {
axios.get("http://어떠한 API 호출주소")
.then(result=>{
console.log(reuslt);
console.log(result.data);
})
.catch(error=>{
console.log(error);
};
}
// Async, Await 방식
function async getData() {
try {
const result=axios.get("http://어떠한 API 호출주소");
console.log(result);
console.log(result.data);
} catch(error) {
console.log(error);
}
}
const formData=new FormData();
/* formData 내장 함수들
1. append("키", "값")
2. has("키")
3. get("키")
4. getAll("키")
5. set("키","값")
6. delete("키")
*/
const encodedText=encodeURIComponent("한글"); // 암호화된 글자(%43%BD%13 등)
const decodedText=decodeURIComponent(encodedText); // 한글
비민감성 정보 중의 일부를 HTML Tag 에 저장합니다.
이 Tag 는 프론트 앤드의 Client 에게 보여지지 않고 데이터 형태로 저장됩니다.
이 정보는 Javascript 혹은 개발자 도구에서 쉽게 접근할 수 있습니다.
따라서 민감성 정보(개인정보 등)은 저장해서는 안됩니다.
<li data-id="1" data-user-job="none">Unchaptered</li>
위에 대부분은 프로젝트를 진행하고 수업을 들으며 경험하거나 알고 있었던 부분입니다.
간단하게 정리하면서 생각을 정리해보는 시간을 가져서 좋았습니다.
이제 실제로 Node 를 이용해서 코드를 실행해보고자 합니다.
REPT 를 이용해서 개발자 도구의 console 창 처럼 Javascript 를 실행시킬 수 있습니다.
$ node
> const text="hello, my name is unchaptered"
undefined
> console.logo(text);
hello, my name is unchaptered
undefined
>
따로 Javascript 파일을 만들어서 이를 실행할 수도 있습니다.
// hellooo.js
function sayHello() {
console.log("hello");
}
sayHello();
$ node hellooo
hello
Javascript 는 스크립트 언어로써,
Chrome 60 을 제외하고는 브라우저 상에서 import, export 를 지원하지 않습니다.
그러나 Node 를 사용하면 이러한 Javascript 코드들을 모듈 로써 사용할 수 있습니다.
초기에는 다음과 같은 코드의 형태를 가지고 있었습니다.
// 출력하는 부분
const 변수명1=내용;
const 변수명2=내용;
module.exports = { 변수명1, 변수명2 };
혹은
exports.변수명1=내용;
exports.변수명2=내용;
// 받아들이는 부분
const { 변수명1, 변수명2 }=required("./파일명");
// 출력하는 부분
export const 변수명1=내용;
export const 변수명2=내용;
// 받아들이는 부분
import { 변수명1, 변수명2 } from "./파일명";
이미 사요앟고 있는데, 이 부분을 더 자세하게 사용할 이유가 있는 지는 아직 모르겠습니다.
따라서, 각 부분에 대한 자세한 설명은 Dev 모듈 중 Node.js 내장 모듈 을 참고해주세요.
Global 객체
Node 에는 windows 와 같은 전역 내장 객체가 존재합니다.
주의 할 점은, Node 를 사용하면 windows 나 document 를 사용할 수 없다는 점입니다.
console 객체
Node 에도 console 객체가 있으나,
이는 windows 가 아닌 global 객체에 존재합니다.
__fildename, __dirname 키워드
process 객체는 노드와 관련된 키워드들을 가지고 있는데,
process.cwd() 및 process.env 를 사용합니다.
cwd() 는 현재 프로세스 실행 위치를 의미하며,
env 는 환경변수 파일로 노드 및 서버 구동에 관련된 파일 정보를 의미합니다.
사실 실제로 사용할 일이 있는지, 잘 모르겠습니다.
하지만, 역시나 포함하고 있는 개념이기에 정리하기만 하고 넘어가기로 하였습니다.
각 모듈에 대한 자세한 설명은 Dev 모듈 중 Node.js 내장 모듈 을 참고해주세요.
1. os 모듈 (113p)
2. path 모듈 (115p)
3. url 모듈 (119p)
4. queryString 모듈 (123p)
5. crypto 모듈 (124p)
6. util 모듈 (129p)
7. worker_threads 모듈 (130p)
8. child_process 모듈 (135p)
9. fs 모듈 (138p)
8. Buffer, Stream (145p)