지난 시간엔…
- 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