Express→Node.js 의 관계정리(+ORM)

Joe·2022년 11월 7일
0
post-thumbnail

Express의 설명을 보면 “ Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크”라고 나와있다. express를 이해하기위해는 node.js가 무엇인지 보다 확실하게 알고 넘어가야 할 것이다.

Node.js


Node.js는 Chrome 브라우저의 V8 Javascript 엔진을 탑재한 이벤트 기반의 Server Side 오픈소스 Javascript 런타임으로, 노드에 내장되어 있는 기능들(libuv, httpd, ..)로 동시 요청 처리에 높은 성능을 갖는 HTTP Server를 구축 및 실행할 수 있다.

→ runtime : 해당 프로그래밍언어로 작성된 코드가 구동되는 환경

💡 자바스크립트의 런타임의 종류로는 웹브라우저(크롭,파이어폭스,사파리등)와 Node.js가 있다.💡

2008년 구글에서 V8 javascript 엔진을 개발하여 속도라는 무기까지 얻게 되었고 2009년 Ryan Dahl에 의해 자바스크립트가 브라우저 이외에 환경에서도 동작할 수 있도록 V8 엔진을 브라우저에서 독립시킨 자바스크립트의 또 다른 런타임인 Node.js를 개발!(Ryan Dahl의 주된 관심사는 이벤트기반의 높은 처리 성능을 낼 수 있는 network 서버를 만드는 것이였다고 한다)

자바스크립트는 브라우저에서 벗어나 일반 컴퓨터 환경에서도 동작할 수 있게 되었고 파일시스템에 접근해 읽고 쓰는등의 기능까지도 할 수 있게 있게 되었다

**💡 한 블로그에서 “Node.js를 배운다는 말은 자바스크립트로 백엔드를 공부한다는 소리가 아니라 `컴퓨터를 제어할 수 있는 방법을 배운다`라는 말과 같다” 라고 했던 것이 생각났다.💡**

웹브라우저에서는 오직 HTML,CSS,JS를 해석하고 그것들을 보여주는데, 웹페이지를 만들기 위해 HTML,CSS,JS를 하나하나 만들며 연결시켜준다는 것은 정말 비효율적이고 아마 나로써는 불가능한 일 일 것이다.(하지만 현재에는 너무나 많은 프래임워크와 라이브러리가 있기에 충분히 좌절하지 않고 만들 수 있다)

그렇기에 개발자들은 웹 개발을 도와주는 여러 모듈들을 설치하여 그 모듈을 가지고 웹페이지를 만들게 되는데 브라우저는 이 모듈들을 직접적으로 인식하지 못할 것이다. 왜? HTML,CSS,JS가 아니기 때문에!!

→ 여러 모듈의 도움을 받아 웹페이지를 만들어도 브라우저가 바로 그 내용을 읽지 못하기 때문에 그 내용들을 브라우저가 읽을 수 있도록 HTML,CSS,JS 파일들로 변환 작업이 이뤄져야 하는데 그것이 바로 Node.js의 역할 인 것이다. 변환작업을 하는 명령을 내리고 코드를 짜고 이것들이 돌아가는 환경을 만들어준다

위의 내용을 토대로보면 Node.js는 높은 자유도와 무한한 확장 가능성을 가지고 서버를 개발할 수 있게 도와준다. Node.js와 호환되는 수많은 Server-side Framework들이 있는데 Express.js도 그중 하나이다.

Express - < Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크 >


Express는 Node.js 기반의 HTTP API 서버 프로그램을 보다 쉽고 빠르게 개발하고 유지/보수 할 수 있게 해주는 프레임워크이다.

물론, node.js에는 내장된 HTTP API가 있어서 이벤트기반의 동시 요청 처리에 높은 성능의 서버를 개발 할 수 있다.

예를들어,아래와 같이 회원가입을 위한 통신을 위해 if절로 url을 파악하고, 들어오는 데이터들도 받아서 적절하게 뿌려주는 복잡한(?) 코드가 필요하다. 즉 각각의 경우를 조건문으로 분기하여 routing(라우팅)을 진행해야한다. → 라우팅은 아래의 내용과 같이 method별로 GET,POST,PUT,DELETE등의 내용을 적절한 로직으로 안내해줌으로써 이루어진다.

const http = require("http");
const server = http.createServer();

const httpRequestListner = function (request, response) {
  const target = request.url;
  const httpMethod = request.method;

if (httpMethod === "POST") {
    //회원가입
    // /users/signup
    if (target === "/users/signup") {
      let body = "";
      request.on("data", (chunk) => {
        body = body + chunk;
      });
      request.on("end", () => {
        const user = JSON.parse(body);
        users.push({
          id: user.id,
          name: user.name,
          email: user.email,
          password: user.password,
        });
        response.writeHead(200, { "Content-type": "application/json" });
        response.end(JSON.stringify({ messgae: "User Registered! SUCCESS" }));
      });
}

하지만 express는 이 내용을 개발자로 하여금 더욱 읽기 쉽고 유연하며 지속가능한 백엔드 앱을 개발할 수 있게끔 도와준다. Express가 라우팅과 로직을 모듈화 시킴으로 가독성이 뛰어나며 쉽고 지속가능하도록 도와준다.

(라우팅 - 클라이언트의 특정 요청 method와 엔드포인트에 따라 에 따라 다른 응답 처리 하는 것)

const modularizedFunctions = require('./modularizedFunctions.js')
const express = require('express')
const app = express()

app.use(express.json())
app.post('/users', modularizedFunctions.createUser)

위에서의 modularizedFunctions.js 는 if절로 복잡하게 얽혀있는 소스코드를 별도 파일에 각각의 함수들로 모듈화를 해놓은 파일이다.

💡 Express를 이용하여 구현한 코드는 기능별로 별도의 파일을 관리할 수 있기에 더욱 복잡해질 디자인/아키텍쳐 패턴을 적용하는데 기본 원리로 적용이 된다!

ORM


ORM(Object-Relational Mapping) - 객체와 관계형 데이터베이스의 관계를 매핑(연결)해주는 기능

객체의 클래스와 RDBMS의 table이 자동으로 연결되는 것을 의미한다. 당연히 클래스와 테이블은 서로간의 불일치가 발생하지만 이때 ORM을 통해 SQL문을 자동으로 생성하여 불일치를 해결하게 되는 것이다. 그러므로 ORM을 이용하면 객체를 통해 직접 데이터베이스를 조작할 수 있게 된다.

보다 자세히 말하자면 ORM은 RDBMS의 2차원 테이블과 테이블 안에 저장된 행(data)을 어플리케이션의 class와 인스턴스에 각각 연결해주는 역할을 한다. 그렇기에 자바스크립트 등의 프로그래밍 언어만을 사용해 선언한 class와 instance등으로 서로 연관성이 없어보이는 데이터베이스 내부자료 속성에 접근할 수 있는 것이다.

ORM 서비스에는 많은 라이브러리가 있는데 그 중 대표적인 라이브러리는 TypeORM, Sequelize, Prisma 이다. 각각의 특징에 따라 어떤 라이브러리가 적절한지 판단하여 사용할 수 있다.


이번에 express와 orm을 공부하며 node.js에 대해 다시한번 볼 수 있었다. 그러면서 그전에 보지 못했던, 아니 완전히 이해하지 못했던 부분들까지도 보이게 되었다. 분명 그전에도 어느정도 이해를 했다고 생각했는데 정리하여 글을 쓰면서 또 개념들이 다시 정리가 되는 신기한 경험을 했다. 결국 또 느낀 것은 “ 아는만큼 보인다 “라는 것이다. 더 많은 것을 보고 느끼고 생각하기 위해 하나 더 알아가는 뿌듯한 하루가 되어서 기분이 좋다.


<참고자료>

https://varitixx.postype.com/post/10642388

https://geonlee.tistory.com/207

https://hanamon.kr/nodejs-개념-이해하기/

profile
Creator

0개의 댓글