ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023- 08 - 05 Nest.js : Express의 단점을 보완, feat. 레이어드 아키텍쳐
    Today I Learned/TIL 08 2023. 8. 5. 01:11

    Node.js에는 여러가지 웹 프레임워크 (Express, Koa, Fasify, Nest.js .. )등이 있다. 이중에 Nest.js가 요새 가장 핫한 넷 프레임워크이다.

     

    Express가 물론 가장 대중적인 웹 프레임워크다.

    Express로 테스트 app.js코드를 만들어보자

    const express = require('express')
    const app = express()
    
    app.get('/', function (req, res) {
      res.send('Hello World')
    })
    
    app.listen(3000) // 3000번 포트로 WAS 서버 바로 띄우기!

     

    여기서 조금 더 추가해보자.

    클라이언트가 JSON데이터를 보낼때 해당 페이로드를 파싱하기 위해 body-parser미들웨어를 적용해야 함.

    const express = require('express')
    const bodyParser = require('body-parser');
    
    const app = express();
    
    app.use(bodyParser.json()); // body-parser 미들웨어 적용
    
    app.get('/', function (req, res) {
      res.send('Hello World')
    })
    
    app.post('/', function(req, res){
      // Content-Type: application/json의 형태의 페이로드 파싱 가능 
      res.send(req.body); 
    });
    
    app.listen(3000);

     

    웹서비스 (로그인/로그아웃) 기능을 지원해야 하는 서비스를 사용하기 위해 cookie-parser를 써야함.

    const express = require('express')
    const bodyParser = require('body-parser');
    const cookieParser = require('cookie-parser')
    const cors = require('cors')
    const app = express()
    
    app.use(bodyParser.json());
    app.use(cookieParser())
    
    const corsOptions = {
      origin: 'http://kangchangmin.com',
      optionsSuccessStatus: 200
    }
    
    app.get('/', function (req, res) {
      console.log('Cookies: ', req.cookies)
    })
    
    app.get('/products/:id', cors(corsOptions), function (req, res, next) {
      res.json({msg: '보안 이슈로 kangchangmin.com의 origin에서만 호출을 할 수 있는 메소드'})
    })
    
    app.listen(3000);

     

    가장 경량으로 구현했던 테스트용 웹 서버가 점점 무거워졌다. Express에 레이어드 아키텍쳐패턴을 적용해보면 어떨까?

     

     

    - 프리젠테이션 계층
        - 클라이언트와 통신을 직접적으로 담당하며 클라이언트의 요청을 해석하고 응답하는 계층입니다.
        - 클라이언트와 통신하는 API를 제공하며 컨트롤러로 대변됩니다.
        - 비지니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할만 수행합니다.
        
    - 비지니스 계층
        - 프리젠테이션 계층으로부터 요청을 받아 비지니스 로직을 수행하는 계층입니다.
        - 비지니스 로직을 수행하는 과정에서 데이터 계층과 통신하며 서비스로 대변됩니다.
        
    - 데이터 계층
        - 실제 데이터베이스(RDBMS 혹은 NoSQL)에 접근하는 계층입니다.
        - 리포지터리로 대변됩니다.

     

    레이어드 아키텍쳐 패턴의 공통점

    - 의존성
      	- 각 계층은 가장 가까운 하위 계층의 의존성을 주입받습니다.
            - 이는 DI라고도 합니다.
            
    - 독립성
        - 각 계층은 다른 계층의 역할을 침범하지 않습니다.
        - 각 계층은 역할이 명확하므로 기능 구현 및 테스트에 용이합니다.

    Express로 이러한 레이어드 아키텍처 패턴을 나타내기 위해서는 디렉토리 구조를 명확하게 설계해야 하며 서비스 요구사항 변경 및 기획이 추가됨에 따라서 필요한 개념들을 새롭게 추가하여야 하는데, 이는 장점도 있지만 단점도 존재하므로 Nest.js가 이를 해결할 수 있다.


    Nest.js는 타입스크립트 & 커맨드 기반 웹 프레임워크 이다.

     

    Nest.js는 타입스크립트 기반 웹 프레임워크이기 때문에, 자바스크립트에 비해서 보다 엄격한 타입 체크를 함으로써 여러 예외 상황을 사전에 방지할 수 있고, 레이어드 아키텍쳐 패턴을 구성할 때 Nest.js에서는 커맨드 하나로 간편하게 대부분의 구성요소를 구현할 수 있으므로 더 편리하다.

     

    예를들어, Posts컨트롤러 생성 : 

    nest g co posts

    g는 generate의 약자, co는 controller의 약자.

    즉 nest로 posts라는 컨트롤러를 만들겠다는 뜻.

     

    컨트롤러뿐 아니라 서비스, 미들웨어와 인터셉터 등 웹 서버에 필요한 다양한 구성요소를 커맨드로 정확하게 구현할 수 있다는 것은 Nest.js만의 장점이며, 또한 웹 서버의 핵심 로직 구현에만 신경쓰고 그 외에 다른 부분들은 Nest.js에 맡김으로써 비즈니스 로직의 퀄리티가 향상될 가능성이 커진다.

    댓글

Designed by Tistory.