Node.js에는 미들웨어(Middleware)라는 것이 존재한다.
단어의 뜻 그대로 요청 중간마다 거쳐가는 지점이라고 생각하면 이해가 쉬울 것 같다.
예를 들어 /test 로 요청을 했을 때 Main -> test로 들어가는 일반적인 구조가 있다고 가정해보자.
여기에 middle이라는 미들웨어를 추가하면 Main -> middle -> test 의 순서로 요청이 들어간다.
미들웨어는 상당히 유용하게 사용할 곳이 많다.
예를 들어 사용자의 요청이 들어올 때마다 로깅하는 시스템이 필요하다고 가정해보자.
먼저 middle.js라는 파일을 하나 생성한다.
그리고 위처럼 작성을 해준다. 3번째 인자는 next이다.
함수의 마지막 부분에 next()를 해줘야 스택에 저장되어 있는 다음 함수로 진입을 할 수 있다.
그리고 index.js에 아래의 라인을 추가한다.
반드시 라우팅이 선언된 부분 위쪽에 정의해줘야 해당 미들웨어를 먼저 거쳐갈 수 있다.
위와 같이 코드를 작성하고 /로 접속해보면 콘솔에 다음과 같이 로그가 찍히는것을 알 수 있다.
처음 미들웨어를 검색해본 계기는 JWT Token 인증을 구현할 때였다.
라우팅 함수를 통해 매 요청을 받을 때마다 JWT 토큰이 유효한지 검사를 해줘야 하는데,
매 함수마다 토큰이 유효한지 검사하는 라인을 추가한다면 상당히 비효율적인 코드일 것이다.
따라서 미들웨어에 Token verify함수를 등록함으로써 자동으로 모든 요청에 대해 검사하도록 만들었다.
간단하게 흐름만 표현하기 위해 실제 verify를 넣진 않았다.
단순히 토큰을 추출하고 1234인지 확인하는 루틴이다. 어차피 저 부분에 실제 jwt verify()를 사용해주면 똑같이 동작한다.
여기서 주의할점이 res.send() 이후에 next()를 해주면 안된다.
이미 index.js에서 특정 라우팅 때 Response를 보내도록 만들어 놨기때문에 응답을 중첩으로 보내면
Error: Can't set headers after they are sent.
에러가 발생한다.
예전에는 이미 만들어진 미들웨어만 등록해서 사용하다가 간단하게나마 직접 만들어서 사용해봤는데 상당히 유용한 기능이라는 생각이 든다.
'Coding > Etc' 카테고리의 다른 글
Javascript ES6 async/await에 대해서 (0) | 2018.07.11 |
---|---|
Node.js express CORS 허용하는 방법 (0) | 2018.07.10 |
GraphQL MySQL로 API서버 구축 방법 (0) | 2018.07.02 |
Github Updates were rejected because the remote contains work that you do 오류 해결방법 (0) | 2018.07.02 |
GraphQL로 API서버 만들어보기 (0) | 2018.07.01 |