본문 바로가기
엘리스 AI 트랙 4기/elice AI track

[5주차] Express.js의 Middleware와 JSON

by _sweep 2022. 2. 18.

2월 18일 자 학습 내용 정리입니다.

 

 

Middleware

미들웨어(Middleware)는 HTTP 요청과 응답 사이에서 단계별 동작을 수행해주는 함수이다.

 



Express.js의 미들웨어는 HTTP 요청이 들어온 순간부터 시작되며 미들웨어는 HTTP 요청과 응답 객체를 처리하거나 다음 미들웨어를 실행할 수 있다.
HTTP 응답이 마무리될 때까지 미들웨어 동작 사이클이 실행된다.

 

 

미들웨어 작성

기본적으로 req, res, next를 가진 함수를 작성하면 해당 함수는 미들웨어로 동작할 수 있다.
이때 req, res는 각각 HTTP 요청과 응답을 처리하는 객체이고 next는 다음 미들웨어를 실행하는 함수이다.

 

const middleware = (req, res, next) => {
    ...
    next();
}

 

미들웨어는 req, res 객체를 통해 HTTP 요청과 응답을 처리하거나 next() 함수를 통해 다음 미들웨어를 호출한다.
next() 함수가 호출되지 않으면 미들웨어 사이클이 멈추게 된다.

 

✔️ 함수형 미들웨어

하나의 미들웨어를 작성하고 작동 모드를 선택하면서 사용하고 싶을 경우 미들웨어를 함수형으로 작성해 사용할 수 있다.
이는 모듈을 함수형으로 작성하는 것과 비슷한 원리이다.

 

const auth = (memberType) => {
    return (req, res, next) => {
        if (!checkMember(req, memberType)) {
            next(new Error(`member not ${memberType}`));
            return;
        }
        next();
    }
}

app.use('/admin', auth('admin'), adminRouter);
app.use('/users', auth('member'), userRouter);

 

예를 들어 API 별로 사용자의 권한을 다르게 제한하고 싶은 경우 사용자의 권한을 제한하는 미들웨어 하나를 작성하고 사용자의 권한을 미들웨어에 넘기면서 체크하도록 한다.

 

 

미들웨어 사용

미들웨어는 적용되는 위치에 따라 어플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어 등으로 나뉜다.
따라서 필요한 동작 방식에 따라 미들웨어를 적용할 위치를 결정한다.

 

✔️ 어플리케이션 미들웨어

// 1
app.use((req, res, next) => {
    console.log(`Request ${req.path}`);
    next();
});

// 2
app.use(auth);

// 3
app.get('/', (req, res, next) => {
    res.send('Hello Express');
});

 

use나 http method 함수를 사용해 미들웨어를 연결할 수 있다.
미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법이며 HTTP 요청이 들어온 순간부터 적용된 순서대로 동작한다.

 

✔️ 라우터 미들웨어

// 3
router.use(auth);

// 4
router.get('/', (req, res, next) => {
    res.send('Hello Router');
});

// 1
app.use((req, res, next) => {
    console.log(`Request ${req.path}`);
    next();
});

// 2
app.use('/admin', router);

 

router 객체에 미들웨어가 적용되는 것 외에는 어플리케이션 미들웨어와 동일하다.
라우터 미들웨어는 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법으로 app 객체에 라우터가 적용된 이후 순서대로 동작한다.

 

✔️ 오류처리 미들웨어

// 1
app.use((req, res, next) => {
    if (!isAdmin(req)) {
        next(new Error('Not Authorized'));
        return;
    }
    next();
});

app.get('/', (req, res, next) => {
    res.send('Hello Express');
});

// 2(에러 넘겼을 시)
app.use((err, req, res, next) => {
    res.send('Error Occurred');
});

 

일반적으로 가장 마지막에 위치하는 미들웨어이다.
다른 미들웨어들과 달리 err, req, res, next의 네 가지 인자를 가지며 앞선 미들웨어에서 next함수에 인자가 전달되면 실행된다.
이 경우 다른 미들웨어들을 건너뛰고 오류처리 미들웨어가 바로 실행된다.

 

✔️ 미들웨어 서브스택

app.use(middleware1, middlware2, ...);

app.use('/admin', auth, adminRouter);

app.get('/', logger, (req, res, next) => {
    res.send('Hello Express');
});

 

use나 http method 함수에 여러 개의 미들웨어를 동시에 적용할 수 있다.
주로 한 개의 경로에 특정해 미들웨어를 적용하기위해 사용되며 전달된 인자의 순서로 동작한다.

 

 

JSON

JSON(JavaScript Object Notation)은 자바스크립트에서 객체를 표현하는 표현식으로 시작했다.
웹 API는 기본적으로 데이터를 문자열로 전송하는데 이때 객체를 웹 API를 통해 문자열로 전달하기 위해 JSON이 사용되었다.
JSON은 데이터를 표현하는 방법이 단순하고 이해하기 쉽다.

JSON에서 Object는 { "key" : value }로 표현한다.
value는 문자열, 숫자, JSON 객체 등 어떤 값이라도 사용할 수 있다.

JSON에서 Array는 [item1, item2,...]로 표현한다.
item에는 문자열, 숫자, JSON 객체 등 어떤 값이라도 사용할 수 있다.

express.js는 기본적으로 HTTP body에 전달되는 JSON 데이터를 처리하지 못한다.
따라서 express에서 기본적으로 제공해 주는 express.json() 미들웨어를 사용해 JSON 데이터를 읽고 처리한다.

 

const express = require('express');
const app = express();

app.use(express.json());

 

'엘리스 AI 트랙 4기 > elice AI track' 카테고리의 다른 글

[5주차] Mongoose ODM - (1)  (0) 2022.02.19
[5주차] NoSQL과 MongoDB  (0) 2022.02.19
[5주차] Express.js  (0) 2022.02.18
[5주차] 웹과 웹 프레임워크  (0) 2022.02.18
[5주차] Node.js 모듈  (0) 2022.02.16

댓글