-
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에 맡김으로써 비즈니스 로직의 퀄리티가 향상될 가능성이 커진다.
'Today I Learned > TIL 08' 카테고리의 다른 글