Express JS와 미들웨어

2024. 11. 17. 20:26정보처리,전산/NODEJS

반응형

1. Express JS

Express.js는 Node.js 환경에서 웹 서버와 API를 쉽게 구축할 수 있도록 도와주는 웹 프레임워크이다. Express는 라우팅, 미들웨어 지원, HTTP 요청 및 응답 처리, 템플릿 렌더링 등의 기능을 제공하여 Node.js로 웹 애플리케이션을 개발할 때 필수적인 도구이다.

2. HTTP Request

HTTP 요청은 클라이언트가 서버에 보내는 데이터이다. 일반적으로 URL, HTTP 메서드(GET, POST, PUT, DELETE 등), 헤더, 본문(body) 등을 포함한다. 클라이언트는 이 요청을 통해 서버에 정보를 요청하거나 서버의 데이터를 변경할 수 있다.

HTTP 요청의 주요 부분:

  • URL: 요청하는 리소스의 주소이다. , /users/1은 사용자의 정보에 접근하는 경로일 수 있다.
  • HTTP 메서드: 요청의 종류를 정의한다. 예: GET (데이터 요청), POST (데이터 생성), PUT (데이터 수정), DELETE (데이터 삭제).
  • 헤더: 요청에 대한 추가 정보를 포함한다. 예: Content-Type, Authorization 등.
  • 본문: POST 또는 PUT 요청에서 서버에 보내는 데이터이다.

3. HTTP Response

HTTP 응답은 서버가 클라이언트에게 보내는 데이터이다. 이 응답에는 상태 코드, 헤더, 본문이 포함될 수 있다. , 200 OK는 요청이 성공적으로 처리되었음을 의미한다.

HTTP 응답의 주요 부분:

  • 상태 코드: 요청이 성공했는지, 오류가 발생했는지 등의 정보를 담고 있다. 예: 200 OK, 404 Not Found, 500 Internal Server Error.
  • 헤더: 응답에 대한 추가 정보를 포함한다. 예: Content-Type, Cache-Control 등.
  • 본문: 실제 응답 데이터가 포함된다. 예: HTML, JSON, 텍스트 등의 데이터.

4. 미들웨어 (Middleware)

미들웨어는 요청을 처리하는 과정에서 중간 단계로 작동하는 함수이다. Express.js에서 미들웨어는 요청을 받아서 응답을 보내기 전에 추가적인 작업을 수행할 수 있게 해준다. 요청이 들어올 때마다 미들웨어를 통해 지나가며, 여러 미들웨어가 연쇄적으로 실행된다.

미들웨어의 예:

  • 로깅: 모든 요청에 대해 로그를 출력하는 미들웨어.
  • 인증: 사용자가 로그인했는지 확인하는 미들웨어.
  • 데이터 파싱: 요청 본문(body)에서 JSON 데이터를 파싱하는 미들웨어.

미들웨어는 순차적으로 실행되며, 각각의 미들웨어는 next()를 호출하여 다음 미들웨어로 요청을 넘긴다. 만약 미들웨어가 응답을 보낸다면, next()를 호출하지 않고 응답을 종료한다.

 

미들웨어 처리 순서

  1. 클라이언트 요청: 클라이언트가 서버에 요청을 보낸다.
  2. 미들웨어 실행: 요청이 서버에 도달하면, 미들웨어가 차례대로 실행된다.
  3. 라우팅: 요청을 처리할 수 있는 라우트가 실행되고, 적절한 응답이 반환된다.

Turing.com - Middleware for Node.js

A Complete Guide on How to Build Middleware For Node.js.

 

 

 

 

 

 

 

 

  • Express JS는 웹 애플리케이션 개발을 위한 Node.js 프레임워크로, HTTP 요청과 응답을 쉽게 처리할 수 있게 도와준다.
  • 미들웨어는 요청과 응답 사이에 중간 처리를 하는 기능으로, 여러 미들웨어를 통해 순차적으로 작업을 수행할 수 있다.
  • HTTP 요청과 응답은 클라이언트와 서버 간의 데이터 교환을 위한 기본적인 단위이며, 이를 통해 다양한 작업을 수행할 수 있다.

 

 

 

미들웨어를 이용한 요청 시간 측정

Express 미들웨어를 사용하여 HTTP 요청과 응답을 처리하는 동안 소요된 시간을 측정하고, 해당 시간을 로그로 출력하는 기능을 구현한 예제이다.

 

app.use((req, res, next) => {
    // 요청이 시작된 시간을 기록한다.
    const start = Date.now();

    // 요청의 메서드와 URL을 로그로 출력한다.
    console.log(`${req.method} ${req.url}`);

    // 다음 미들웨어나 라우트 핸들러로 요청을 전달한다.
    next();

    // 요청이 완료된 후 소요된 시간을 계산한다.
    const diffTime = Date.now() - start;

    // 응답이 완료된 후 경과 시간을 로그로 출력한다.
    console.log(`end: ${req.method} ${req.url}, ${diffTime}ms`);
});

  1. const start = Date.now();:
    • 요청을 처리하기 시작할 때의 시간을 기록한다. Date.now()는 현재 시간을 밀리초 단위로 반환한다.
  2. console.log(${req.method} ${req.url});:
    • 요청을 받으면, HTTP 메서드(예: GET, POST 등)와 요청 URL을 콘솔에 출력한다.
    • , GET /home과 같은 형태로 출력된다.
  3. next();:
    • 이 부분은 요청을 다음 미들웨어나 라우터 핸들러로 전달하는 역할을 한다.
    • next()가 호출되어야만 요청이 실제로 처리되고 응답을 받을 수 있다.
  4. const diffTime = Date.now() - start;:
    • 요청이 끝난 후, Date.now()를 다시 호출하여 현재 시간을 구하고, 시작 시간과의 차이를 계산하여 요청 처리에 걸린 시간을 구한다.
  5. console.log(end: ${req.method} ${req.url}, ${diffTime}ms);:
    • 요청이 처리된 후 경과 시간을 출력한다. end: GET /home, 45ms와 같은 형식으로 출력된다.

미들웨어 작동 흐름

  1. 요청 시작: 클라이언트가 요청을 보내면, 첫 번째 미들웨어에서 요청을 받는다.
  2. 시작 시간 기록: 요청이 들어오면 시작 시간을 기록하고, 요청의 메서드와 URL을 로그로 출력한다.
  3. 요청 처리: next()가 호출되면서 요청은 다음 미들웨어나 라우터로 전달된다.
  4. 요청 종료 및 시간 계산: 요청이 처리된 후, 끝난 시간을 기록하여 처리 시간(diffTime)을 계산하고 로그로 출력한다.

 

 

 

 

 

 

요청 본문을 처리하는 미들웨어 사용 및 사용자 추가

Express.js에서 express.json() 미들웨어를 사용하여 HTTP POST 요청의 본문을 처리하고, 요청 본문에 담긴 데이터를 기반으로 새로운 사용자를 추가하는 기능을 구현

 
  1. app.use(express.json());:
    • 이 미들웨어는 요청 본문(body)이 JSON 형식일 경우, 해당 본문을 자동으로 파싱하여 req.body 객체에 저장해준다.
    • 즉, 클라이언트에서 보낸 JSON 데이터를 req.body에서 쉽게 사용할 수 있게 된다.
  2. app.post('/users', (req, res) => {...});:
    • 이 부분은 POST 요청이 /users 경로로 들어올 때 실행되는 라우트 핸들러이다.
    • 클라이언트에서 POST /users 요청을 보내면, 요청 본문을 처리하고 새로운 사용자를 추가하는 로직을 수행한다.
  3. console.log('req.body.name:' + req.body.name);:
    • 요청 본문에 포함된 name 값을 콘솔에 출력한다. , 클라이언트에서 { "name": "John" }라는 JSON을 보내면 req.body.name은 "John"이 된다.
  4. const newUser = { name: req.body.name, id: Users.length };:
    • 새로운 사용자 객체를 생성한다. req.body.name으로 받은 이름을 사용하고, 사용자 ID는 Users.length로 설정한다. Users.length는 현재 사용자 목록의 크기이므로, 이 값을 ID로 설정하여 사용자마다 고유한 ID를 부여한다.
  5. Users.push(newUser);:
    • 새로 생성한 사용자 객체를 Users 배열에 추가한다. 이 배열은 서버 내에서 사용자 목록을 저장하는 곳이다.
  6. res.json(newUser);:
    • 응답으로 새로 생성된 사용자 객체를 JSON 형식으로 클라이언트에 반환한다.
  •  

 

 

 

 

 

 

 

 

 

에러 처리

반응형