본문 바로가기
👾개발지식/etc

[Node.js] 내부 환경변수 보관 방법/DB모듈 싱글톤 연결/라우팅 방법

by 서버요정 호토론 2021. 11. 8.

내부 환경변수 보관 방법

1. 코드 내에 하드코딩하기

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});
  • 단점 : github과 같은 SCM를 사용하는 경우, 비밀 정보가 노출되므로 별도의 행위가 필요

2. 설정파일 사용하기

var mysql      = require('mysql');
var db_config 	= require('./config/db-config.json');

var connection = mysql.createConnection({
  host     : db_config.host,
  user     : db_config.user,
  password : db_config.password,
  database : db_config.database
});
{
  "host": "localhost",
  "user": "me",
  "password": "secret",
  "database": "my_db"
}

설정 정보를 JSON file에 저장해 두고 require()를 사용하여 필요 정보를 get한다.

  • 단점: 하드코딩하는 경우의 단점 중 관심사의 분리 문제는 해결되었지만 설정 정보가 코드에서 분리되었을 뿐이므로 SCM을 이용한 배포시에 주의해야 한다.
  • .gitignore file에 설정파일을 추가하여 SCM에 저장하지 않는다.

3. command-line에서 argument요구하기

// secret-arg.js
var nopt = require("nopt")

var longOpts = {
  "sessionSecret": String,
}

var shortOpts = {
  "s": ["--sessionSecret"],
}

var parsed = nopt(longOpts, shortOpts, process.argv, 2)

console.log("session secret is:", parsed.sessionSecret)
//bash
node secret-arg.js --sessionSecret "keyboard cat"
node secret-arg.js -s "keyboard cat"

nopt package를 사용하여 argument로 세션 키를 요구하는 예제이다.

  • 단점: 하드코딩이나 설정파일로 가지고 있는 것보다 안전해졌지만 앱을 실행할 때마다 입력해야 할 정보의 양이 많아져 번거로울 수 있다.

4. 환경변수 사용하기

export SESSION_SECRET="keyboard cat"
var express = require('express')
var session = require('express-session')

var app = express()

app.use(session({secret: process.env.SESSION_SECRET}))

command-line에서 argument와 비교했을 때 nopt 패키지를 별도로 사용하지 않아도 된다는 점과 매번 설정 정보를 입력하지 않아도 된다는 장점이 있다.



DB싱글모듈 싱글톤 연결하기

싱글톤 패턴 이란?

애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다. (자바에선 생성자를 private로 선언해서 생성 불가하게 하고 getInstance()로 받아쓰기도 함)

=> 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.

(인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일(기존) 인스턴스를 사용하게함)

싱글톤 패턴 의 장점

  • 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음
  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
  • DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.
  • 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용
  • 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아짐

싱글톤 패턴의 단점

  • 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 위반) ==> 수정이 어려워지고 테스트하기 어려워진다
  • 멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있음

DB모듈 싱글톤 연결하기

node.js에서는 require을 사용함으로써 싱글톤을 만들 수 있다



모듈 외부에서 사용하기

모듈 이란?

"외부에 영향을 받지 않는 독립된, 재사용 가능한 코드들의 묶음" 으로 루비의 gem과 비슷한 라이브러리라고 보면 된다.



라우팅 방법

라우팅이란?

어플리케이션 앤드 포인트 (URI)의 정의, 그리고 URI가 클라이언트 요청에 응답하는 방식을 말한다.

var express = require('express');
var app = express();

app.get('/users', function (req, res) {
  res.send('list of users')
});

응답

라우트 로직을 구현한 뒤 클라이언트로 결과를 보내주어야 한다. 결과는 여러 형태가 될 수 있는데 res객체는 이러한 기능을 함수로 구현해 놓았다.

  • res.send(): 문자열로 응답
  • res.json(): json 객체로 응답
  • res.render(): Jade같은 템플릿을 렌더링
  • res.sendfile(): 파일 다운로드로 응답
  • res.set(): 헤더값을 세팅. 세팅 후 res.send()를 호출하면 바디없이 헤더만 보낼 수 있다.

참고

https://poiemaweb.com/nodejs-keeping-secret

https://jeong-pro.tistory.com/86

http://blog.jeonghwan.net/express-js-2-%EB%9D%BC%EC%9A%B0%ED%8C%85/

댓글