[AD]MCO VISA 암호화폐로 결제하자

개발] 공통 모듈을 만들어 보자 - nodejs

in zzan •  3 months ago  (Edited)

라이브러리 파일 만들기

규격(template)을 만들어 유사 형태로 만들어 낸다.

  • 작업 속도를 비약적으로 향상 시킬 수 있다.
  • 고민을 덜 하게 해준다.

적층형 구조 및 리팩토링

a
L b
__ L c

위 형태와 같이 구조를 잡아 주면서 작업을 진행한다. 바닥(a)을 만들고 점점 상위 구조(b -> c)를 구현한다. 바닥(a)이 탄탄하면 좋으나 첨부터 탄탄하긴 어렵다. 적절하게 만든 후 b, c ... 등의 상위 구조를 만들면서 중첩된 부분들은 리팩토링(재공정)과정을 거쳐가며 역할에 맞게 재 분류 작업을 수행한다.

기본이 되는 것이 무엇일까 ?

자주 사용하는 것이 아닐까 생각 해본다. 그래서 내가 자주쓰는 기본적인 것을( 범위, 색상, 방향성, 디버그 여부, 구분자, 기본경로 등) 바닥으로 만들어 사용하고 이것을 바탕으로 좀더 복잡하게 틀을 쌓아갈 예정이다.

샘플

아래는 현재 내가 쓰고 있는 기본바닥 파일의 예시다.

  • 외부 import 부분은 최대한 배제 ( 기본 import 로 처리 )
  • 구분하기 쉽게 중복되는 접두사(prefix - W) 사용
  • 고정된 나만의 방식의 명명 규칙 사용 - private 은 _로 시작, public 상수의 prefix 는 W, 함수는 _로 연결하며 읽기 쉽게 단어 형태로 구현
/*
    file    : wglobal.js
    title : 라이브러리 기본 공통
    since   : 2020.01.14
    desc    : 공용 상수, assert 관련 내용 포함
*/

//////////////////////////////////////////////////
// import - 라이브러리 로딩 

//////////////////////////////////////////////////
// private variables - 내부 사용 변수 

//////////////////////////////////////////////////
// private functions - 내부 사용 함수 : _로 시작 

//////////////////////////////////////////////////
// exports const - 외부 노출 상수 

/// 디버그 여부
const WIS_DEBUG = process.env.IS_DEBUG || false;

/// 파일 실행 경로
const WCWD = process.cwd();

/// 경로 구분자 
const WSEP = require('path').sep;

/// 캐릭터 셋
const WCHARSET = {
    UTF_8 : 'utf-8'
}

/// 방향
const WDIR = {
    LEFT    : 1,
    RIGHT : 2,
    UP      : 3,
    DOWN    : 4,
}

/// 색상값, 화면 출력용 로그 등에 사용
const WCOLOR = {
    ETC : {
        RESET           : "\x1b[0m",
        BRIGHT          : "\x1b[1m",
        DIM                 : "\x1b[2m",
        UNDERSCORE  : "\x1b[4m",
        BLINK           : "\x1b[5m",
        REVERSE         : "\x1b[7m",
        HIDDEN          : "\x1b[8m",
    },
    FG : {
        BLACK   : "\x1b[30m",
        RED         : "\x1b[31m",
        GREEN   : "\x1b[32m",
        YELLOW  : "\x1b[33m",
        BLUE        : "\x1b[34m",
        MAGENTA : "\x1b[35m",
        CYAN        : "\x1b[36m",
        WHITE   : "\x1b[37m",
    },
    BG : {
        BLACK   : "\x1b[40m",
        RED         : "\x1b[41m",
        GREEN   : "\x1b[42m",
        YELLOW  : "\x1b[43m",
        BLUE        : "\x1b[44m",
        MAGENTA : "\x1b[45m",
        CYAN        : "\x1b[46m",
        WHITE   : "\x1b[47m",
    }
}

/// 범위값을 만들거나 랜덤값등을 만들 때 사용 가능
const WCHARS = {
    HANGUL : /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/,
    NUMBER : '0123456789'.split(''),
    ALPHABET_L : 'abcdefghijklmnopqrstuvwxyz'.split(''),
    ALPHABET_U : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''),
    ALPHABET_A : 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''),
    NUMBER_ALPHABET : '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''),
}

//////////////////////////////////////////////////
// exports functions - 외부 노출 함수 


/// 무조건 메시지[message]를 포함하여 오류를 발생 시킨다
const assert_error = (message) =>{
    if( typeof Error !== 'undefined'){
        throw new Error(message);
    }
    throw message;
}

/// 해당 함수(fn)의 파라미터를 적용하여[args[0] ~ length-1] 예상결과 [args-1]가 맞는지 여부를 확인
const assert_fn = (fn, ...args) => {

    let params =  args.splice(0, args.length-1);
    let expected = args[args.length-1];
    let result = fn.apply(null, params);    // call : single param, apply : multiple params.

    assert(
        (result?JSON.stringify(result):result)==(expected?JSON.stringify(expected):expected),
        `[utest] ${fn.name} is assertion failed - params : ${params}, expected : ${expected}, result : ${result}`
    );

    return true;
}

/// 참거짓[condition]에 따라 false 일 경우 메시지[message]를 출력한다
const assert = (condition, message) => {
    if(!condition){
        message = message || 'Assertion failed';
        assert_error(message);
    }
}

/// SLEEP 처리 await 과 함께 사용해야 된다.
const sleep = async (sec=3) => new Promise((resolve,reject)=>setTimeout(resolve), sec*1000);

//////////////////////////////////////////////////
// utest - 단위 테스트 

/// 단위테스트
const utest = () =>{
    console.log(`wglobal.js utest is passed.`);
}

//////////////////////////////////////////////////
// exports defaults - 모듈 사용 지정

module.exports = {
    WIS_DEBUG,
    WCWD,
    WSEP,
    WCHARSET,
    WCOLOR,
    WCHARS,
    WDIR,

    assert_error,
    assert_fn,
    assert,

    sleep,

    utest,
};

맺음말

이것은 예시일 뿐이고 나만의 방식으로 내가 쓰기 편하고 또한 남들도 이해하기 쉽게 경량형의 모듈을 만들어 사용하면 참 좋다.

보통 공용 라이브러리의 경우는 다양한 확장성을 기반으로 하기 때문에 보통 초기 학습 곡선이 큰 경우가 많은지라 나같은 경우는 프로젝트에서 사용하는 것은 어쩔 수 없지만 그 외의 것은 되도록 배제하고 만들어 사용하는 편이다.

무엇이 최고다 (Best practice) 라고 말하기는 쫌 애매한 감이 있긴한 이야기 였지만, 나에게 맞는 것을 찾다 보면 분명 지금보단 더욱 멋진 내 자신을 발견 할 수 있을 것이라 확신한다.

오늘도 행복한 하루 보내세요 ~

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!