Node.js란 무엇인가?
Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 비동기 I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다.
웹브라우저에 종속적인 자바스크립트를 외부에서 실행 할 수 있는 Chrome V8 엔진의 런타임이다.
Node.js 특징
1. 비동기 I/O 처리, 이벤트 위주
Node.js 라이브러리의 모든 API는 비동기 방식이다. 즉, 한 작업이 완료될때까지 기다렸다가 작업하는 것이 아닌 멈추지 않고 계속해서 코드를 실행하는 의미이다.
기존 스레드 기반에서는 I/O작업 시작을 하면 처리응답이 나올때까지 기다리고만 있는 경우가 발생한다.
이벤트 기반 비동기 I/O처리는 I/O 작업 시작시 기다리지않고 읽기요청 필요없는 부분을 처리하다 I/O 작업종료 시 이벤트가 발생되어 이때부터 데이터 활용하는 작업 처리한다.
I/O작업이 시작되면 I/O 작업 처리에 대한 응답을 기다리지 않고 바로 다음 작업 실행한다.
I/O작업이 종료되면 이벤트를 발생시키고 이 이벤트는 해당 프로세스의 새로운 이벤트 큐(Queue)에 등록된다.
이벤트 루프
작업 요청 후, 완료되었을 때 어떤 작업을 진행할지에 대한 콜백 함수를 지정하여
동작 완료 시, 해당 콜백함수 실행하는 동작 방식이다.
이벤트루프에 큐 형식의 자료구조가 포함있다. 하지만 이벤트 루프는 이 큐를 돌면서 실행하지 않고, 스택을 처리한다.
이벤트루프는 round-robin 방식으로 차례 차례 돌면서 처리되는 특정 작업들의 단계들로 이루어져 있다.
2. 빠른속도
구글 크롬의 V8 자바스크립트 엔진을 사용하여 빠른 속도를 낸다.
3. 쓰레드 / 뛰어난 확장성 :
Node.js 는 이벤트 루프와 단일 쓰레드 모델을 사용하는 환경이다. 이벤트 메커니즘은 서버가 멈추지 않고 동작하도록 해주어 서버의 확장성을 키워준다.
아파치로 대표되는 일반적인 웹서버는 요청을 처리하기 위해 제한된 쓰레드를 생성한다. 반면 Node.js 는 하나의 쓰레드만을 사용하고 아파치와 같은 웹서버보다 훨씬 많은 요청을 처리할 수 있다.
4. 버퍼링 :
Node.js 어플리케이션에는 데이터 버퍼링이 없고, 데이터를 chunk 로 출력한다.
5. 라이센스
Node.js 는 MIT License 가 적용되어 있다. 즉, 수정 및 재배포가 가능하지만 반드시 MIT 라이센스에 대한 문구가 포함되어 있어야 한다.
npm (yam) 이란 무엇인가?
1. npm
Node.js를 설치하면 자동으로 설치되는 Node Package Manager 이다.
Node.js에 필요한 패키지들을 관리한다. 언제든지 필요하다면 npm을 이용하여 자신에게 필요한 모듈을 다운로드할 수 있다. 이러한 모듈을 이용해 처음부터 잘 짜인 코드를 사용가능하지만, 에러가 있는 경우 또한 모듈을 수정하는 것이 힘들고 불편하다. 모듈 설치가 비교적 느리다.
2. Yarn
FaceBook 에서 개발한 자바스크립트의 새로운 패키지 매니저로 더욱 빠르게 패키지를 인스톨하는 방법과 의존성 관리를 다양한 디바이스에서 일관성 있게 할 수 있다.
npm을 보완하고 속도를 빠르게 한 패키지 매니저 툴이다.
정적 타입 언어 vs 동적 타입 언어
정적 타입언어
'타입' 즉 자료형을 컴파일 시에 결정하는 것 이다. C, C#, C++, Java 등의 언어가 있다. 이들 언어는 변수에 들어갈 값의 형태에 따라 자료형을 지정해주어야 한다. 컴파일 시에 자료형에 맞지 않은 값이 들어있으면 컴파일 에러가 발생한다.
장점 : 컴파일 시에 타입에 대한 정보를 결정하기 때문에 속도↑ , 타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성↑
동적 타입 언어
JavaScript, Ruby, Python, SmallTalk 등이 동적언어이다. 동적 타입 언어의 자료형은 컴파일 시 자료형을 정하는 것이 아니고 실행 시에 결정한다. 다음과 같이 타입 없이 변수만 선언하여 값을 지정할 수 있다.
장점 : Run time까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있다.
단점 : 인터프리터 언어는 배우기는 쉬우나 실행 도중에 변수에 예상치 못한 타입이 들어와 Type Error 를 뿜는 경우가 생길 수 있다.
라이브러리와 프레임워크의 차이
Framework(프레임워크)
프레임워크는 뼈대나 기반구조를 뜻하고, 제어의 역전 개념이 적용된 대표적인 기술이다.
소프트웨어에서의 프레임워크는 '소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합' 이라 할 수 있으며, 완성된 어플리케이션이 아닌 프로그래머가 완성시키는 작업을 해야한다.
객체 지향 개발을 하게 되면서 통합성, 일관성의 부족이 발생되는 문제를 해결할 방법중 하나라고 할 수 있다.
라이브러리(Library)
라이브러리는 단순 활용가능한 도구들의 집합을 말한다.
즉, 개발자가 만든 클래스에서 호출하여 사용, 클래스들의 나열로 필요한 클래스를 불러서 사용하는 방식을 취하고 있다.
프레임워크와 라이브러리의 차이점
라이브러리와 프레임워크의 차이는 제어 흐름에 대한 주도성이 누구에게/어디에 있는가에 있다.
즉, 어플리케이션의 Flow(흐름)를 누가 쥐고 있느냐에 달려 있다.
프레임워크는 전체적인 흐름을 스스로가 쥐고 있으며 사용자는 그 안에서 필요한 코드를 짜 넣으며 반면에 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰는 것이라고 할 수 있다.
다시 말해, 라이브러리는 라이브러리를 가져다가 사용하고 호출하는 측에 전적으로 주도성이 있으며 프레임워크는 그 틀안에 이미 제어 흐름에 대한 주도성이 내재(내포)하고 있다.
프레임워크는 가져다가 사용한다기보다는 거기에 들어가서 사용한다는 느낌/관점으로 접근할 수 있다.
'REST API'란 무엇인가
HTTP 프로토콜 장점을 살릴 수 있는 네트워크 기반 아키텍처이다.
REST API를 구현하기 위해 HTTP method + 모든 개체 Resource화 + URL 디자인(라우팅) 필요하다.
URL을 이용한 접근: 모든 개체를 리소스로 보고, 리소스에 고유번호를 부여한다.
REST란, 웹에 존재하는 모든 자원(이미지, 동영상, DB자원)에 고유한 URL을 부여해 활용하는 것으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다. 따라서 REST 특징을 지키면서 API를 제공하는 것을 의미한다.
Ref)https://ijbgo.tistory.com/20
Node.js의 BE Library / Framework에 대해서 알아보기
<Framework>
1. Express.JS
웹 및 모바일 애플리케이션 개발을 위한 강력한 기능모음을 제공하는 빠르며 유연한 MVC 프레임워크이다.
2. Socket.io
실시간 애플리케이션 구출을 위한 빠르고 안정적인 풀 스택 플레임워크이다. 실시간 양방햔 이벤트 기반 통신을 위해 설계되었다.
3. Meteor.JS
최신 웹 및 모바일 애플리케이션을 구훅하기 위한 초소형 풀 스택이다. 웹, ios, android 또는 데스크톱과 호환된다.
4. Sails.JS
Express에 구축된 Node.js를 위한 실시간 MVC 웹 개발 프레임 워크이다.
MVC 아키텍처는 Ruby on Rails와 같은 프레임 워크와 유사하다. 그러나 최신의 데이터 중심 스타일의 웹 앱 및 API개발을 지원한다는 점에서 다르다.
5. Nest.js
효율적이고 안정적이며, 확장 가능한 서버 측 애플리케이션을 구축하기 위한 유연하고 다재다능하며 진보적인 프레임워크이다. 최신 JavaScript를 사용하며 TypeScipt로 빌드된다. OOP, FP 및 FRP의 요소로 결합한다.
Ref)https://dora-guide.com/nodejs-net-framework/
<Library>
1. body-parser
body-parser node.js 모듈이다. 클라이언트 POST request data의 body로부터 파라미터를 편리하게 추출한다.
2. Morgan
Node.js를 위한 또 다른 HTTP 요청 로거 미들웨어이다. 애플리케이션에 대한 요청 로깅 프로세스를 단순화한다. 공통 로그를 수동으로 만들 필요가 없기 때문에 개발자의 시간을 절약 할 수 있다. 요청 로그를 표준화하고 자동으로 생성한다.
3. Sequelize
sequelize란 nodeJS에서 mysql을 사용할 때 raw Query문을 사용하지 않고 더욱 쉽게 다룰 수 있도록
도와주는 라이브러리이다. sequelize는 ORM(Object-Relational Mapping)로 분류가 된다.
ORM이란 객체와 관계형 데이터베이스의 관계를 매핑 해주는 도구이다.
sequelize를 사용하면 raw Query문을 사용하지 않고 자바스크립트를 이용해서 mysql을 사용할 수 있다.
4. Mongoose
Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리이다. 프로그래밍 언어(Javascript) Object와 MongoDB의 데이터를 Mapping하여 호환성을 만든다.
필요에 따라 확장 및 변경이 가능한 자체 검증(Validation)과 타입변환(Casting)이 가능하며, Express와 함께 사용하면 MVC패턴 구현이 용이하다는 장점이 있다.
'개념정리' 카테고리의 다른 글
[Chapter6] Controller , Log4j , RequestMapping (0) | 2021.11.21 |
---|---|
HTTP & HTTPS (0) | 2021.11.14 |
REST API 개념 (HTTP& HTTPS) (0) | 2021.11.13 |
스레드 (0) | 2021.11.10 |
객체지향의 사실과 오해 (0) | 2021.11.09 |