728x90
📍 29일 차 12.3. 금(온라인 강의)
어제에 이어서 express.js
사용법 그리고 middleware
, postman
을 이용한 RESTAPI
실습을 배웠다. 실습을 하면서 느낀건 예전에 정글사관학교 면접 보기 전 과제 시험에서 게시판 CRUD
구현하는 과제가 있었는데, R, U
기능을 해결하지 못했었다. 이전의 기억을 트라우마로 갖고 있어 CRUD
를 조금 회피(?)하게 되었지만, 이번에 완전히 정복하겠다는 의지로 공부했다. 나중에 백엔드 엔지니어와 협업할 때 서버에 관해 대화를 할 때 말이 잘 통할 정도로 성장하고 싶다.
❏ middleWare
- 미들웨어는
Express.js
동작의 핵심이다.HTTP
요청과 응답 사이에서 단계별 동작을 수행해주는 함수를 뜻한다. HTTP
요청이 들어온 순간부터express.js
가 실행된다. 미들웨어는HTTP
요청과 응답 객체를 처리하거나, 다음 미들웨어를 실행 할 수 있다.(순차적으로 처리한다.)HTTP
응답이 마무리 될때까지 미들웨어 동작 사이클이 실행된다.req
,res
,next
를 가진 함수를 작성하면 해당 함수는 미들웨어를 동작할 수 있다.
1. req: HTTP 요청을 처리하는 객체
2. res: HTTP 응답을 처리하는 객체
3. next: 다음 미들웨어를 실행하는 함수
RouteHandler
: 미들웨어의 한 종류, 라우팅 함수(get, post, put, delete 등)에 적용된 미들웨어, 일반적인 미들웨어와는 다르게 path parameter를 사용할 수 있다. 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();
}
middleware
는 적용되는 위치에 따라 애플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어로 분류 가능하다. 필요한 동작 방식에 따라 미들웨어를 적용할 위치를 결정한다.
// 애플리케이션 미들웨어
// use나 http method 함수를 사용하여 미들웨어를 연결 할 수 있다.
app.use((req, res, next) => {
console.log(`Request ${req.path}`);
next();
)
app.use(auth);
app.get('/', (req, res, next) => {
res.send('Hello express!')
})
// 라우터 미들웨어
// 특정경로의 라우팅에만 미들웨어를 적용하기 위한 방법
router.use(auth);
router.get('/', (req, res, next) => {
res.send('Hello Router!')
})
app.use((req, res, next) => {
console.log(`Request ${req.path}`);
next();
)
app.use('/admin', router)
// 미들웨어 서브스택
// 여러개의 미들웨어를 동시에 적용할 수 있음. 주로 한개의 경로에 특정해서 미들웨어를 적용하기 위해 사용
app.use(middleware1, middleware2...);
app.use('/admin', auth, adminRouter);
app.get('/', logger, (req, res, next) => {
res.send('Hello Router!')
})
- 오류처리 미들웨어: 일반적으로 가장 마지막에 위치하는 미들웨어, 다른 미들웨어와 달리 err, req, res, next 네 가지 인자를 가지며, 앞선 미들웨어에서 next 함수에 인자가 전달되면 실행됨
// next에 인자로 넘기면 중간을 건너뛰고 마지막 오류처리 미들웨어가 실행된다.
app.use((req, res, next) => {
if(!isAdmin(req)){
next(new Error("Not Authorized"))
return;
}
next();
})
app.get('/', logger, (req, res, next) => {
res.send('Hello Router!')
})
app.use((err, req, res, next) => {
res.send('Error Occurred!')
})
- 함수형 미들웨어: 하나의 미들웨어를 작성하고, 작동 모드를 선택해서 사용하고 싶을 경우, 미들웨어를 함수형으로 작성하여 사용한다. (예, 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를 인자로 가질 수 있다. app 혹은 router 객체에 연결해서 사용 가능하다. next에 인자로 넘기면 오류처리 미들웨어가 실행된다. 미들웨어에 값을 설정하고 싶다면 함수형 미들웨어로 설정하라.
728x90
❏ REST API
REST
아키텍처를 준수하는 웹API
,RESTFul
이라고도 부른다.API
: 서비스나 프로그램 간에 미리 정해진 기능을 실행할 수 있도록 하는 규약REST
: 웹에서 자료를 전송하기 위한 표현 방법의 아키텍처, 기본적인 REST 가이드를 따르면 조금 더 좋은 구조의 API를 구성할 수 있음- API의 동작을
HTTP method + 명사형 URL
으로 표현함./posts
url
은 게시글 자원을 가리킨다고 할 때 http method(get, post, put, delete)와 결합하여 api 동작을 정의한다. url
표현법: 자원을 복수형으로 표현하고 하나의 자원에 접근은 복수형 + 아이디를 통해 특정 자원에 접근한다. 예를 들어/posts
가 게시글 전체라고 한다면,/posts
은 1번 게시글이라는 자원을 표현함rest api
는url
을 통해 자원을 계층적으로 표현한다./users/1/posts
라는URL
은 1번 유저의 게시글 전체라는 자원을 나타낸다- restapi는 rest 아키텍처를 준수하는 웹 api를 의미하며, rest 아키텍쳐를 준수하는 간단한 방법으로 url을 통한 자원의 표현 방법과 http method를 통한 api 동작의 정의 정도만 사용해도 훌륭한 rest api를 구현할 수 있다.
❏ JSON
- JS에서 객체를 표현하는 표현식으로 시작했다. 데이터를 표현하는 방법이 단순하고 이해하기 쉬워서 데이터를 전송할 때 많이 사용한다.
- 웹 api는 데이터를 문자열로 전송한다. 어떤 객체를 웹 api를 통해 문자열로 전달하기 위해 json을 사용한다.
value
에는 어떤 값이라도 사용될 수 있다.
❏ Express.js로 REST API 구현하기
- 간단한 메모의 작성, 삭제, 확인 기능 api 구현
- express-generator를 사용하지 않고 MVC패턴 구현
❏ MVC 패턴
- 프로젝트의 기능들을 어떻게 분리할지에 대한 하나의 구성 방법
- model: 데이터에 접근하는 기능, 데이터 그 자체, 데이터의 읽기 쓰기는
model
을 통해서만 표현 - view: 데이터를 표현하는 기능, controller에 의해 데이터를 전달받고 화면에 표시하는 기능
- controller: model을 통해 데이터에 접근하여 처리 결과를 view에 전달하는 기능, 라우팅 함수가 controller기능을 수행한다.
express.js
는 기본적으로HTTP body
에 전달되는JSON
데이터를 처리하지 못함.express
에서 기본적으로 제공해주는express.json()
미들웨어를 사용해야JSON
데이터를 사용할 수 있a pp.use(express.json())
- 가장 마지막 미들웨어로 오류 처리 미들웨어를 적용하면 모든 라우팅에 공통적인 오류처리 로직을 적용할 수 있음
// 이전에 next()에 인자로 넘겨줌
app.use((err, req, res, next) => {
res.status(500);
res.json({
result: "fail",
error: err.message
})
})
- 모든 라우팅이 적용된 이후 사용되는 미들웨어는 설정된 경로가 없는 요청을 처리하는 Route Handler로 동작한다. Express.js 는 기본적으로 404 페이지를 가지고 있지만, 직접 처리가 필요할 때 Route Handler를 추가한다.
app.use((req, use, next) => {
res.status(404);
res.send({
result: 'fail',
error: `Page not found ${req.path}`
})
})
❏ postman
- API 테스트 도구로 HTTP 요청을 손쉽게 작성하여 테스트해볼 수 있게 도움을 준다.
❏ 미들웨어 작성과 사용
이하 실습 코드 생략
반응형
'Frontend > 엘리스 SW 엔지니어 트랙' 카테고리의 다른 글
[ 엘리스 SW 엔지니어 트랙 ] 31일차(7주차: 데이터베이스 연동 - Node.js, Session, JWT, 회원가입 및 로그인) (0) | 2021.12.07 |
---|---|
[ 엘리스 SW 엔지니어 트랙 ] 30일차 (0) | 2021.12.04 |
[ 엘리스 SW 엔지니어 트랙 ] 28일차 (0) | 2021.12.02 |
[ 엘리스 SW 엔지니어 트랙 ] 27일차 (0) | 2021.12.01 |
[ 엘리스 SW 엔지니어 트랙 ] 26일차(6주차: Node.js와 Express.js - npm, Middleware, MongoDB) (0) | 2021.11.30 |
댓글