[Node.js] ExpressJS VS NestJS

먹보·2023년 1월 10일
0

MUK_BO's Node.js

목록 보기
6/7
post-thumbnail

이전 게시글에서, 필자는 2번 정도 Express를 사용하여 프로젝트를 진행한 경험이 있다고 얘기했었다.

처음 Express를 배웠을 때만 해도 정말 신세계였다.

프레임워크 없이 NodeJS의 내장 모듈인 http로 서버를 열고 다음과 같이 엔드포인트와 HTTP METHOD에 따라 분기점을 생성해 그에 따른 response를 만들어줬었는데..

돌이켜보면 프로젝트를 진행했을 때 프레임워크 대신 이 방법을 채택했다고 하면..엄청 힘들었을 것 같다.

const requestReceiver = function (request, response) {
    const { url, method } = request
    if (method === 'GET') {
        if (url === '/users_data'){
            response.writeHead(200, {'Content-Type' : 'application/json'});
            response.end(JSON.stringify({message : users}));
        }
        else if (url === '/post_list'){
            response.writeHead(200, {'Content-Type' : 'application/json'});
            response.end(JSON.stringify(posts_lists));
        };
    } 
    else if (method === 'POST') { // (3)
        if (url === '/signup') {
            let body = ''; // (4)
            request.on('data', (data) => {body += data;})
            request.on('end', () => {  // (6)
                const user = JSON.parse(body); //(7) 
  
                users.push({ // (8)
                    id : user.id,
                    name : user.name,
                    email: user.email,
                    password : user.password
                })
            response.end(JSON.stringify({message : "userCreated"}));
            })
        }
//.....생략

이렇게 복잡한 코드가..Express 프레임워크를 사용하면서 더욱 직관적이고 간결해졌다.

app.get("/posts", async (req, res) => {
  const posts = await appDataSource.query(
    `
        SELECT
          u.id as userId,
          u.profile_image as userProfileImage,
          p.user_id as postingId,
          p.image_url as postingImageUrl,
          p.content as postingContent
        FROM users u
        JOIN posts p ON u.id = p.user_id;
        `
  );
  res.status(200).json({ data: posts });
});

상기 코드는 MySQL이란 RDBMS 를 적용하면 방향성이 많이 달라졌지만 프레임워크의 중요성을 깨닫는 데에는 충분한 기여도를 했다.

하지만 프로그래밍 언어가 다양하듯이, NodeJS에도 이전 게시글에서 알아봤듯이 여러가지의 프레임워크가 있고 사용하는 상황이 다르기 때문에 한 가지 이상을 반드시 숙지하고 있어야 된다고 생각해 이번 기회에 한국에서 NodeJS를 사용하는 기업이라면 가장 많이 사용하고 있는 프레임워크 ExpressJSNestJS를 조금 더 깊게 알아보고자 한다.

✍ ExpressJS

📝 ExpressJS란...

Express의 공식 웹 사이트에 들어가보면 다음과 같이 정의되어있다.

Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.

해석해보면 Express는 웹과 모바일 앱 개발을 위해 견고한 최소한의 기능들을 제공하는 유연한 NodeJS의 웹 어플리케이션 프레임워크라고 한다.

기능들을 가볍게 살펴보면 다음과 같다.

📝 ExpressJS의 기능들

  • 라우팅, 세션, HTTP 요청, 에러 핸들링과 같은 다양한 백엔드 기능들을 제공한다.
  • 모바일 앱을 포함한 싱글 페이지, 멀티 페이지와 하이브리드 웹 어플리케이션과 같은 API와 웹 어플리케이션들을 쉽게 만들 수 있다.
  • HTTP 요청에 대한 다양한 미들웨어들을 제공한다.
  • HTTP 메서드와 URL을 사용하여 ExpressJS만의 고유한 라우팅 기법을 제공한다.
  • MongoDB, Redis, MySQL 등과 같은 데이터베이스에 쉽게 연결이 가능하다

이러한 다양한 기능들을 제공하기에 장/단점을 확실히 짚고 넘어가야 앞으로 있을 프로젝트에서 어떤 프레임워크를 사용해야 될지 결정 할 수 있다.

📝 ExpressJS의 장/단점

🔔 장점

  1. 코딩 시간 단축
  2. 자바스크립트 기반으로 인한 낮은 진입 장벽
  3. 쉬운 설정
  4. 다른 엔진들과의 연동이 쉬움
  5. 프론트와 백엔드 간의 소통 용이
  6. 오래 되었기에 강력한 커뮤니티 형성

🔔 단점

  1. 에러 메시지 분별력 떨어짐
  2. 콜백 이슈
  3. 코드 구성이 간혹 어려울 수 있음
  4. 규모가 큰 프로젝트에 적합하지 않음

ExpressJS에 간략하게 알아보았으니 NestJS와 직접적으로 비교하기 전에 NestJS에 대해서도 알아보자

✍ NestJS

📝 NestJS란...

공식 웹사이트의 정의는 다음과 같다.

A progressive Node.js framework for building efficient, reliable and scalable server-side applications

해석해보면, 효율적이고 신뢰적이며 확장 가능한 서버 사이드 어플리케이션을 만드는 진보적인 NodeJS 프레임워크

사실..ExpressJS나 NestJS 그리고 각종 프레임워크 공식 웹사이트에 나와있는 설명구들은 거기서 거기기에..직접 파고들지 않는 이상 특이점을 찾기가 쉽지 않다.

📝 NestJS의 기능들

  • OOP (객체 지향 프로그래밍), FP (함수형 프로그래밍), 그리고 FRP(반응형 함수 프로그래밍?)를 모두 결합한다.
  • 다양한 데이터베이스를 지원한다.
  • ExpressJS를 기본으로 사용하면서 Fastify와 같은 HTTP 프레임워크를 설정해서 사용할 수 있을 정도로 에그노스틱한 플랫폼이다.
  • 더 적은 코드양으로도 어플리케이션을 만들 수 있도록 수 많은 라이브러리, API 그리고 기능들을 제공한다.
  • 코드의 가독성 및 유지보수를 위해 Dependency Injection(DI)이 내장되어 있다.
    => DI는 객체들의 의존관계를 정립하고 주입하는 것

📝 NestJS의 장/단점

🔔 장점

  1. JS의 상위호환인 TypeScript를 주로 활용한다.
  2. 체계적이고 자세한 문서화
  3. 쉽고 빠르게 습득 가능
  4. 강력한 CLI (Command Line Interface)
  5. 오픈 소스
  6. 편리한 유닛테스트

🔔 단점

  1. JS기반이지만 TypeScript 지식이 필수
  2. 유저 베이스의 결핍
  3. ExpressJS보다 작은 커뮤니티

✍ ExpressJS vs NestJS

위에 살펴본 특징들만 살펴보면 사실 직접 손을 대보고 각 각의 프레임워크를 활용하여 프로젝트를 진행해보지 않는 한 차이점이 명백하게 눈에 보이지 않지만 그래도 간단하게 알아보자.

기준ExpressJSNestJS
제약제약이 거의 없음제약이 존재하기에 사전 에러 방지
아키텍쳐특정 아키텍쳐가 없음컨트롤러, 프로바이더, 모둘과 같은 바로 사용 가능한 컴포넌트가 제공됨
타입스크립트타입스크립트 설정을 따로 잡아줘야함타입스크립트가 거의 디폴트 수준이기에 조금 더 규모가 큰 프로그램에 견고하고 적절하게 적용 가능함
성능비동기적이며 독립적으로 복수의 작업을 실행 할 수 있지만 확장성이 부족하다코드 양 감소 및 Dependency Injection을 제공하며 서드 파티 플러그인을 지원한다.
대중성역사가 더 오래되어 커뮤니티가 크다조금씩 대중성을 키워가고 있으며 NodeJS 기반프레임워크 중 2위를 기록하였다(GitHub 기준)
사용되는 경우파인테크 및 스트리밍 프로그램에 적합엔터프라이즈 급 웹 개발 및 이커머스 웹에 적합

상기 차이점을 한 번씩 보고 앞으로 프로젝트 진행 시 상황에 맞는 프레임워크를 사용하면 될 것 같다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글