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

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

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

하나의 메소드를 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

80 port에 대하여 Root가 아닌 다른 계정으로 서비스 하기

보안 취약점으로 인해 서비스에 대한 기동을 root가 아닌 다른 계정으로 하라는 지침이 내려왔다.

하지만 1024 포트 이하에 대한 서비스 권한은 root만 가지고 있다. 기존에 했던 방법은 계정을 생성하고 root와 같은 그룹으로 묶어서 처리한 기억이 있다.

이번에 찾은 방법은 authbind라는 라이브러리를 이용 하는 방법이다.

예제는 pm2를 이용하였는데, 아마 생각은 다른 프로그램 역시 동작 할것이다.

우선 다음 명령어를 이용하여 authbind를 설치 하고 %user% 는 사용하려는 계정으로 바꿔서 진행하면 된다.

$> sudo apt-get install authbind
$> sudo touch /etc/authbind/byport/80
$> sudo chown %user% /etc/authbind/byport/80
$> sudo chmod 755 /etc/authbind/byport/80

그리고 변경해야 하는 내용은 사용하려는 서비스의 기동을 다음과 같이 하면 된다.

$> authbind --deep %명령어% 

일일이 치기 귀찮다면 다음과 같이 alias를 사용자 프로파일에 추가한다.

# ~/.bash 또는 ~/.zshrc
$> vi ~/.bash
# 가장 하단에 다음 내역 추가 
alias 명령어='authbind --deep 명령어'

# 프로파일 재반영
$> source ~/.bash

pm2를 예를 들면 다음과 같다.

# ~/.bash 또는 ~/.zshrc
$> vi ~/.bash
# 가장 하단에 다음 내역 추가 
alias pm2='authbind --deep pm2'

# 프로파일 재반영
$> source ~/.bash

pm2의 경우 update를 authbind를 이용하여 해야 한다.

$> authbind --deep pm2 update

추가적인 방법으로는 포트 포워딩을 이용하여 처리하는 방법도 있다.

참고자료


Posted by lahuman