[엘리스] 6주차-2 복습 정리

Hyejis·2023년 2월 3일
0

엘리스

목록 보기
11/11

Node.js & MongoDB

1. Middleware와 Restful API

1) Middleware

Express.js 동작의 핵심으로 HTTP 요청과 응답 사이에서 단계별 동작을 수행해주는 함수이다.

동작원리

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

Middleware 작성법

req, res, next를 가진 함수를 작성하면 해당 함수는 미들웨어로 동작할 수 있다.
req: HTTP 요청을 처리하는 객체
res: HTTP 응답을 처리하는 객체
next: 다음 미들웨어를 실행하는 함수


  • Route Handler: 미들웨어의 한 종류로 라이팅 함수(get, post, put, delete)에 적용된 미들웨어이며 path parameter를 사용할 수 있다.
const logger = (req, res, next) => {
  // req, res, next를 인자로 갖는 함수 작성 시 미들웨어가 된다.
  console.log(`Request ${req.path}`);
  next();	// next()함수가 호출되지 않으면 사이클이 멈춘다.
}
const auth = (req, res, next) => {
  if(!isAdmin(req)) {
    res.send("Not Authorized");
    return;
  }
  next();
}

req, res 객체를 통해 HTTP 요청과 응답을 처리하거나 next 함수를 통해 다음 미들웨어를 호출해야 한다.


미들웨어는 적용되는 위치에 따라 어플리케이션 미들웨어, 오류처리 미들웨어로 분류 가능하다.
필요한 동작 방식에 따라 미들웨어를 적용할 위치를 결정해야 한다.

  • 어플리케이션 미들웨어: use나 http method 함수를 사용해 미들웨어를 연결할 수 있다.
    미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법
    HTTP 요청이 들어온 순간부터 적용된 순서대로 동작한다.
app.use((req, res, next) => {
  console.log(`Request ${req.path}`);
  next();
});
app.use(auth);
app.get('/', (req, res, next) => {
  res.send('OK');
});
  • 라우터 미들웨어: 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법
    router 객체에 미들웨어가 적용되며, app 객체에 라우터가 적용된 이후로 순서대로 동작
router.use(auth);
router.get('/', (req, res, next) => {
  res.send('OK');
});
app.use((req, res, next) => {
  console.log(`Request ${req.path}`);
  next();
});
app.use('/admin', router);
  • 미들웨어 서브스택: use나 http method 함수에 여러 개의 미들웨어를 동시에 적용할 수 있다.
    주로 한 개의 경로에 특정해서 미들웨어를 적용하기 위해 사용하며 전달된 인자의 순서 순으로 동작한다.
app.use(middleware1, middleware2);
app.use('/admin', auth, adminRouter);
app.get('/', logger, (req, res, next) => {
  res.send('OK');
});
  • 오류처리 미들웨어
    일반적으로 가장 마지막에 위치하는 미들웨어로 err, req, res, next를 인자로 가진다.
    앞선 미들웨어에서 next 함수에 인자가 전달되면 실행된다.
app.use((req, res, next) => {
  if(!isAdmin(req)) {
    next(new Error('Not Authorized'));
    return;
  }
  next();
});
app.get('/', (req, res, next) => {
  res.send('OK');
});
app.use(err, req, res, next) => {
  res.send('Error Occurred');
});

함수형 미들웨어

하나의 미들웨어를 작성하고 작동 모드를 선택하면서 사용하고 싶을 경우 미들웨어를 함수형으로 작성하여 사용할 수 있다.
ex) API 별로 사용자의 권한을 다르게 제한하고 싶은 경우

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);

일반적으로 동일한 로직에 설정 값만 다르게 미들웨어를 사용하고 싶을 경우에 활용된다.

미들웨어: HTTP 요청과 응답 사이에서 동작하는 함수
req, res, next를 인자로 갖는 함수는 미들웨어로 동작할 수 있다.
qpp 혹은 router 객체에 연결해서 사용 가능하며, next에 인자를 넘기는 경우 오류처리 미들웨어가 실행된다.
미들웨어에 값을 설정하고 싶은 경우는 함수형 미들웨어로 작성 가능하다.


2) REST API(=RESTful API)

REST + API: REST 아키텍쳐를 준수하는 웹 API
API의 동작을 HTTP method + 명사형 URL로 표현

  • REST(REpresentational State Transfer)
    웹에서 자료를 전송하기 위한 표현 방법에 대한 아키텍쳐
    REST를 정확하게 구현하기 위해선 많은 제한 조건이 있다.
    기본적인 REST 가이드를 따르면 더 좋은 구조의 API를 구성할 수 있다.

  • API(Application Programming Interface)
    서비스나 프로그램 간에 미리 정해진 기능을 실행할 수 있도록 하는 규약

REST API 기본가이드

  • HTTP Method
    GET - 가져오기, POST - 새로 만들기, PUT - 수정하기, DELETE - 삭제하기
    /posts라는 URL은 '게시글'이라는 자원을 가리키며, 위와 같은 HTTP 메소드와 결합해 API 동작을 정의해야 한다.

  • URL 표현법
    REST API URL의 자원은 복수형으로 표현되며 하나의 자원에는 '복수형+아이디'로 접근한다.
    /post = 게시글 전체의 URL
    /posts/1 = 1번 게시글

  • 계층적 자원
    REST API는 URL을 통해 자원을 계층적으로 표현
    /users/1/posts = 1번 유저의 게시글 전체

REST API: REST 아키텍쳐를 준수하는 웹 API
URL을 자원 표현 방법, HTTP method를 통한 API 동작의 정의로 REST API를 구현할 수 있다.


3) JSON

JavaScript Object Notation
JS에서 객체를 표현하는 표현식으로 시작
데이터를 표현하는 방법이 단순하고 이해하기 쉬워서 웹 API에서 데이터를 전송할 때 표현식으로 주로 사용된다.
객체를 웹 API를 통해서 문자열로 전달하기 위해 JSON을 사용했다.
XML보다 JSON이 더욱 적은 표현식을 사용하여 데이터를 효과적으로 표현함

  • Object
    JSON에서 Object는 {"key": value}로 표현한다.
    value에는 어떤 값이라도 사용될 수 있다.(문자열, 숫자, JSON 객체 등)
    ex) {name: 'bibi', age: 20, nationality: 'korea'}

  • Array
    JSON에서 Array는 [item1, item2]로 표현한다.
    item에는 어떤 값이라도 사용될 수 있다. (문자열, 숫자, JSON 객체 등)
    ex) ['first', 10, {name: 'bob'}]


4) Express.js로 REST API 구형

MVC 패턴

Model - View - Controller를 구분하여 프로젝트 구조를 구성하는 것이다.
웹 서비스의 가장 대표적인 프로젝트 구성 패턴으로 프로젝트의 기능들을 어떻게 분리할지에 대한 하나의 구성 방법이다.

  • Model: 데이터에 접근하는 기능 또는 데이터 그 자체
    데이터의 읽기, 쓰기는 Model을 통해서만 이루어지도록 구성

  • View: 데이터를 표현하는 기능
    Controller에 의해 데이터를 전달 받고 데이터를 화면에 표시

  • Controller: Model을 통해 데이터에 접근해 처리 결과를 View로 전달
    웹서비스에선 주로 라우팅 함수가 해당 기능을 수행

Express.js 구현하기

JS의 Array 함수를 사용해 데이터 처리를 구현한다.
router와 route handler를 사용하여 HTTP 요청, 응답 처리 구현
오류처리 미들웨어를 사용해 오류를 처리하는 방법을 구현
정의되지 않은 라우팅에 대해 404 오류 처리 구현

  • JSON 데이터 처리 미들웨어
// index.js
app.use(express.json());

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

  • 오류처리 미들웨어
// index.js
app.use((err, req, res, next) => {
  res.status(500);
  res.json({
    result: 'fail',
    error: err.message,
  });
});

가장 마지막 미들웨어로 오류처리 미들웨어를 적용 시 모든 라우팅에 공통으로 오류처리 로직을 적용할 수 있다.

  • 정의되지 않은 라우티에 404오류 처리하기
// index.js
app.use((req, res, next) => {
  res.status(404);
  res.send({
    result: 'fail',
    error: `Page not found ${req.path}`
  });
});

모든 라우팅이 적용된 이후에 사용되는 미들웨어는 설정된 경로가 없는 요청을 처리하는 Route Handler로 동작한다.
Express.js는 기본적인 404 페이지를 가지고 있지만 직접 처리가 필요한 경우 이와 같은 Router Handler를 추가해야 한다.


5) Postman으로 API 테스트

Postman

API를 테스트할 수 있는 도구, HTTP 요청을 손쉽게 작성하여 테스트 해 볼 수 있게 도움
추가적으로 API를 문서화 할 수 있는 기능 및 다양한 도구를 제공

Postman으로 API 문서화

  1. workspace
  2. collection
  3. api request
  4. document (설명 역할)
  5. 전체 문서 확인

Postman으로 API 테스트

  1. HTTP Method 설정
  2. query param 사용
  3. path variable 사용
  4. body 사용

직접 해보기

API 문서
localhost:3000을 변수 {{HOST}}로 저장
image

  • MeMo List
    imageimage

  • MeMo Detail
    imageimage

  • MeMo Create
    imageimage

  • MeMo Edit
    imageimage

  • MeMo Delete
    imageimage


씁,, API 테스트는 잘 되는데 local에서 제대로 작동이 안된다..!
계속계속 뜯어보자ㅠㅠ

profile
프론트를 시작으로 풀스택을 걸쳐 모든 분야를 아우르고 싶은 야망이 살짝 있는 아기 개발자입니다.

0개의 댓글