[엘리스 SW트랙 4기] 6주차 - Day 28: Express-Middleware, REST API

랸나·2023년 4월 5일
0
오늘의 한줄 요약 : 몽고DB깔다가 뭔가 잘못돼서 컴 밀었당... 맥쓰는데 왜..

01. Express.js의 Middleware

  • Middleware : Express.js동작의 핵심, HTTP요청과 응답 사이에서 단계별 동작을 수행해주는 함수.
  • 미들웨어는 HTTP요청이 들어온 순간부터 시작이 됨
  • 미들웨어는 HTTP요청과 응답 객체를 처리하거나, 다음 미들웨어를 실행할 수 있음.
  • HTTP응답이 마무리 될 때 까지 미들웨어 동작 사이클이 실행됨.

02. Middleware의 작성과 사용

middleware 작성법

  • req, res, next(다음 미들웨어 실행) 를 가진 함수를 작성하면 해당 함수는 미들웨어로 동작
const logger = (req, res, next) => {
	console.log(`Request ${req.path}`);
  	next();
}

const auth = (req, res, next) => {
	if(!isAdmin(Req)) {
    	res.send("Not Authorized");
      	return;
    }
  	next();
}
  • next()함수가 호출되지 않으면 미들웨어 사이클이 멈추기 때문에 주의.

Route Handler와 middleware

  • Route Handler도 미들웨어의 한 종류
  • Route Handler는 라우팅 함수(get, post, put, delete등) 에 적용된 미들웨어
  • 일반적인 미들웨어와는 다르게 path parameter를 사용할 수 있음

미들웨어 종류

어플리케이션 미들웨어(application middleware)

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

app.use(auth);

app.get('/', (req, res, next) => {
	res.send("Hello Express");
}
  • use 나 http method 함수를 사용하여 미들웨어를 연결할 수 있음.
  • 미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법
  • HTTP요청이 들어온 순간부터 적용된 순서대로 동작함.

라우터 미들웨어

router.use(auth); //3번째 실행

router.get('/', (req, res, next) => {
	res.send("Hello Express");
} //4번째 실행

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

app.use('/admin',router); // 2번째 실행
  • router객체에 미들웨어가 적용되는 것 외에는 어플리케이션 미들웨어와 사용 방법은 동일
  • 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법
  • app 객체에 라우터가 적용된 이후로 순서대로 동작함.

미들웨어 서브스택

app.user(middleware1, middleware2, ...);

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

app.get('/', logger, (req, res, next) = {
	res.send("Hello Express");
});
  • use나 http method 함수에 여러 개의 미들웨어를 동시에 적용 가능.
  • 주로 한개의 경로에 특정해서 미들웨어를 적용하기 위해 사용
  • 전달된 인자의 순서 순으로 동작

오류처리 미들웨어

app.use((err, req, res, next) => {
	res.send('Error Occurred');
})
  • 일반적으로 가장 마지막에 위치하는 미들웨어
  • err, req, res, next 이렇게 네가지 인자를 갖게 됨.
  • 앞선 미들웨어에서 next 함수에 인자가 전달되면 실행됨. (중간에 있는 다른 미들웨어 뛰어넘고 오류처리 미들웨어 실행됨)

함수형 미들웨어

  • 하나의 미들웨어를 작성하고, 작동 모드를 선택하며먄서 사용하고 싶을 경우 미들웨어를 함수형으로 작성 가능
  • e.g. 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('/admin', auth('member'), userRouter)

03. REST API

REST API란?

  • REST 아키텍쳐를 준수하는 웹 API
  • RESTful API라고도 부름

API란?

  • Application Programming Interface
  • 서비스나 프로그램 간에 미리 정해진 기능을 실행할 수 있도록 하는 규약
  • 운영체제 API, 프로그램언어 API, 웹 API등이 있음.

REST란?

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

REST API 기본 가이드 - HTTP Method 사용

  • REST API는 API의 동작을 HTTP method + 명사형 URL로 표현
  • /posts 라는 URL은 '게시글' 이라는 자원을 가리킬때, GET(가져오기), POST(새로 만들기) , PUT(수정하기), DELETE(삭제하기) 의 HTTP method와 결합하여 API동작을 정의해야함.

REST API 기본 가이드 - URL 표현법

  • REST API URL의 자원은 복수형으로 표현됨.
  • 하나의 자원에 대한 접근은 복수형 + 아이디를 통해 특정 자원에 접근함. /posts는 '게시글 전체'를 칭하는 URL이라고 할 때, /posts/1은 '1번 게시글'이라는 자원을 표현함.

REST API 기본 가이드 - 계층적 자원

  • REST API는 URL을 통해 자원을 계층적으로 표현함.
  • /users/1/posts라는 URL은 '1번 유저의 게시글 전체' 라는 자원을 나타냄

REST API는 REST 아키텍쳐를 준수하는 웹 API를 의미하며, URL을 통한 자원의 표현 방법과, HTTP method를 통한 API 동작의 정의 정도만 사용해도 훌륭한 REST API구현 가능.

04. JSON

JSON 이란?

  • JavaScript Object Notation
  • 자바스크립트에서 객체를 표현하는 표현식으로 시작함
  • 데이터를 표현하는 방법이 단순하고 이해하기 쉬워서 웹 API에서 데이터를 전송할 때 표현식으로 주로 사용됨.

JSON을 사용하는 이유

  • 웹 API는 기본적으로 데이터를 문자열로 전송하게 됨.
  • 어떤 객체를 웹 API를 통해서 문자열로 전달하기 위해 JSON을 사용함
  • xml과 비교해서, JSON이 더 적은 표현식 사용해서 효율적임.

JSON 가이드 - Object

  • JSON 에서는 Object는 {"key":value}로 표현함
  • value에는 어떤 값이라도 사용될 수 있음. (문자열, 숫자, JSON 객체 등)
  • e.g. {"name" : "elice", "age" : 5, "nationality" : "kore" }

JSON 가이드 - Array

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

05. Express.js로 REST API 구현하기

  • 데이터베이스 없이 Node.js 모듈 활용
  • 간단한 메모의 작성, 수정, 삭제, 확인 기능 API 구현
  • express-generator를 사용하지 않고 MVC 패턴 구현.

MVC 패턴

  • MVC 패턴은 웹 서비스의 가장 대표적인 프로젝트 구성 패턴

  • 프로젝트의 기능들을 어떻게 분리할 지에 대한 하나의 구성 방법

  • Model - View - Controller를 구분하여 프로젝트 구조를 구성하는 것.

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

  • View : 데이터를 표현하는 기능을 의미함. 주로 Controller에 의해 데이터를 전달받고 전달받은 데이터를 화면에 표시해주는 기능을 담당

  • Controller : Model을 통해 데이터에 접근하여, 처리 결과를 View로 전달하는 기능을 의미. 웹서비스에서는 라우터가 컨트롤러의 기능을 수행함.

JSON 데이터 처리 미들웨어 사용하기

  • express.js 는 기본적으로 HTTP body에 전달되는 JSON 데이터 처리 못함.
  • express에서 기본적으로 제공해주는 express.json()미들웨어를 사용해야 사용 JSON 데이터 사용 가능.

06. Postman으로 API 테스트하기

Postman

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

Postman으로 API 문서화

1) collection 만들기
2) api request 만들기
3) document 작성하기
4) 전체 문서 확인하기

Postman으로 API 테스트하기

1) HTTP 메소드 설정하기
2) query param 사용하기
3) path variable 사용하기
4) body 사용하기

profile
백엔드개발자

0개의 댓글