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에 집중 되어 있습니다.

개선 방안

  • 다른 카테고리를 추가해도 활용 할 수 있는 형태로 변형

  • 유지보수가 효율적인 구조

  • 특정 데이터에 한정 되지 않을 것

리팩토링 적용 구조

chevron-right1. 리팩토링 적용 코드 보기hashtag
  • 특정 데이터에 제한 받지 않고 원하는 형태의 게시판 생성에 용이한 구조로 개선하였습니다.

  • Props는 상수화 하여 관리가 쉬워지고 유지보수의 효율이 높아졌습니다.

chevron-right2. 리팩토링 적용 코드 보기hashtag
  • 제니릭 타입을 사용하여 타입의 안정성을 지키면서 특정 데이터에 한정 되지 않게되었습니다.

Question: 질문하기

주요 리팩토링 사항

  • 컴포넌트 분할

  • 절차적인 성향의 코드

  • 직관적 네이밍

chevron-right리팩토링 코드 보기hashtag

  • setEssayTitle을 onChange Props으로 전달하여 EssayTitle의 상태를 변형하고 그 변화에 따라 useEffect를 동작 시키는 방식이 불필요한 절차적인 과정이라고 생각이 되었습니다.

  • handleChangeTitle을 onChange props로 전달하여 직접적으로 변경하는 방식으로 변환 하였습니다.

Answer : 답변하기 (게시글상세)

주요 문제점 :

  • 리덕스, 모달 등 너무 많은 상태를 직접적으로 관여

  • 의미를 알 수 없는 매직넘버

  • 너무나도 많은 관심사

  • 페이지가 있음에도 컴포넌트에서 router.query 를 다루고 있음

  • 페이지내에서 관리하는것으로 변경

  • 의미 파악이 불명확한 매직넘버

AnswerDragView 같은 경우 현재 드래그에 관련된 상태도 직접적으로 관리하고 선택된 QNA에 대한 렌더링도 담당합니다. 단일 책임의 원칙에 따라 VIEW를 분리하고, 드래그의 상태와, 선택된 QNA의 상태를 따로 관리 할 예정입니다.

AnswerDragView

chevron-right리팩토링 이전 코드hashtag
chevron-right리팩토링 이후 코드hashtag

[개선 사항]

컴포넌트 분리 : AnswerDragItem 드래그 대상 아이템을 렌더링

커스텀 훅 사용 :

  • useDragCorrection: 드래그 상태를 관리

  • userQnaManger: 유저의 상태와 관련된 Qna 디스패치를 관리

  • useQnaManger: 서버의 상태와 관련된 Qna 디스패치를 관리

하드 코딩 제거 : boardList[0]?essayTitle와 같이 직접적인 인덱스 참조가 있었는데 리팩토링 이후에는 이러한 하드 코딩이 제거되었습니다.

매직 넘버 제거 : list.answer.substring(0, selectedText.start) 와 같은 쉽게 이해 할수 없는 문법을 알기쉽게 {시작점부터타겟까지문장}직관적인 표현을 해주었습니다.

AnswerWirte

chevron-right리팩토링 이전 코드hashtag
chevron-right리팩토링 이후 코드hashtag

[개선 사항] :

네이밍 개선 : AnswerWrite → AnswerLayout

컴포넌트 분리 : 각각의 관심사별로 책임을 분리 하였습니다.

  • AnswerDetailView : 유저의 질문을 세부사항을 관리 합니다.

  • FeedBackComposer : 피드백을 작성 관련 기능을 관리 합니다.

  • TargetFeedBackView : 유저가 선택한 피드백을 렌더링 합니다.

리팩토링 이전 디렉토리 구조

리팩토링 디렉토리 구조

  • 코드의 구조와 가독성이 크게 개선되었습니다. 컴포넌트의 네이밍과 디렉토리 구조의 변화를 통해 구조를 이해하기 쉬워졌습니다.

  • 특정 기능 또는 컴포넌트를 찾기도 용이 해졌습니다.

Last updated