boardRefect
리팩토링 이전의 구조 파악
라우팅 구조
📦qna
┣ 📂answer
┃ ┗ 📜[id].tsx
┣ 📜list.tsx
┗ 📜question.tsx
컴포넌트 구조
📦QNA
┣ 📂Answer
┃ ┣ 📂FeedBack
┃ ┃ ┣ 📜FeedBackItems.tsx
┃ ┃ ┗ 📜FeedBackView.tsx
┃ ┣ 📜AnswerDragView.tsx
┃ ┣ 📜AnswerWirte.tsx
┃ ┣ 📜BoardItem.tsx
┃ ┣ 📜EditMenuBar.tsx
┃ ┗ 📜QuestionContent.tsx
┣ 📂Question
┃ ┣ 📜EssayDetailItems.tsx
┃ ┣ 📜EssayDetailView.tsx
┃ ┗ 📜QuestionWirte.tsx
┣ 📜BoardListItem.tsx
┣ 📜BoardListView.tsx
┗ 📜PageNation.tsx
Answer : 답변하기 관련
FeedBackItems : 댓글 관련 아이템
FeddBackView : 댓글 보여주기
AnswerDragView : 드래그 관련
AnswerWirte : 답변 작성
BoardItem : ???
EditMenuBar : 편집 메뉴
Question
EssayDetaillItems : 수필 상세보기 아이템
EssayDetailView : 수필 상세보기
QuestionWrite : 질문 작성
Board
BoardListItem : 게시판 아이템
BoardListView : 게시판 보여주기
PageNation : 페이지 네이션 토글 ?
컴포넌트 구조 개선 계획
네이밍 전략 : 의도가 분명할 것 => 자기소개서에 대한 질문의 답변에 특화된 게시판
자기소개서에 대한 질문와 답변에 특화된 게시판
Answer : 유지
FeedBackItems : 유지
FeedBackView → FeedBackLayout : 변경
AnswerDragView : 커스텀훅 고려 useTextDragView
AnswerWirte : 분할 고려
BoardItem → QuestionDetail 질문 메인 상세 보기
EditMenuBar : 유지
Question
EssayDetailItems → CoverLetterDetailItems : 자기소개서 상세보기 아이템
EssayDetailView → CoverLetterDetailLayout : 자기소개서 레이아웃
QuestionWrite → QuestionComposer : 질문 작성기
Board 디렉토리에서 별도 관리
BoardListItem → BoardListItem : BoardItem
BoardListView → BoardLayout : 게시판 레이아웃
PageNation : 커스텀훅으로 관리 고려 usePageNation
컴포넌트별 리팩토링 계획
Board
주요 문제점
현재는 CoverLetterQnA에 집중 되어 있습니다.
개선 방안
다른 카테고리를 추가해도 활용 할 수 있는 형태로 변형
유지보수가 효율적인 구조
특정 데이터에 한정 되지 않을 것
리팩토링 적용 구조
📦Board
┣ 📜BoardList.tsx
┣ 📜BoardListHead.tsx
┣ 📜BoardListItem.tsx
┗ 📜BoardListLayout.tsx
특정 데이터에 제한 받지 않고 원하는 형태의 게시판 생성에 용이한 구조로 개선하였습니다.
Props
는 상수화 하여 관리가 쉬워지고 유지보수의 효율이 높아졌습니다.
제니릭 타입을 사용하여 타입의 안정성을 지키면서 특정 데이터에 한정 되지 않게되었습니다.
Question: 질문하기
주요 리팩토링 사항
컴포넌트 분할
절차적인 성향의 코드
직관적 네이밍
setEssayTitle을 onChange Props으로 전달하여 EssayTitle의 상태를 변형하고 그 변화에 따라 useEffect를 동작 시키는 방식이 불필요한 절차적인 과정이라고 생각이 되었습니다.
handleChangeTitle을 onChange props로 전달하여 직접적으로 변경하는 방식으로 변환 하였습니다.
Answer : 답변하기 (게시글상세)
주요 문제점 :
리덕스, 모달 등 너무 많은 상태를 직접적으로 관여
의미를 알 수 없는 매직넘버
너무나도 많은 관심사
useEffect(() => {
if (!isNaN(Number(boardId.id))) {
dispatch(getBoardDetail(Number(boardId.id)));
setRemoveID(Number(boardId.id));
}
}, [router.query]);
페이지가 있음에도 컴포넌트에서 router.query 를 다루고 있음
페이지내에서 관리하는것으로 변경
correctionText.length < 30 || correction.targetAnswer === "";
{
correction.targetQuestion !== 0 ? correction.targetQuestion : "";
}
list === feedBackIndex ? "active_button" : " ";
의미 파악이 불명확한 매직넘버
AnswerDragView 같은 경우 현재 드래그에 관련된 상태도 직접적으로 관리하고 선택된 QNA에 대한 렌더링도 담당합니다. 단일 책임의 원칙에 따라 VIEW를 분리하고, 드래그의 상태와, 선택된 QNA의 상태를 따로 관리 할 예정입니다.
AnswerDragView
[개선 사항
]
컴포넌트 분리 : AnswerDragItem
드래그 대상 아이템을 렌더링
커스텀 훅 사용 :
useDragCorrection
: 드래그 상태를 관리userQnaManger
: 유저의 상태와 관련된 Qna 디스패치를 관리useQnaManger
: 서버의 상태와 관련된 Qna 디스패치를 관리
하드 코딩 제거 : boardList[0]?essayTitle
와 같이 직접적인 인덱스 참조가 있었는데 리팩토링 이후에는 이러한 하드 코딩이 제거되었습니다.
매직 넘버 제거 : list.answer.substring(0, selectedText.start)
와 같은 쉽게 이해 할수 없는 문법을 알기쉽게 {시작점부터타겟까지문장}
직관적인 표현을 해주었습니다.
AnswerWirte
[개선 사항
] :
네이밍 개선 : AnswerWrite → AnswerLayout
컴포넌트 분리 : 각각의 관심사별로 책임을 분리 하였습니다.
AnswerDetailView : 유저의 질문을 세부사항을 관리 합니다.
FeedBackComposer : 피드백을 작성 관련 기능을 관리 합니다.
TargetFeedBackView : 유저가 선택한 피드백을 렌더링 합니다.
리팩토링 이전 디렉토리 구조
📦Answer
┣ 📂FeedBack
┃ ┣ 📜FeedBackItems.tsx
┃ ┣ 📜FeedBackView.tsx
┣ 📜AnswerDragView.tsx
┣ 📜AnswerWrite.tsx
┣ 📜BoardItem.tsx
┗ 📜EditMenuBar.tsx
리팩토링 디렉토리 구조
📦Answer
┣ 📂AnswerDetail
┃ ┣ 📜AnswerDetailView.tsx
┃ ┣ 📜AnswerDragItem.tsx
┃ ┣ 📜AnswerDragView.tsx
┃ ┣ 📜BoardItem.tsx
┃ ┣ 📜ColorPicker.tsx
┃ ┗ 📜EditMenuBar.tsx
┣ 📂FeedBack
┃ ┣ 📜CorrectionView.tsx
┃ ┣ 📜FeedBackComposer.tsx
┃ ┗ 📜FeedBackFooter.tsx
┣ 📂TargetFeedBack
┃ ┣ 📜TargetFeedBackItems.tsx
┃ ┗ 📜TargetFeedBackView.tsx
┗ 📜AnswerLayout.tsx
코드의 구조와 가독성이 크게 개선되었습니다. 컴포넌트의 네이밍과 디렉토리 구조의 변화를 통해 구조를 이해하기 쉬워졌습니다.
특정 기능 또는 컴포넌트를 찾기도 용이 해졌습니다.
Last updated