# 4/15 금요일
### 오전
- [x] 비비 피알 리뷰
- conflict 해결 (같이 필요하면 하고)
- [x] 코드들 한번 싹 보면서 리팩터링
- [x] 데모에서 무슨 얘기할지
- [ ] PR 날릴준비
- [ ] 시간이 만약 남으면 드래그마저 해보기
### 오후
~4시 PR
4시 ~ 5시 - 그룹별 데모
5시 ~ 6시 - 클래스별 이야기
6시 30분 - 회고
## PR
## 💻 데모
[링크](https://healtheloper.github.io/todo-list/)
- 현재 카드추가/삭제 기능을 위한 구현을 진행중으로 간단한 테스트는 Swagger 의 [api-docs](https://bbpark-todolist.herokuapp.com/api-docs/) 를 통해 테스트해보실 수 있습니다.
## 🧐 어떤 생각으로?
- handler 를 통해 상태관리하는 로직을 일관성 있게 바꿔보자.
- `handle` + `eventType` + `componentsName`
- 내부엔 상태변경 + 비즈니스 로직
- PR 리뷰 사항 개선
- Webpack alias
- 요구사항 기능 구현
- 드래그 앤 드랍 각자 구현해보기
- 둘 다 드래그만 구현되어서 각자의 숙제로..남았습니다.
- 카드 수정 기능, 새로운 카드 등록
- 서버에 body 데이터 만들어 요청 보내기
## 👍 잘했던 || 좋았던점
### useRef
- `Component` 내부의 코드 순서가 너무 뒤죽박죽 이고 핸들러에서 어떤 요소를 써야 할 때 그 요소의 순서에 의해서 직접 사용이 불가능한 경우 어쩔 수 없이 `DOM API` 의 `querySelector` 를 사용할 수 밖에 없었습니다.
- 이런 문제를 어떻게 해결할 수 있을까 싶어서 처음에는 `let` 으로 전역에 임시로 선언한 후 재할당 하는 식의 아이디어를 떠올렸었는데, `let` 으로 재할당하는 방식을 최대한 지양 해보고자 했습니다.
- 파크가 `useRef` 라는 것을 사용한다고 알려주어서 `useRef` 를 구현해보고 그것을 직접 사용하여서 내부의 코드 순서를 합의하에 정하여 `변수 선언 - 핸들러 - 엘리먼트` 의 흐름을 가져가 가독성을 높일 수 있었습니다.
### Modal 분리과정
- 이전 PR에서 Modal의 표시여부가 `Card`의 삭제 버튼을 눌러서 모달이 호출된다는 이유만으로 `Card`에서 그 부분을 핸들링하였고, `Modal` 을 열거나, 닫는 로직이 `DOM API` 에 의존해 있는 등 많은 문제가 있었습니다.
- `useRef`의 구현으로, 해당 이벤트 핸들러들이 `DOM API` 에 의존하지 않도록 할 수 있었고, 해당 핸들러는 구조적으로 `Card` 보다 더 상위 컴포넌트에 위치하는 것이 더 좋을 것이라는 빰빰의 피드백에 힌트를 얻어 리팩토링을 진행했습니다.
- 미션을 진행하면서 만들어 두었던 `useState`를 활용하는 방법으로 `Modal의 표시 여부` `현재 선택된(삭제여부를 묻고있는) 카드의 정보` 를 저장해 둘 수 있어서 이전보다 좋은 로직을 만들 수 있었습니다.
## 🧐 질문
### Webpack alias 설정
- Components 안에서 다른 Components 를 참고할 때에는 상대경로로 하는게 경로가 더 짧아지기도 하고, 같은 Components 폴더라는 느낌이 있어서 상대경로로 하는게 더 좋지 않을까? 란 생각이 들었습니다.
1. 일관성을 위해 resolve 된 경로부터 하는게 좋을지
2. 같은 폴더(components) 인 경우 상대경로로 하는게 좋을지
### handleClickButton ?
- 만약 CloseButton 과 ConfirmButton 이 같은 로직만 처리한다고 했을 때, handleClickButton 이라는 공통된 함수를 사용하는게 좋을 지, 아니면 각 컴포넌트별 핸들러 함수를 선언해서 쓰는게 좋을지 고민되었습니다.
- 하나로 썼을 때에 메모리적 효율을 가져갈 수 있겠지만 나중에 각각의 핸들러가 다른 로직을 처리할 수 있다는 가정하에 분리하는게 더 좋지 않을까 란 생각을 했습니다
```js
const toggleClass = ($element, className) => {
$element.classList.toggle(className);
};
//
const handleClickButton = ({target}) => {
const $element = target.closest('button');
toggleClass($element , styles.active);
};
// OR
const handleClickConfirmButton = () => {
const $confirmButton = confirmButtonRef.current;
toggleClass($confirmButton , styles.active);
};
const handleClickCloseButton = () => {
const $closeButton = closeButtonRef.current;
toggleClass($closeButton , styles.active);
};
```