TIL 리팩토링

Shin Woohyun·2022년 11월 22일
0

🌐주요 리팩토링 참고

mqtt client가 특정 토픽 리스트를 구독 중입니다.

구독 중인 토픽에서 메시지가 발행되었을 경우, onMessage 콜백함수가 실행됩니다.

콜백함수에서는 우선 버퍼 메시지를 검사해서 사용중이었습니다.

🍀msg to obj

버퍼 메시지의 타입이 object면 object를 출력하고, string 이면 string을 출력하는 함수를 작성하였습니다. 리팩토링 책을 읽다보니 하나의 함수가 두 가지의 출력을 하면 일관적이지 않고 이름을 보고 무슨 일을 하는 함수인지 바로 캐치하기 어렵다는 걸 깨달았습니다.

export function messageToString(message) {
  let json = message.toString();
  try {
    json = JSON.parse(json);
  } finally {
    return json;
  }
}

따라서 좀 더 직관적이고, 이해가 쉽고, 재활용하기 쉽게 나누어야 겠다고 생각했습니다.

그래서 버퍼 메시지를 우선 string으로 바꾸는 함수를 하나 작성했습니다.

export function bufferToString(buffer) {
  return buffer.toString();
}

해당 함수로 메시지가 비어있을 경우의 에러를 캐치하고 나서 isJson 함수로 json인지 아닌지를 체크했습니다.

export function isJson(string) {
  try {
    const json = JSON.parse(string);
    return typeof json === "object";
  } catch (err) {
    return false;
  }
}

해당 검증과정을 거친 뒤에 object로 변환하는 함수로 할당하였습니다.

export function bufferToString(buffer) {
  return buffer.toString();
}

함수를 나누고 나니 에러 핸들링의 시점이 더 명확해 졌습니다. 리팩토링 굳굳 👍

🍀publishMessage

error 메시지를 배포하는 함수를 작성했었습니다. 그런데 에러 메시지 말고 그냥 메시지도 같은 함수로 작성할 수 있으면 재사용하기 좋겠다고 생각했습니다.

export function publishErr(topic, command, detail) {
  mqttControl.client.publish(
    topic,
    JSON.stringify({
      command,
      sender: process.env.MQTT_HOST,
      error_code: 1,
      detail,
    })
  );
}

매개변수를 재활용하기 좋게 구성을 바꾸었고, default function parameter를 사용하여 값이 전달되지 않을 경우의 매개변수 초기화를 활용해서 내부의 body의 유동적 변화를 적용할 수 있게 하였습니다. 야호~! 🙌

export function publishMessage(topic, command, error_code, detail, obj = {}) {
  mqttControl.client.publish(
    topic,
    JSON.stringify({
      command,
      sender: process.env.MQTT_HOST,
      ...obj,
      error_code,
      detail,
    })
  );
}

🍀토픽 값 사용 Destructuring assignment

토픽이 string으로 주어지기 때문에 값으로 활용하기 위해 슬래시를 기준으로 스플릿해서 배열화 시켜서 0번째 자리, 1번째 자리 이렇게 활용하고 있었습니다.

그건 명확한 의미를 전달하지도 않고, 변화를 적용하려면 많이 뒤져봐야 한다는 단점이 있지 않겠습니까. 그래서 구조분해할당을 시도했습니다.

처음에는 모든 값을 할당하여 사용했는데 reservoir의 경우에는 reservoir_id만 필요했습니다.

그래서 다른 값은 무시하는 방법을 찾았습니다.

const [, reservoir_id] = topic.split("/");

그 결과 사용할 필요가 있는 값만 명명하여 사용할 수 있어서 의미가 명확해졌습니다. 굳굳

🍀body 줄이기 Spread syntax (...)

body에 들어가는 값이 변동이 많고, 다 풀어서 쓰고 있었습니다. 이걸 어떻게 줄여볼 수 있을까 하는 생각이 들었습니다.

할당도 나머지 값들을 묶어서 할 수 있었고, 사용도 편했습니다. 굳굳

let { command, sender, ...rest } = jsonToObject(strMessage);
await models.history.create({ command, ...rest });

그렇게 하루가 지나갔다고 한다….리팩토링을 하다보면 나도 소설처럼 술술 읽히는 코드를 짜고 싶다는 생각이 든당

0개의 댓글