node.js 는 브라우저 환경에서 동작하는 것이 아니기 때문에 DB를 사용하는데 부담이 없습니다. 하지만 설정값으로 사용되는 항목은 DB보다는 파일로 저장하는 경우가 더 많을 것입니다.

자바스크립트는 json 데이터를 사용하기 매우 쉽기 때문에 별다른 함수가 모듈이 필요없지만, 몇가지 조건이 추가된다면 이야기가 달라집니다. 그런데 npmjs 에서 제가 원하는 기능을 100% 만족하는 패키지가 없어서 직접 만들게 되었고, 처음으로 npmjs에 등록도 해보았습니다. 여기서는 제가 처음으로 만든 json-config 패키지를 소개하겠습니다.

경로 : https://www.npmjs.com/package/%40sub0709/json-config
설치 : npm install @sub0709/json-config
현재 버전 : 1.1.0

제가 영어를 잘못해서 npmjs에는 사용법이 진짜 엉터리 영어로 적혀있습니다. 여기 글에 있는걸로 보시는게 더 좋습니다;;;

load

json으로 저장된 설정파일을 불러오는 방법은 매우 간단합니다.

  1. const Configure = require('@sub0709/json-config');
  2. let conf = Configure.load('test-setting.json');

load() 함수를 호출할때 옵션을 변경할 수 있습니다.

forceSet : true/false (default false)
ignoreDataType : true/false (default false)
immediateFileSave : true/false (default false)

Configure.load('test-setting.json'); 를 실행하는 것은 아래 소스를 실행하는것과 동일합니다.

  1. let conf = Configure.load('test-setting.json', {
  2. forceSet : false,
  3. ignoreDataType : false,
  4. immediateFileSave : false
  5. });

아래 내용은 test-setting.json 에 저장됐다고 가정한 샘플 데이터입니다.

  1. {
  2. "dbInfo": {
  3. "db": {
  4. "host": "localhost",
  5. "port": 3781,
  6. "dbName": "testapp"
  7. },
  8. "option": {
  9. "order": "asc",
  10. "count": 1
  11. }
  12. }
  13. }

get

데이터를 읽는 방법은 두가지 입니다. get() 함수를 이용하여 읽을수도 있고, Configure의 속성으로 읽을수도 있습니다.

  1. console.log(conf.get('dbInfo.db.host')); // localhost
  2. console.log(conf.dbInfo.db.host); // localhost

set

설정값을 변경할 수 있습니다. set() 함수를 호출하면 됩니다. 만약 존재하지 않는 키에 저장하려고 할 경우엔 오류가 납니다.

  1. conf.set('dbInfo.db.host', 'local.app.com');
  2. console.log(conf.dbInfo.db.host); // local.app.com
  3. conf.set('dbInfo.db.abc', false); // Error: abc is not exist

하지만 설정파일을 load 할때 forceSet 값을 true로 한다면 존재하지 않는 키를 새로 만들면서 저장이 됩니다.

  1. conf.set('dbInfo.db.abc', false); // ok, dbInfo.db.abc maked
  2. console.log(conf.dbInfo.db.abc); // false

데이터 타입이 다른 경우엔 오류가 납니다. 예를들어 문자열로 저장된 키에 숫자 또는 불리언값을 저장하려고 할 경우 data type is different 오류가 발생합니다.

  1. conf.set('dbInfo.db.dbName', 999); // Error: data type is different

만약 ignoreDataType 을 true로 하여 설정파일을 로딩했다면 타입이 달라도 문제 없습니다.

save

변경된 설정을 파일로 저장할때는 save() 함수를 호출합니다.

  1. conf.save();

파일을 로딩할때 immediateFileSave 값을 true로 했다면 save() 함수를 호출할 필요가 없습니다. 설정값을 변경할때 즉시 파일로 저장됩니다.

store

설정의 일부가 아니라 설정 전체를 다른 항목으로 바꾸고 싶다면 store() 함수를 쓰면 됩니다.

  1. conf.store({aaa : 1});
  2. console.log(conf.aaa); // 1
  3. console.log(conf.dbInfo); // error, dbInfo is not exist