이번에 함께 일하시는 분의 코드를 리펙토링하며 의견을 나누었다.

이번에 함께 일하는 분의 코드 리펙토링을 진행 하였다.

유지보수 가능한 코딩의 기술 자바편의 내용을 기준으로 리펙토링을 하였다.

하나의 메소드를 15라인을 넘지 않도록 하고 결과를 확인하니, 너무 세분화 하여 쪼갠 느낌이다.

하나의 메소드는 하나의 역활만 하도록 하고, 중복된 코드가 없도로 했다.

const __DEFAULT_SELECTBOX_STR = "선택해주세요";
const __ORDER_SELECT_BOX = ['cls-l', 'cls-m', 'cls-s', 'cls-d'];

const removeAllOptions = (isRemove, target) => {
    if(isRemove){
        target.find('option').remove();
        target.append(new Option(__DEFAULT_SELECTBOX_STR, ""));
    }
}

const resetSubSelectBoxOption = (target_id) => {
    let target_obj;
    let isResetSelectBox = false;
    __ORDER_SELECT_BOX.forEach(v => {
        target_obj = $("#"+v);
        if(v === target_id){
            isResetSelectBox = true;
        }
        removeAllOptions(isResetSelectBox, target_obj);
    });
}

const setClassification = (target, val, level) => {
    callClassification({'upper_prd_cls_cd' : val, 'cls_lvl_no' : level}, (res)=>{
        res.forEach(element => {
            target.append(new Option(element.PRD_CLS_NM, element.PRD_CLS_CD));
        });
    }); 
}

const setSubSelectBoxOption = ($target, val, level) => {
    resetSubSelectBoxOption($target.attr("id"));
    if (val === "") return;
    setClassification($target, val, level);
}

const setInitValue4SelectBox = (target, i) => {
    removeAllOptions(true, target);
    if (i === 0){
        setClassification(target, "", 1);
    }
}

const bindEventOnSelectBox = (target, i) => {
    if (i !== (__ORDER_SELECT_BOX.length-1)) {
        target.change(function() {
            setSubSelectBoxOption($("#"+__ORDER_SELECT_BOX[i+1]), $(this).val(), (i+2));
        });
    }
}

const initSelectBox = () => {
    __ORDER_SELECT_BOX.forEach((o, i) => {
        let target = $("#"+o);
        setInitValue4SelectBox(target, i);
        bindEventOnSelectBox(target, i);
    });  
    
}

$(document).ready(function() {
    initSelectBox();  
});

전체 diff로 원본 소스와 리펙토링된 소스 비교

이후 처리로 ESLINT와 TDD를 샘플링 해볼 예정이다.

한걸음 한걸음씩


Posted by lahuman

댓글을 달아 주세요

ORA-21561 OID generation failed

어제까지 문제가 없었는데 갑지가 node에서 Oracle 연결시 다음과 같이 오류가 발생 하였다.

> node ./bin/www
ORA-21561: OID generation failed

검색을 해보니 호스트네임의 문제라고 한다.

다음과 같이 해주면 처리가 된다.

echo "127.0.0.1 $(hostname)" | sudo tee -a /etc/hosts

그러면 /etc/hosts에 한줄이 추가 되고 재기동 하면 접속에 성공했다는 메시지를 확인할 수 있다.

> node ./bin/www
Connection was successful!

하루에 하나 이상은 배우는 구나!

참고자료


Posted by lahuman

댓글을 달아 주세요

node.js에서 버젼 변경 하기

오늘 특정 프로젝트를 받아서 빌드를 진행하는데 오류가 발생하였다.

$> npm install
.... 모듈 오류 발생 ...

원인은 node 버젼이 내 PC에 설치된 것은 11.x 이고 해당 모듈은 8.x 에서만 동작하였다.

버젼 변경을 어찌 해야하는지 고민하는 차에 함께 일하시는 분이 n 이라는 모듈을 이용하면 된다고 알려 주셨다.

# 설치 
$>sudo  npm install -g n

# Node 버전 중 설치된 버전 확인
$> n ls  

# Node 버전 설치  
$> n <version>  
# ex> n 8.13

# 최신 LTS Node 버전 설치
$> n latest  

# 제거할 Node 설정
$ n rm <version ...>  
#ex> n rm 8.9.1 8.9.2

# 현재 버전을 제외한 모든 버전 제거
$ n prune  

참고 주소


Posted by lahuman

댓글을 달아 주세요

node.js에서 global로 선언하는 2가지 방법

node.js를 이용하여 개발을 진항하는 중, static 변수 또는 전체 전역 클래스로 사용해야 하는 경우가 발생하였다.

node.js 사용한지 3주 밖에 안되어서 여러 가지를 검색 하였으나, 어떤 방식이 가장 좋은지 몰라 옆에서 일하시는 분에게 여쭤보았다.

두가지 방법을 알려주셨는데 다음과 같다.

  • global을 이용하는 방식

이 방법은 가장 간단하다 다음과 같이 어디서든 global에 추가를 해주면 된다.

//app.js
// global.변수명 = 사용하려는 변수명
let running = false;
global.running = running;


//test.js
//이후 다른 js에서 다음과 같이 사용 하면된다.
console.log(running);
running = false;
console.log(running);

해당 js 파일에 선언한 것과 같이 사용 할 수 있다.

  • require 를 이용하는 방식

이 방법은 node.js에서 require를 이용하여 call을 할 경우 cache 되는 것을 이용한다.

# test.js
module.exports = {running: true}

# app.js
let test = require('test.js');
test.running = false;
console.log(test.running);

노드가 재미 난다!

참고자료


Posted by lahuman

댓글을 달아 주세요