# 4/13 수요일 ## 오전 - 수업 ## 오후 - 2시 ~ 4시까지 - BB: 진행중이신거 마무리... 잘하자.. - Park: 배포 - 4시 부터 ? PR 날릴 준비 - 5시 까지 PR ## PR ### 🧐 어떤 생각으로? - Git 관련 정리 - 한 주간 프로젝트를 진행하면서 느낀 불편함을 통해서 컨벤션, 템플릿을 수정, 삭제 - Components 폴더 구조 - 협업간 약속된 구조로 Component 들을 생성해야 어떤 depth 에 어떤 Component 가 있을 지 예상이 될 것이라 생각하여 폴더 구조에 대해서 의논 - BE 와 실제 통신을 axios 를 통해 시도 - 스토리를 기반으로 작성한 이슈들을 구현 시도 ### 👍 잘했던 || 좋았던점 - `peact.createElement` - 현재 컴포넌트가 `템플릿 리터럴` 을 반환하는 형태인데, 이와 같은 형태는 템플릿이 만들어 진 이후 `Element` 에 접근할 수 있어 `이벤트 등록` 같은 로직을 사용하기가 어려웠습니다. - 간단하게 `tag` 를 만들면서 동시에 이벤트도 달아줄 수 있으면 좋겠다는 생각으로 `createElement` 같은 걸 사용해서 `Element` 를 만든 이후, 기존에 `innerHTML` 과 `템플릿` 안에 `템플릿을 반환하는 함수호출` 을 통해 최종적인 템플릿을 만들던 로직에서 `appendChild` 를 통해 `tag` 를 만들 수 있도록 변경하였습니다. 이전방식 ```js function Hello() { return `<span>Hello World</span>`; } function App() { return ` <h1>App</h1> ${Hello()} `; } ``` ### ❗️문제발생 then 해결한 방법 - `addEventAfterRender` - `setValue`, `useEffect` 에서 사용하던 `setTimeout` 은 모든 템플릿이 렌더링 된 이후에 어떤 것이 먼저 호출되도 아직은 불편함을 못느끼고 있습니다 - 그런데 `addEventListener` 는 `setValue`, `useEffect` 와 순서가 섞일 경우 `Event` 를 달아줄 `Element` 를 찾지못하는 버그가 종종 발생했습니다 - 문제는 근본적으로 컴포넌트가 `템플릿 리터럴` 을 반환하고, 이벤트 리스너를 달아주기 어렵다는 것이기 때문에 `createElement` 같은 것으로 이벤트를 수월하게 달 수 있다면 해결될 수 있는 문제라고 생각했습니다. - `useEffect` - 저번 PR 에서 어느곳에서 `useEffect` 를 사용해도 문제가 없다 라고 말씀을 드렸던 것 같은데([1.3.1](https://github.com/codesquad-members-2022/todo-list/pull/86#discussion_r848135930)), `App` 에서 `useEffect` 를 쓴 이후 다른 컴포넌트에서 또 `useEffect` 를 쓸 때 `isMounted` 가 `true` 로 남아서 `useEffect` 안에 있는 `callback` 이 실행되지 않는 문제가 있습니다. - 모든 데이터를 `fetch` 하는 것은 한번에 하는 게 좋다라는 말을 들어서 현재는 `App` 에서 모든 데이터를 불러와 문제는 없지만, 만약 `useEffect` 를 서브 컴포넌트에서 쓰는 경우에는 문제가 있기 때문에 해당 로직에 대해서 좀 더 고민해보겠습니다. ### ✅ PR 리뷰에서 개선한 점 - `setTimeout` Logic 에 대한 이름을 명시하여 함수의 동작을 예측할 수 있도록 해보았습니다. - 프론트의 진입점인 `index.js` 에서 `App` 컴포넌트를 등록하는 과정에서 쓰이는 `Element` 탐색 API 를 클래스 사용에서 `id` 사용으로 변경했습니다. - 현재 컴포넌트가 템플릿 리터럴을 바로 반환하는데, 템플릿 리터럴이 아닌 `HTMLElement` 를 반환하도록 하였습니다. ### 👋 다음 PR엔? - 드래그앤 드랍 시작과 마무리를 할 수있도록..