본문 바로가기
node.js 교과서

[node.js 교과서 | 6장] 익스프레스로 웹 서버 만들기(2) : 자주 사용하는 미들웨어(+ html 파일 응답 받기 성공)

by 솨앙 2024. 9. 29.
반응형

2024.09.29 - [node.js] - [node.js 교과서 | 6장] 익스프레스로 웹 서버 만들기(1) : express설치, 기본 설정

미들웨어란?

  •  익스프레스의 핵심으로 요청과 응답의 중간에 위치하여 미들웨어라고 부른다
    • 라우터와 미들웨어도 익스프레스의 일부이다. 
  • app.js에서 app.use와 함께 사용. 익스프레스 서버에 미들웨어를 연결해보자

[연결 예시]

//app.js
const express = require('express'); 
const path = require('path');

const app = express();
app.set('port',process.env.PORT || 3000);

app.use((req,res,next)=>{ //모든 요청에서 미들웨어 실행
    console.log('모든 요청에서 다 실행됩니다');
    next(); //다음 미들웨어로
});

app.get('/',(req,res,next)=>{ //GET요청을 처리하는 라우트
    console.log('GET/요청에서만 실행됩니다'); //GET요청에서 실행
    next();
},(req,res)=>{ //강제 에러 발생
    throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
});

app.use((err,req,res,next)=>{ //에러처리를 위한 미들웨어
    console.error(err);
    res.status(500).send(err.message);
});

// 서버 시작
app.listen(app.get('port'), () => {
  console.log(app.get('port'),'번 포트에서 대기 중'); 
});
- 미들웨어는 위에서 아래로 순서대로 진행되면서 요청과 응답 사이에 특별한 기능을 추가할 수 있다.
- app.use() 를 통해 미들웨어를 등록할 수 있다.
[출처] https://velog.io/@seosu2000/Middleware%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

- 위의 코드와 같이 app.use나 app.get 라우터에 여러개의 미들웨어를 장착할 수 있다.

 

콘솔 및 화면 출력

  • 위의 코드는 직접 미들웨어를 작성해준 것이며 패키지를 설치할 수 있다

미들 웨어 패키지 설치

npm i morgan cookie-parser express-session dotenv

(dotenv는 미들웨어가 아닌 process.env를 관리하기 위해 설치한 것)

 

[패키지를 설펴보기 위한 테스트 코드]

 

먼저 .env 파일을 생성해줍니다.

- . env 파일은 환경 변수를 저장해두는 파일입니다.

- 데이터베이스 비밀번호, API 키, 포트 번호 등과 같은 민감한 정보를 코드에 직접 작성하지 않고 .env 파일에 저장할 수 있습니다.

//.env
COOKIE_SECRETE = cookiesecret
//app.js
const cookieParser = require('cookie-parser'); //설치했던 패키지들을 불러오기
const express = require('express'); 
const morgan =require('morgan');
const session  = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config(); //dotenv 패키지는 .env 파일을 읽어 process.env를 만든다.
const app = express();
app.set('port',process.env.PORT || 3000);

app.use(morgan('dev')); //app.use에 연결
app.use('/',express.static(path.join(__dirname,'public')));
app.use(express.json());
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
    resave : false,
    saveUninitialized : false,
    secret: process.env.COOKIE_SECRET,
    cookie:{
        httpOnly:true,
        secure : false,
    },
    name :'session-cookie',
}));
app.use((req,res,next)=>{
    console.log('모든 요청에서 다 실행됩니다');
    next();
});

app.get('/',(req,res,next)=>{
    console.log('GET/요청에서만 실행됩니다');
    next();
},(req,res)=>{
    throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
});

app.use((err,req,res,next)=>{
    console.error(err);
    res.status(500).send(err.message);
});

// 서버 시작
app.listen(app.get('port'), () => {
  console.log(app.get('port'),'번 포트에서 대기 중'); 
});

 

자주 사용하는 미들웨어 간단 설명 :  나중에 필요한 부분은 더 자세하게 다룰 것

1. morgan

- 위의 코드를 실행시켰을 때 아까와는 콘솔에서 추가적인 로그를 확인할 수 있다.

- 이는 morgan 미들웨어에서 나오는 것으로 요청과 응답에 대한 정보를 콘솔에 기록해준다.

- 현재 코드에서는 app.use('dev')로 사용중이지만,  'combined', 'common', 'short', 'tiny' 등을 넣을 수 있다.

- 'combined' : 배포환경에서 주로 사용되며 , 접속 IP를 로그에 남겨준다
- 'common' : - - [29/Sep/2024:06:18:48 +0000] "GET / HTTP/1.1" 500 50 (사용자 인증 정보, 요청시간, 요청 메소드, http상태코드, 응답바이트 수 등)
- 'short' : 기본 설정보다 짧은 로그를 출력하고, 응답 시간을 포함한다. : - GET / HTTP/1.1 500 50 - 3.080 ms
- 'tiny' : 더 최소화 : GET / 500 50 - 7.080 ms

 

2. static

- 기본적으로 제공 되기 때문에 따로 설치할 필요 없다.

 사용 방법 : app.use('요청경로', express.static('실제경로'));

app.use('/',express.static(path.join(__dirname,'public')));

 

- 예시코드에서는 public폴더가 지정되어있다. 따라서 'public/styleshhets/style.css'는 'http://localhost:3000/stylesheets/style.css로 접근할 수 있다.


 

엇 이 설명을 읽고 전 게시글에서 실패했던게 생각났다! 이 미들웨어를 사용하면 성공할 수 있을 것 같은데?!

- 작업중인 폴더에 public 폴더를 만들고 내가 가지고있는 template 폴더를 넣어주었다.

http://localhost:3000/clinic-website-template/about.html

그리고 이전에 시도했던  about.html을 불러봤더니..?

짜잔 성공

ㅎ 이제 막 공부를 시작한 감자에게는 이런 성공이 넘 기쁘다..ㅎ

 

3. body-parser

- 요청 본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어 이다

- express 4.16.0 버전 부터는 익스프레스에 내장되어있어 따로 설치할 필요가 없으나 필요한 경우 설치를 해주도록 하자.

npm i body-parser

- body-parser는 JSON과 URL-encoded형식의 데이터 외에도 Raw, Text형식의 데이터를 추가로 해석할 수 있다.

app.use(express.json());

- 예시코드에서는 이렇게 사용되었다

- 클라이언트가 JSON 형식으로 데이터를 보낼 때, 이를 JavaScript 객체로 변환합니다

ex. {name : 'sua', book : node.js}와 같은 JSON형식을 본문으로 보낸다면 req.body에 그대로 들어간다.

 

4. cookie-parser

- 요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만든다. 

 사용 방법 : app.use(cookieParser(비밀키));

app.use(cookieParser(process.env.COOKIE_SECRET));

 

5. express-session

- 세션 관리용 미들웨어

- 로그인 등의 이유로 세션을 구현하거나, 특정 사용자를 위한 데이터를 임시적으로 저장해둘 때 유용하다.

- 세션은 사용자 별로 req.session 객체 안에 유지 된다.

app.use(session({
resave : false
saveUninitialized : false,
secret: process.env.COOKIE_SECRET,
cookie:{
httpOnly:true,
secure : false,
},
name :'session-cookie',
}));

 

-(참고)  cookie-parser 뒤에 두는 것이 좋다

resave : 요청이 올떄 세션에 수정 사항이 생기지 않더라도 다시 저장을 할지
saveUninitialized : 세션에 저장할 내역이 없더라도 처음부터 세션을 생성할지
secrete의 값은 cookie-parser의 secrete과 동일하게 하는게 좋다
cookie : 쿠키 옵션에 대한 설정
- httpOnly : true -> 클라이언트는 쿠키를 확인하지 못하도록
- secure : false -> https 환경이 아니더라도 사용할 수 있도록, 배포시에는 true 로 설정하는 것이 좋다.
name : 세션 쿠키의 이름 ( 기본이름은 connect.sid)
+ store : 배포시에는 데이터베이스를 연결하여 세션을 유지하는 것이 좋다.
반응형