# 해야할 일
- usecase repository service 각각 interface 만들고 시작
~~- 출시하고 싶은 : 5주차에 리뷰 요청 가능~~
---
# 멘토님과의 만남
## Core Data
- CoreData와 코드를 똑같이 구현하자! 종료일이 시작일보다 작지안게하는 코드 같은 것.
## 모임등록
~~- 모임 목적 가로모드 (collectionview를 그대로 사용할것인가)~~
- 이미지 픽커 애니메이션
## 목록
- 목록 1000개면 페이징 방식으로 나눠서 보여주는 방식도 있음
- 스크롤 많이 했을때 불러오도록 하는게 좋다!
- 과부하 문제
- 검색 글자 하나씩 써질때마다 보이는건지? instant search. 오..... 짱이네
## 전체
- 12/1 만나서 앱을 써볼 때 크래시가 안나면 음료 사주신대여!!! 차트까지!!!!
---
<수정할 것 들>
- 달력 뷰 길이 유동적으로 변경해보기
- 빈 날짜 클릭해서 추가버튼 눌러서 모임 추가하는거도 하면 조케타(정아의견)
- 길이 짧은 뷰들 스크롤 되도록
- ~~가로모드 막기
- ~~다크모드 막기
- 매직넘버 없애기
- ~~전체적으로 같은 애니메이션 추가하기
~~- 종료일 없애기(뷰, core data 등등)~~
- 처음 어플 깔면 "아직 모임이 없어요! 예전 모임, 앞으로 가질 모임을 등록해봐요!"라는 멘트넣기(혹은 팝업이어도 나쁘지 않을듯?)
- 편집 화면 (메모 placeholder)
- 상세화면 뷰 수정
- 목록 100개씩 페이징 방식
-
---
# 멘토늬이임~~
## 코어데이터
- 원래 UUID는 코어데이터가 관리를 해준다. 왜안대....
- 지금 보니까 UUID가 필요하긴 할 듯!
- 이런 경우에는 무시하고 새로 하는게 좋을 듯..
- 마이그래이션이 중요하긴 하니깐 팀끼리정해라!(해놓으면 나중에 어필할때 좋을듯)
## 달력
- 달력 뷰에서 달력을 계속 넘기고 다시 투데이!
- 정아 : 그 일정 버튼 다시 누르면 원래 날짜로 이동하는거 이거 말한거임!!!!
- 버튼 추가 & 일정 눌렀을 때 둘 다 하면 좋을 듯
- 모노 스페이스 폰트
- 글자가 1월이랑 2월이랑 너비가 다를 때 꺽쇠가 이동되는데 이것들을 해결!
## 모임 등록
- 둘 다 선택 안하면 버디 추가해달라네?? 오홍 -> 이거 바꿔줄까?
## 설정
- Alert 뜰 때 모임 등록 버튼 투명 왜!!!!
## 통계
- 프레임 관리는 신경쓸게 많다
- 많이 불릴수도 있으니깐, view의 사이클, 뷰컨 사이클에 맞춰서 업데이트 해주는게 좋을 것 같다.
- 오토레이아웃 잡아주면 특정 시점에 프레임 값을 가져올 수 있다!! 알수 있는 시점이 있당
## 로그인
- 저장 폰 바꿀 때 옮겨주면 어떨까?~!!
- 애플로만 하는걸로 하면 금방 할 수 있을 듯!
- http://labs.brandi.co.kr/2021/04/09/chosh.html
---
앱배포
https://developer.apple.com/kr/app-store/product-page/
[스플래쉬 화면](http://icunow.co.kr/splash-screen/)
## 이유 생각해볼 것
- MVVM
- 달력
- 버블차트
- git flow
# 멘토님~
UIKit animate는 좀 상위 개념의 그거고
좀더 CPU에 부담 안가고 복잡한 animation은 CoreAnimation을 이용한다 인거 같음.
구조 개선 전에 지금 구조를 정리..!
구조 보여주자!! 슬랙에 있는 거 처럼
MVVM, 파일별로 해도 되고 하나로 해도
---
--------------------
## 고민했던 것
저희가 프로젝트를 진행하면서 많은 고민거리를 만나게 되었습니다. 그 중 앱의 기능상 가장 중요하고 오랜 시간 고민을 했던 주제인 Core Data를 활용하면서 경험했던 고민에 대해 설명드리려고 합니다.
### Core Data의 작업이 오래 걸리는 경우
기존에 viewContext를 이용하여 작업할때, 모임이 매우 많이 등록되어 있어서 fetch해오는데 오래 걸려 UI가 block되는 상황이 생겼습니다.
따라서 persistentContainer의 newBackgroundContext를 사용하여 만든 privateQueueConcurrencyType인 NSManagedObjectContext를 이용하여 CoreData에서 오래 걸리는 작업을 main thread에서 진행하지 않게 하였습니다.
CoreData에 요청한 작업이 끝나면 Combine을 활용해 해당 정보를 Publish 해주었고, ViewModel이 해당 Publisher를 Subscribe해 정보가 오면 Main thread에서 해당 내용을 View에 적용하게 하였습니다.
이렇게 해서 UI가 멈추지 않게 하였습니다.
### Core Data Migration
저희가 처음에 기획한 내용에는 모임을 등록할때 시작일, 종료일을 입력하도록 하였습니다.
하지만,팀원들과 상의한 결과 여러 날짜에 걸친 여행과 같은 작업 보다 당일에 만나는 만남에 조금 더 의의를 두고자 하여 날짜 하나만 입력 하게 수정을 하였습니다.
따라서 그에 따라 Core Data Entity를 수정하기로 결정하였는데, 문제가 있었습니다.
먼저 매주 배포를 하고 있는 상태였기에, 기존 버전을 설치해 모임을 한개 이상 등록을 한 경우 앱이 터지는 문제가 발생하게 된것입니다.
따라서, 기존 배타 버전 사용자가 앱을 재설치 하지 않게 하기위해 Migration을 시도해 보게 되었습니다.
저희가 작업할 내용은 총 3가지 였습니다. 먼저, endDate를 제거하는 것, startDate의 이름을 date로 변경하는 것, 그리고 마지막으로 UUID 값인 id를 생성해 넣어주는 것입니다.
-----
# 오늘의 멘토님은 이러한 말을 하셔따!
## 구조도
- 구체 예시가 들어간 표가 있으면 좋을 것 같음 presentation -> presentation 'layer'
- 다음장에 각각 예시가 뭔지 보여주면 좋을 것 같다.
- (각 화면에는 뭐가 있는지, CoreData Manager에서 하는 역할(fetch, edit 등)들에 대한 예시 등)
- 아키텍처중에에 configuration, 서드파티 있는데 린트는 서드파티에 속할 수 있다!
- 다크모드, 가로모드 설정 막은것도 configuration에 속한다.
구조도 올려주면 주말에 봐주신다고함!
## 앱
- 검색유지 되면 좋겠다.
- 네비게이션바 왜 남아있지
- 달력 부분.....ㅠㅠㅠ
- 낮은 버전에서 모임등록 날짜부분 trailing부분 어떻게 해야할 듯. <이거 주자... 위아래는 어카지..? 낮은 버전에서 넓게 잡아주기?
'기본기가 중요하다.' IT업계에서 항상 강조하는 말입니다. 라이브러리없이 진행한 프로젝트는 이러한 기본기의 중요성을 체감하는 과정 그 자체였습니다.
외부 라이브러리없이 개발하는 것은 생각보다 귀찮고 어려운 과정입니다. 라이브러리에서 제공하던 편의성을 모두 스스로 고민하고 구축해야 합니다. 하지만 그 귀찮고 어려운 과정은 애플 프레임워크 자체에 대한 이해도를 높여주어 추후 라이브러리 사용에 있어서도 더 원활한 사용을 기대하도록 했습니다.
라이브러리에만 의존한 개발을 했다면 기본을 제대로 파악하지 못하고 다른 라이브러리를 사용할 때의 러닝커브가 상당히 높아졌을 것입니다.
추후 개발을 진행하며 라이브러리를 사용하는 일이 발생하더라도 이번 경험을 절대 잊지않고 항상 기본에 충실한 개발자가 되자고 모두 다짐했습니다.
# 발표 추가내용
1. 라이브러리 사용 안함 ㅇ
2. 코어데이터(마이그레이션, 비동기처리) ㅇ
3. MVVM (구조 고민과정) ㅇ
4. 15에서 13으로 (네비게이션바, 버튼디자인, date picker)
6. 앱 배포 과정 (profile, 인증서)
8. 이미지 저장 방식 (갤러리 이미지까지 삭제되는 문제)
10. 로딩화면 -> UIGravity, UIDynamicItemBehavior, UICollider
12. Custom ViewController delegate
14. 코드리뷰 방식
16. git flow
이중에 몇개는 Wiki에 올리고 와서 확인해달라 ㅎㅏㄹ까?
부스 찾아오면 더 알려준다 할까
---
## 발표 스토리
### 목차
1. 애플리케이션 설명(데모영상)
2. 외부 라이브러리 없이 개발한 내용(왜, 무엇, 느낀점)
- 왜
- 오토 레이아웃
- 통계
- 캘린더
- 구현방법
- 느낀점
- 선한 영향력을 끼칠
- 기술을 남들과 공유하면서 다같이 성장할 수 있었던거 같아
3. 기능 구현하면서 고민했던 것들(왜, 무엇, 느낀점)
- 확장성을 고려한 구조
- 사용한 이유
- 기획하는 과정에서부터 배포를 염두해두고 있었기 때문에 확장성이 중요하다고 생각했습니다. 그래서 MVVM을 적용하게 되었습니다.
- 얻게 된 장점
- 성능 개선 및 비동기 적용 등의 사유로 특정 부분의 코드를 완전히 다시 짜야하는 경우가 있었는데, 계층을 잘 나눠놓은 덕분에 다른 계층에 대한 side effect없이 쉽게 교체가 가능했음
- 모임 등록화면이 바뀌면서 CoreData의 Entity를 바꿔야 gk는 상황
- 왜 Migration을 진행해야 했나?: 모임 등록 과정이 수정됨. But, 매주 배포하고있는 상황 -> 모임 등록이 수정됨에따라 기존에 저장된 모임 수정할 필요가 생김
- LightWeight 시도 . Good, But LightWeight로 한계가 있음.
- heavyWeight 도전 -> 여러 해결책을 열심히 찾아봤다 -> (베타버전) ~~ 해서 앱을 새로 까는 방식을 선택했다 -> 그 이후에 기술공유 시간에 [] 라는 해결책에 대해 알게 되었다. -> 앱스토어에 출시를 해서 앞으로도 지속적으로 개선해 나갈 것이기 때문에 추후에는 [] 해결책을 사용해보려 한다.
- UI가 멈추는 현상
- Core Data 비동기 처리로 해결
4. 마무리
- 기본기의 중요성
- 함께하는 성장
- 정답 = nil
- 개발을 하는 방식이나 선택하는 과정이 있을 뿐
- 정해진 정답은 없다.
- 끊임없이 도전
- 발표준비하기
- 내일 질문 받을 것들 좀 생각해보기
- 상담 질문 적기
### 나정
https://neat-joke-d6c.notion.site/e28adedce91a43889e720d239dc22313
# 예상질문
https://www.notion.so/59a2cdd42b25448fb5a560d5bc558c76
# 구글 API 써서 백엔드 대신할 수 있을듯?
https://bytepace.medium.com/work-with-google-api-in-ios-application-681a39c08037
-------
6주간 멘토링 너무 감사했습니다!!
코로나 조심하시고 좋은 연말보내세요!🎄
취업하면 꼭 찾아가겠습니다! 💪