지난 시간엔…

  • cheerio 로 파싱을 해봄
  • 코드를 줄이고 싶어짐

코드를 심플하게 해보자

// 목록 얻어오고
const itemList = await getItemList(count);

// 조건에 맞는 종목으로 필터
const reasonableItemList = await getReasonableItemList(itemList);

// 출력
console.info('========== OUTPUT ==========');
_.forEach(reasonableItemList, (item) => {
  console.info(`${item.nm} \t|${item.nv}\t|${item.concensus}\t|${item.rate}\t|${item.ratio}`);
});

간단해 졌다.

그럼 무언가 얻어오는 부분은 어떻게 고쳤을까?

AXIOS 사용 부분을 추상화 하였다.

const _get = (validator, getter) => (urlGetter) => async (param) => {
  const requestUrl = urlGetter(param);
  Info(`param : ${param}`);
  Info(`requestUrl : ${requestUrl}`);
  const response = await axios.get(requestUrl);

  if(validator(response) !== true) {
    throw new Error("No Data");
  }
  const result = getter(response);
  Log(result);
  return result;
}

잘하는 것일까?

디버깅 하기 귀찮을 수 있다.

요청 url 과 response 검증 및 받을 data 에 대한 부분을 추상화 해보았다.

그리고 이걸 이어 받아서

const _JsonGet = _get(
  jsonValidator,
  (response) => response.data.result
);

const _JsonItemListGet = _get(
  jsonValidator,
  (response) => response.data.result.itemList
);

const _HtmlGet = _get(
  (response) => !!response.data && response.status === 200,
  (response) => response.data
);

이렇게 만들었는데…

원래 HTML 과 JSON 으로 나누려고 했는데 또 이게 달라서 결국 3개로 나누었다.

이러려고 한게 아닌다..

실제 최하위 layer

// JSON
const getItemList = _JsonItemListGet(getItemListURL);
const getTrend = _JsonGet(getTrendURL);
// HTML
const getOverallInfo = _HtmlGet(getOverallInfoURL);

아래는 한줄로 끝이 나지만…

흠 약간 모르겠다.

나중에 확장을 하면 좋겠고 abstract 가 test 가 잘 되면 모르겠는데 이건 나중에 힘들 수 있다.

다만 의견이 잘 맞으면 계속 뽑아 낼 수 있다.

흠 피로가 몰려 온다.

필터는 다음에 이야기 해보자

그리고 쿠팡 달아 봤다.

CPC 가 거의 안나오는 내 블로그에 광고라니…

그냥 관련해서 생각이 조금 있는데 나중에 정리해서 올려 볼까 한다.

EOF