
Refactoring 이란,
겉보기 동작은 그대로 유지하고, 코드를 이해하고 수저하기 쉽게 내부 구조를 변경하는 것
하게 된 계기
1. 단순화 하여 작업이 가능 유지보수의 능률을 좀 더 올리기 위해
2. legacy code 수정 및 불필요한 코드 수정 작업 진행
else if (currentRecType === 'type_number') {
return (
<Select
defaultValue={defaultValue}
onChange={value => handleSelectChange(value)}
value={selectedValue !== undefined ? selectedValue : defaultValue}
style={{ width: 200, marginRight: 10 }}
>
{contentIdData
? contentIdData.map((section: string) => (
<Select.Option key={section} value={section}>
{section}
</Select.Option>
))
: null}
</Select>
);
}
이게 현재 기존 코드 이고 type_number에 따라서 select에 해당하는 값들이 변하게 된다. 하지만 초기에 else if를 활용하여 type_number를 계산하여 활용함
문제점
1. type_number가 늘어날수록 else if문에 대한 조건문이 많아짐
2. contentIdData 에 대한 데이터는 string[] | null 일수도 있음
3. contentIdData 에 빈 "" 스트링값이 전달되는 경우가 있음
해결책
1. javascript 메서드 include를 활용하여
-> allRectype.include(currentRecType)으로 바꾼 후 return select로 변경
2. contentIdData의 props로 전달 받을 때 contentIdData의 || undefined로 해결
3. contentIdData를 props로 받아오기 때문에 let으로 할당 해준 후 이 값을
const contentIdData = useMemo(() => {
return Array.isArray(contentId?.data)
? contentId?.data.filter(item => item !== '')
: contentId?.data ?? null;
}, [contentId?.data]);
filter와 옵셔널 체이닝을 활용하여 빈값이 아닌 경우만 데이터를 담아서 새로 할당해줌 이 부분은 비즈니스 훅 모형에서 활용함
if (
allRecType.includes(currentRecType)
) {
return (
<Select
placeholder={defaultValue}
defaultValue={defaultValue}
style={{ width: 200, marginRight: 10 }}
value={selectedValue !== undefined ? selectedValue : defaultValue}
onChange={(value) => handleSelectChange(value)}>
{contentIdDataProcessed
? contentIdDataProcessed.map((section: string) => (
<Select.Option key={section} value={section}>
{section}
</Select.Option>
))
: null}
</Select>
);
} else {
return null;
}
};
결과
반복적인 코드 생략 가능 좀 더 간결하게 하자면 이 allRecType.includes(currentRecType) 이 부분 을 변수명으로 선언한 후 if문 제거 후 ? 로 치환가능
const recType = useAppSelector(rectypeSelector);
const demoData = useAppSelector(demoSelector);
const xType = useAppSelector(xTypeSelector);
const contentId = useAppSelector(contentIdSelector);
const currentRecTypeSelectorResult =
const currentTab = useAppSelector(currentTabSelector);
const randomInputContentsId = useAppSelector(randomInputContentsIdSelector);
const { loading: recTypeLoading = false, data: recTypeResult = null } =
recType ?? {};
const {
target: recommenedTargetData = null,
results: recommenedResultsData = null,
} = demoData?.data ?? {};
단순한 선언 호출 부 지만 이 부분 또한 좀 더 간략하게 리펙토링이 가능
문제점
1. 코드의 가독성이 떨어짐 - 각각의 useselector 선언으로 인해 가독성이 떨어짐
2. 의존성 관리 하기가 힘들어짐
// useSelector
const {
recType,
demoData,
xType,
contentId,
currentRecTypeSelectorResult,
currentTab,
randomInputContentsId,
} = useSelectors();
function useSelectors() {
return {
recType: useAppSelector(rectypeSelector),
demoData: useAppSelector(demoSelector),
xType: useAppSelector(xTypeSelector),
contentId: useAppSelector(contentIdSelector),
currentRecTypeSelectorResult: useAppSelector(currentRecTypeSelector),
currentTab: useAppSelector(currentTabSelector),
randomInputContentsId: useAppSelector(randomInputContentsIdSelector),
};
}