# URLSession 재사용을 위한 리팩토링과 기능 구현
## 작업 내용
### 서버와 통신하기 리팩토링
- NameSpace 파일 분리
- 재사용가능한 변수 분리
- URLManger 재사용가능하게 수정
- Codable 채택한 객체 속성 접근제어자 수정
- editCardViewController 함수 분리
- 카드가 여러번 추가되던 로직 수정 (NotificationCenter -> delegate 패턴으로 변경)
- task list 순서가 카드를 추가할 때마다 변경되는 버그 수정
### 카드 삭제 기능 추가, 활동기록 화면 데이터 받기
- 카드 삭제 기능 추가
- 활동 기록 화면 데이터 받아오는 기능 구현
- 이벤트 객체의 content를 String으로 변환하는 ContentConverter 구현
-
### 카드 수정하기 기능
- context menu 추가
- 수정하기, 이동하기, 삭제하기 기능 달기
- 수정하기 선택시 editCardView에 이전 정보 띄우기
- 수정시 서버에 요청 보내고 뷰 다시 그리기
### 세부사항 수정
- 카드 수정, 추가 버튼 disable 기능 추가
- context menu의 삭제하기 메뉴 색깔 변경
- 드래그앤 드롭 기능 대신 다른 섹션으로도 이동하도록 메뉴 추가
- 해당 섹션 외의 다른 섹션만 메뉴에 뜨도록 구현
## 결과물
|카드 추가하기|카드 삭제하기|
|---|---|
|<img width="320" src="https://user-images.githubusercontent.com/45891045/163531409-97833220-29c6-4dae-a2fc-3f1334246854.gif">|<img width="320" src="https://user-images.githubusercontent.com/45891045/163531902-49237e41-9f6b-447b-92cb-fca1348638dc.gif">|
|카드 수정하기|카드 이동하기|
|---|---|
|<img width="320" src="https://user-images.githubusercontent.com/45891045/163531526-fd455cec-fc8c-4f5c-a1d3-1c6d0740a68a.gif">|<img width="320" src="https://user-images.githubusercontent.com/45891045/163531821-5b16be10-c761-4992-8ff1-07a70fa2788e.gif">|
## 고민과 해결
**edit card view를 여러번 띄웠을때 카드가 여러번 추가됨**
- editCardViewController가 로드될때 observer로 등록이 되는데, dismiss 시에도 observer에서 사라지지 않고 메모리에 참조값이 남아있다 라고 생각을 했습니다.
1. deinit에 디버깅을 찍어보니 호출되지 않음
2. viewWillDisappear에서 observer를 삭제해보았지만 해결되지 않음
3. viewWillDisappear에서 removeFromParent를 호출해 보았지만 해결되지 않음
4. NotificationCenter 사용부분을 delegate로 변경 - 해결
**서버에서 get 해올때 taskBoard 순서가 매번 바뀌는 현상**
- 서버에서 get 해온 타입이 Dictionary 타입이라서 바뀔수 밖에 없다고 생각을 했습니다.
1. 서버의 데이터구조를 Dictionary 타입이 아니게 변경을 해야하나 고민
2. 섹션의 이름을 서버에 저장하기 위해서는 Dictionary 타입을 사용해야 한다고 생각
3. 로컬에서 자체적으로 순서를 정해주기로 결정(섹션 타이틀 고정)
4. "해야할 일", "하고 있는 일", "완료된 일" 세가지의 섹션만 사용해서 순서대로 배치하게 해결
## 해결하지 못한 것들
- 카드 글자 수 제한, 카드 입력시 크기 동적으로 변하기
-> textField가 아닌 textView로 하면 해결할 수 있을 것 같습니다
- 키보드 나타날 때, 카드 입력 부분 같이 올라가게 하기
- activity board text 볼드 추가
- 모든 액션마다 모든 카드를 get 해오는 문제