웹서버 틀 + express 패키지 설치
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World')
})
app.listen(3000) // 3000번 포트로 WAS 서버 바로 띄우기!
Express.js로 복잡한 웹 서버를 개발
클라이언트가 JSON 데이터를 보낼 때 해당 페이로드를 파싱하기 위해서 body-parser 미들웨어를 적용해야함.
4.16 버전 이후에는 express.json() 모듈을 body-parser 대신 미들웨어에 적용
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')
})
CORS 적용
브라우저에서 원활하게 웹 서버에 접속을 할 수 있도록 CORS 설정
const express = require('express')
const bodyParser = require('body-parser');
const cors = require('cors') ////
const app = express()
app.use(bodyParser.json());
const corsOptions = {
origin: 'http://kangchangmin.com',
optionsSuccessStatus: 200
}
app.get('/', function (req, res) {
res.send('Hello World')
})
// cors 미들웨어를 특정 API에 적용
// 편의상 app.use(cors())와 같은 코드로 모든 API에 cross-origin 요청을 허용하는 경우도 많습니다.
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
res.json({msg: '보안 이슈로 kangchangmin.com의 origin에서만 호출을 할 수 있는 메소드'})
})
app.listen(3000);
cookie-parser 적용하여 로그인/로그아웃 처리
쿠키를 사용한 req,res
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);
사용하고 싶은 미들웨어들이 많으면 많을수록 개발자들은 미들웨어를 계속 사용한다고 선언해야 하며 사용해야 하는 미들웨어들에 대한 공부를 해야함
레이어드 아키텍처 패턴
웹 서버를 구현할 때 가장 보편적으로 사용되는 구현 패턴
레이어드 아키텍처는 시스템을 여러 계층으로 나누어 각 계층이 특정 책임을 갖도록 하는 아키텍처 스타일
레이어드 아키텍처 패턴의 각 계층
- 프리젠테이션 계층 - 컨트롤러
- 클라이언트의 요청을 해석하고 응답하는 계층. 클라이언트와 직접적으로 통신
- API나 UI를 제공
- 비지니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할만 수행.
- 비지니스 계층 - 서비스
- 프리젠테이션 계층으로부터 요청을 받아 비지니스 로직을 수행하는 계층.
- 비지니스 로직을 수행하는 과정에서 데이터 계층과 통신.
- 데이터 계층 - 리포지터리
- 실제 데이터베이스(RDBMS 혹은 NoSQL)에 접근하는 계층입니다.
레이어드 아키텍처 패턴의 주요 특징
- 의존성
- 각 계층은 가장 가까운 하위 계층의 의존성을 주입받는다. (DI)
- 독립성
- 각 계층은 다른 계층의 역할을 침범하지 않는다.
- 각 계층은 역할이 명확하므로 기능 구현 및 테스트에 용이하다.
Express.js로 레이어드 아키텍처 패턴을 적용
자유롭지만 번거롭다
- Express로 레이어드 아키텍처 패턴을 나타내기 위해서는 디렉토리 구조를 명확하게 설계해야 하며 서비스 요구사항 변경 및 기획이 추가됨에 따라서 필요한 개념들을 새롭게 배워야 함.
- boilerplate도 공식적으로 인정되는 것은 아니기에 호환성, 디렉토리 구조 등의 문제가 발생할 수 있다.
Nest.js의 등장
명령어 하나로 쉽고 간편하게 계층 생성
자바스크립트에 비해서 보다 엄격한 타입 체크를 함으로써 여러 예외 상황을 사전에 방지할 수 있다.
레이어드 아키텍처 패턴을 구성할 때 Nest.js는 커맨드 하나로 간편하게 대부분의 구성요소를 구현할 수 있다.
nest g co posts # Posts 컨트롤러를 만들기
개발자는 웹 서버의 핵심 로직 구현에만 신경쓰고 그 외에 다른 부분들은 Nest.js에 일임할 수 있다.
- 해야 할 일이 줄어들어 비지니스 로직의 퀄리티와 코드 생산성이 향상될 가능성이 커진다