Feat(client): SuggestedMemoList 컴포넌트 구현 - #273
Conversation
🎨 Storybook 배포 완료PR 작성자: @jm8468 |
twossu
left a comment
There was a problem hiding this comment.
스프린트하면서 기존 ai-prompt에서 ai-panel로 네이밍이 변경될 것이어서 지연님이 작업하신 pr에서 폴더 구조를 잡아주셨는데 참고해서 위치 변동하고 머지하면 좋을 것 같아요! 저도 지금 ai-panel에서 다 작업중이었거던여희헤희헤🧎♂️🧎🧎♀️🐺
There was a problem hiding this comment.
지금까지 컴포넌트 하나당 파일 하나로 분리해온 걸로 알고 있는데 여기서는 SuggestedMemoItem을 SuggestedMemoList랑 같은 파일에 둔 의도가 있으실까욥! 어차피 List 안에서만 쓰이는 컴포넌트이기는 한데 궁금하옵니다1!
There was a problem hiding this comment.
저도 궁금하옵니다!
SuggestedMemoIte이 현재는 SuggestedMemoList 내부에서만 사용되긴 하지만, 지금까지 컴포넌트 단위로 *.tsx / *.css.ts를 분리해온 패턴을 생각하면 item도 파일을 분리하는 편이 더 일관적일 것 같아요!
특히 SuggestedMemoItem도 props, disabled 상태, 선택 버튼, hover 스타일을 따로 가지고 있어서 단순한 JSX 조각이라기보다는 하나의 하위 컴포넌트에 가까워 보여요!
나중에 item 쪽 상태나 스타일이 더 늘어날 가능성도 있어서, 아래처럼 분리하면 파일 역할이 더 명확해질 것 같습니당
suggested-memo-list/
├── suggested-memo-list.tsx
├── suggested-memo-list.css.ts
├── suggested-memo-item.tsx
└── suggested-memo-item.css.tsThere was a problem hiding this comment.
저는 응집도 측면에서 접근했어요.
SuggestedMemoItem은 SuggestedMemoList 밖에서 재사용 되지 않아요
-> memoTitle, isSelected, onSelectMemo props가 SuggestedMemoTypes와 SuggestedMemoList의 맥락에 의존하고 있어요.
즉, SuggestedMemoTypes가 바뀌면 SuggestedMemoItem의 props도 함께 바뀌어야 해요
-> 함께 수정되는 코드이므로 응집도 면에서 함께 두는 편이 좋아요
만약 별도의 파일로 쪼갠다고 가정하면 재사용성의 이점은 없고, 파일 탐색 비용이 늘어나게 돼요.
There was a problem hiding this comment.
https://github.com/TEAM-CLUSTAR/CLUSTAR-CLIENT/blob/develop/apps/client/src/shared/components/memo-list-view/components/memo-list/memo-card-grid.tsx
여기서도 파일 하나에 컴포넌트 2개가 있어요!
https://frontend-fundamentals.com/code-quality/code/examples/submit-button.html
내용 자체는 이 코멘트와 다르지만 응집도 측면도 생각해보게 하는 것 같습니당
저는 만약 ViewerSubmitButton()과 AdminSubmitButton()이 서로 다른 파일에 있었다면 응집도는 어떻게 되며, 디버깅 난이도는 어떻게 변화할까라는 생각을 해봤어요.
There was a problem hiding this comment.
나중에 item 쪽 상태나 스타일이 더 늘어날 가능성도 있어서, 아래처럼 분리하면 파일 역할이 더 명확해질 것 같습니당
이 부분은 정말 그렇게 해야할 때가 왔을 때 하는 편이 좋다고 생각했어요.
많은 경험을 통해 직관적으로 이 컴포넌트가 재사용될 것 같으며, 미래에 이 컴포넌트의 코드가 길어질지 예상이 간다면 하는 것이 좋다고 조언을 들었었어요.
예상을 잘못해서 섣부르게 분리하게 되면 응집도가 떨어지거나 컴포넌트를 추적하는 비용이 높아질 수 있기 때문이에요.
저는 이 컴포넌트가 미래에 더 상태값이 많아지고 코드가 길어질지 예측하지 못해서 우선 함께 두었어요.
분리해야 한다면 해당 컴포넌트만 잘라서 옮기면 되기 때문에, 나중에 변경해도 큰 리소스가 들지 않는다고 판단했습니다!
| type="button" | ||
| className={styles.chevronButton({ isOpen })} | ||
| aria-expanded={isOpen} | ||
| onClick={() => setIsOpen((prev) => !prev)} |
There was a problem hiding this comment.
버튼 말고도 아코디언의 외부를 클릭하면 닫히는 로직도 있으면 UX적으로 편할 것 같다는 생각이 들긴했는데 기획분들하고 추가할지 상의해보면 좋을 것 같아요!!!
There was a problem hiding this comment.
저도 chevron 버튼뿐 아니라 header 전체를 클릭했을 때 열리고 닫히는 편이 더 편하다고 생각합니당
There was a problem hiding this comment.
| padding: '1.2rem', | ||
| borderRadius: '8px', | ||
| width: '44rem', | ||
| animation: `${fadeIn} 0.2s ease-out`, |
There was a problem hiding this comment.
드롭다운이 열릴 때는 fadeIn이 적용되어 부드럽게 나타나는데, 닫힐 때는 조금 딱딱하게 사라지는 느낌이 있는 것 같아요!! 닫힐때도 비슷한 애니메이션 추가하는 건 어떨까용???
There was a problem hiding this comment.
저도 궁금하옵니다!
SuggestedMemoIte이 현재는 SuggestedMemoList 내부에서만 사용되긴 하지만, 지금까지 컴포넌트 단위로 *.tsx / *.css.ts를 분리해온 패턴을 생각하면 item도 파일을 분리하는 편이 더 일관적일 것 같아요!
특히 SuggestedMemoItem도 props, disabled 상태, 선택 버튼, hover 스타일을 따로 가지고 있어서 단순한 JSX 조각이라기보다는 하나의 하위 컴포넌트에 가까워 보여요!
나중에 item 쪽 상태나 스타일이 더 늘어날 가능성도 있어서, 아래처럼 분리하면 파일 역할이 더 명확해질 것 같습니당
suggested-memo-list/
├── suggested-memo-list.tsx
├── suggested-memo-list.css.ts
├── suggested-memo-item.tsx
└── suggested-memo-item.css.ts| type="button" | ||
| className={styles.chevronButton({ isOpen })} | ||
| aria-expanded={isOpen} | ||
| onClick={() => setIsOpen((prev) => !prev)} |
There was a problem hiding this comment.
저도 chevron 버튼뿐 아니라 header 전체를 클릭했을 때 열리고 닫히는 편이 더 편하다고 생각합니당
- 백엔드에서 추천 메모는 최대 3개만 보내도록 관리해요. - 해당 정책에 대한 책임 원천은 백엔드에 있어서 프론트 코드에서는 관련 코드를 제거해요.
There was a problem hiding this comment.
저도 reference-memos에 suggested-memo-list만 들어가는 거라면 reference-memos 없이 suggested-memo 폴더 하나로 평탄화하면 좋을 것 같습니다!
ai-panel/
└── suggested-memo/
├── suggested-memo.tsx
├── suggested-memo.css.ts
├── suggested-memo-item.tsx
└── suggested-memo-item.css.ts
📌 Summary
메모 화면에서 클릭 시 열고 닫히는 "AI 추천 메모" 드롭다운(SuggestedMemoList) 컴포넌트를 신규 구현.
📚 Tasks
🔍 Describe