Node.js

node>환경변수 / 미들웨어

연습노트 2024. 7. 26. 21:39

지금까지 코드 작성한 것 중에

세션암호화비번, DB 접속용 URL 이런 것들은 여러분이랑 저랑 좀 다르겠죠?

이렇게 유저나 컴퓨터에 따라서 좀 달라져야하는 가변적인 변수들을 환경변수라고 부릅니다. 

이런 환경변수들은 서버파일에 하드코딩해놓는거보다 따로 별도의 파일에 보관하는게 좋습니다.

그래야 나중에 사람들이랑 소스코드 공유할 때도 비번유출같은게 없으니까 안전하고

클라우드에 서버를 배포할 때도 좀 편리하게 소스코드를 올릴 수 있습니다.

 

 

 

 

 

.env 파일에 환경변수 보관하려면

 

그래서 환경변수들은 보통 .env 파일에 보관하는데 그걸 쓰려면 

 

npm install dotenv  

1. 일단 터미널 열어서 dotenv 설치하고 

 

 

require('dotenv').config() 

서버파일 상단에 아무데나 추가하면 됩니다.

그럼 이제 .env 파일을 쓸 수 있습니다. 

 

 

 

 

▲ server.js 옆에 .env파일을 하나 만들어봅시다.

이게 환경변수 보관해두는 파일입니다. 

 

 

(.env 파일)

PORT=8080
DB_URL="mongodb+srv://codingapple1@저쩌구" 

변수 보관하려면

변수명작명= 변수에저장할값

이렇게 작성해서 환경변수들을 보관할 수 있습니다.

저장해둔 환경변수를 다른 파일에서 가져다쓰려면

소스코드에다가 process.env.PORT 이렇게 작성하면 그 자리에 8080이 남습니다.

 

그럼 이제 나중에 소스코드를 공유하거나 그럴 때 좀 안전하고

환경변수 변경도 편리해지겠죠?

그래서 그런것들은 다 여기에 보관합시다. 

 

 

(주의) 깃헙에 소스코드 올리는 분들이 많은데

.env파일은 깃헙이런데 올리시면 안됩니다. 그럼 DB 다 털릴듯

 

 

 

 

 

미들웨어 middleware

 

심심하니까 미들웨어에 대해 알아봅시다. 

몰라도 기능만드는데 큰 상관없는데 알면 코드관리하는 측면에서 도움이 됩니다. 

 

 

if(요청.user){
  로그인했군~
}

예를 들어 유저가 로그인 했는지 검사하는 코드를 수많은 API 안에서 실행해야한다고 칩시다.

API 마다 이걸 매번 3줄 작성하기 귀찮은겁니다. 

그럼 어떻게하죠?

 

 

function 힘수(요청){
  if(요청.user){
    로그인했군~
  }
}

app.get('/어쩌구', (요청, 응답)=>{
  함수()
})

어디서 자바스크립트를 잘 배운 분들은 함수를 쓰면 되지 않을까라는 생각을 하는데 실은 맞습니다.

함수를 하나 만들고 거기다가 저거 3줄의 코드 작성하고 

이제 필요할 때마다 함수() 사용하면 매번 3줄이나 작성할 필요가 없습니다.

참고로 함수로 싸맬 때는

코드 안의 변수들은 전부 파라미터로 입력받을 수 있게 하는게 좋아서 그렇게 쓰는게 좋은 함수작성법입니다.

 

 

 

function checkLogin(요청){
  if(요청.user){
    로그인했군~
  }
}

app.get('/어쩌구', checkLogin, (요청, 응답)=>{
  
})

근데 실은 이렇게 꽂아서 써도 됩니다.

여기다가 꽂는 코드들은 /어쩌구로 오는 요청과 응답사이에 자동으로 실행됩니다.

요청과 응답 사이에 실행되기 때문에 중간에 있다고 해서 이걸 멋있는 말로 middleware 라고 부릅니다.

 

왜 굳이 여기다가 적냐고요?

이뻐서 그럴 뿐입니다. 

뭔가 요청이랑 응답 사이에 실행되는 느낌도 나고 뭔가 깔끔해보이지 않습니까

맘대로합시다.

 

 

 

 

function checkLogin(요청, 응답, next){
  if(요청.user){
    next()
  } else {
    응답.send('로그인안했는데요?')
  }
}

app.get('/어쩌구', checkLogin, (요청, 응답)=>{
  
})

근데 실은 이렇게 꽂아서 써도 됩니다.

함수를 API 코드에 middleware 형태로 집어넣으려면 사용법이 따로 있는데

middleware로 사용할 함수를 만들 때 최소 3개의 파라미터를 집어넣어야합니다. 

3개 파라미터는 각각 요청, 응답, next 적어주면 됩니다.

 

그럼 평소에 쓰던 요청, 응답을 middleware 에서도 그대로 사용할 수 있습니다.

응답.redirect 응답.send 응답.render 

요청.body 요청.query 요청.user

전부 middleware 함수 안에서 사용이 가능합니다. 

 

next 파라미터는 뭐냐면 미들웨어 실행을 끝내고 다음으로 진행할지 여부를 여러분이 결정할 수 있습니다.

쉽게 말하면 그냥 next() 라고 실행하면 정상이니까 통과시켜주라는 소리입니다.

그래서 유저를 쫒아낼게 아니면 미들웨어용 함수 마지막에는 next() 써주는게 좋습니다.

 

(참고)

- 미들웨어 몇개 더 집어넣고 싶으면 [함수1, 함수2, 함수3] 이렇게 array 형태로 넣을 수 있습니다. 

- 미들웨어 안에서 응답해버리면 그 밑에 있는 나머지 코드들은 아마 실행이 안됩니다.

 

 

 

 

 

 

app.use로 middleware 일괄등록하기

 

근데 middleware 써도 귀찮은 경우가 있는데

API가 1000개에 middleware를 적용해야하는 경우 거기다가 전부 middleware를 복사붙여넣기하는게 귀찮습니다. 

그러면 app.use() 를 쓰면 됩니다.

 

 

app.use(checkLogin)

app.get('/어쩌구', (요청, 응답)=>{
  (checkLogin 미들웨어 자동적용됨~~)
})

app.use() 열고 그 안에 middleware를 집어넣으면

이 코드 밑에 있는 모든 API들은 전부 요청이랑 응답사이에 이 middleware를 실행해주고 지나갑니다.

이게 API들에 middleware 전부등록하는 문법입니다.

편리하죠? 

 

 

app.use('/어쩌구', checkLogin)

app.get('/어쩌구', (요청, 응답)=>{
  (checkLogin 미들웨어 자동적용됨~~)
})

참고사항으로 app.use 파라미터에 URL을 적을 수 있는데

그러면 이 URL로 시작하는 API들에만 적용해줍니다.

 

그래서 위의 코드는

/어쩌구

/어쩌구/a

/어쩌구/b

이런 API들에만 적용되겠군요.

 

그래서 결론은 API들마다 공통적으로 실행하고싶은 코드가 있으면

미들웨어를 쓰면 편리할 수도 있습니다.