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.tsxAnswer : 답변하기 관련
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에 집중 되어 있습니다.
개선 방안
다른 카테고리를 추가해도 활용 할 수 있는 형태로 변형
유지보수가 효율적인 구조
특정 데이터에 한정 되지 않을 것
리팩토링 적용 구조
특정 데이터에 제한 받지 않고 원하는 형태의 게시판 생성에 용이한 구조로 개선하였습니다.
Props는 상수화 하여 관리가 쉬워지고 유지보수의 효율이 높아졌습니다.
제니릭 타입을 사용하여 타입의 안정성을 지키면서 특정 데이터에 한정 되지 않게되었습니다.
Question: 질문하기
주요 리팩토링 사항
컴포넌트 분할
절차적인 성향의 코드
직관적 네이밍
setEssayTitle을 onChange Props으로 전달하여 EssayTitle의 상태를 변형하고 그 변화에 따라 useEffect를 동작 시키는 방식이 불필요한 절차적인 과정이라고 생각이 되었습니다.
handleChangeTitle을 onChange props로 전달하여 직접적으로 변경하는 방식으로 변환 하였습니다.
Answer : 답변하기 (게시글상세)
주요 문제점 :
리덕스, 모달 등 너무 많은 상태를 직접적으로 관여
의미를 알 수 없는 매직넘버
너무나도 많은 관심사
페이지가 있음에도 컴포넌트에서 router.query 를 다루고 있음
페이지내에서 관리하는것으로 변경
의미 파악이 불명확한 매직넘버
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 : 유저가 선택한 피드백을 렌더링 합니다.
리팩토링 이전 디렉토리 구조
리팩토링 디렉토리 구조
코드의 구조와 가독성이 크게 개선되었습니다. 컴포넌트의 네이밍과 디렉토리 구조의 변화를 통해 구조를 이해하기 쉬워졌습니다.
특정 기능 또는 컴포넌트를 찾기도 용이 해졌습니다.
Last updated