---
# System prepended metadata

title: 멘토님 조언

---

# 멘토님 조언

- 버그에 대해 너무 스트레스 받을 필요 없음.

1. 네이밍
- 로컬라이징: Localizing 폴더 네이밍이 현실과 다름
- Enum 관리: static let 으로 관리하는 이유는?
  - computed property로 반환하는게 깔끔
  - :String 받아서 case 쓸수있는 부분(맨 아래)은 case로 써라
- Convention 통일

2. SceneDelegate 쪽 주입하는 부분
- 싱글톤? 주입? 주입으로 꼭 해야하는가?(주입으로 할건데... 정말로 테스트 할 건가?)
- 내부 구현은 싱글톤인데 주입으로 바꿔서 해야하나?
- 주입을 하게되면 어쩔수 없이 새로운 코드가 더 생기는데 생기는 의미가 있어야한다. 테스트를 위해서라고 하는데 그 부분을 구현하는 부분을 보여주면 좋을 것 같다.

3. 출처 적는 것 좋은 것 같다
4. Extension이 여기저기 있는 부분 잘 모아주었으면 좋겠다.
5. static let id 부분
- 무조건 자기 클래스 이름을 따라 갈거면 Extension으로 따로 분리할 수 있다.
  - 힌트:String(describing)
7. SFSymbol 주의점
- iOS11, 12는 못쓴다
- 13은 쓸수는 있으나 문제가 있다.
- sybol name을 스토리보드로 설정하면 바로 알수 있지만 코드로 작성하면 현재 타겟 sdk체크가 힘들다.
8. 
9. private 처리
10. extension을 한 곳에 모아두기
- 멘토님: 기본 프레임워크(UIView같은)는 한곳에 몰아두고, Enum같은 경우는 다 하나하나 파일로 만들어서 관리하는 편이다.

11. MVVM이면 ViewModel도 ViewModel이름의 폴더를 따로 만들어서 관리하라

12. RxCocoa를 쓰는 부분이 한군데밖에 없다
- BlurCircleButton안에 Listener 부분 등
- 멘토님:
  - RxCocoa는 조금 과하다는 생각을 가지고 있었다. 쓸거면 Completion Handler, Delegate들을 다 빼서 Rx 기능을 잘 쓰는게 좋다
  - 나중에 고치지말고 이 부분을 리뷰할 때부터 초반부터 잡는 편이 좋다

13. SystemConstants.swift
- 숫자로 하드코딩 부분
  - 멘토님: 시스템에서 제공되는 변수가 있는 것 같다
  - 멘티: 구현했을 때 0으로 반환되었던 이슈가 있었던 것 같다
  - 멘토님: 다시한번 확인해보자. 그리고 나는 UIScreen+Extension으로 관리할 것 같다
  
14. [safe: 0] 적용
- 멘토님: 좋은 것 같다. 이런 위험한 부분은 lint에는 안잡힌다
16. ExploreVC
- 맨 아래 gurad 너무 길다. lint적용이..? 현재 적용된 lint가 별로 없는 것 같다는 생각이 들었다. 그렇지만 적은게 좋다는 것을 말하려는 것은 아니다.

17. SearchVC
- RxCocoa들어있었는데 코드에는 안쓰이는것같다
- UserDefaultStorage... 바꾸라는 건 아니고 이런 구조적인 부분 이해한다

10. SarchTableViewCell
- handler있는데 이것도 아까말한대로 통일해서 쓰라는 부분

11. SearchTableViewCell
- 멘토: bindUI가 Cell안에 있는게 어색했다. 잘못되었다는것을 말하려는 것은 아니다. Reuseable할 때 계속 bind될 텐데 이 부분을 확인해보자. + 접근제어자
12. Home_Enums.swift
13. FocusVCFactory
- Factory함수가 그냥 VC안에 있어도 되지않을까 생각해보았다. 그렇지만 이것도 스타일의 차이니까 이야기 나누어보면 좋을 것 같다. 이곳에서만 Factory 패턴 쓰고 있는 것 같았다. 코드 스타일의 통일 강조
14. HomeVC
- LocalFileManger, ... 관련한 것이 VC에 있어야하는지(이건 주입과 관련)
- 멘티: 주입은 어디서 시작하고 해야하는가?
- 멘토: 잘 모르겠다
- 멘토: ViewModel에서 init함수를 더 만들어서 직접 여기서 생성해서 써보기..? 테스트할때 호출하는거랑 분리해서 사용해보라(이건 잠깐 생각한 것이다)
- 테스트를위해서 MVVM원칙이 깨지는 것이 어색하다.
15. HomeViewController.swift
- 292번째줄 view.isUserInteractionEnable 설정하는것. 이건 기본으로 true인데 true 넣는게 있네요.(갑자기 찾음)
16. 전체적으로 보면서 SnapKit이 MVVM에 사용하기에 적절하다고 느꼈다. SnapKit 안썼으면 코드가 엄청길어졌을 것.(잡담)
17. MediaCollectionVIewCell
- 멘토: NofifiactionObserver.add하는 부분. 셀의 사이클에 대해서 생각해보라 
- 멘티: 아마 이부분은 Queue를 사용할 것 같아서 수정될 것 같다
- 멘토: Observer를 add하고 remove하는 시점이 잘 맞아 떨어지는지 확인해보라.
- remove할 때 object가 없을 때 체크해보라

19. DefaultFocusViewControlelr
- dispose안한 부분. 메모리 릭 조심하자


20. DefulatViewModle
- Input / Output 프로토콜 분리
- 어떤 곳은 이런식 프로토콜이 있는데 없는 것 같다.
- internal인데 프로토콜이 많다고 느꼈다. 이부분도 논의해서 맞추어보라
- 구현시간 고려하자
- sdk쓸 때 프로토콜이 위력을 발휘하는 경우
21. PomodoroFocusVieContorller
- final 키워드
  - 멘토: 왜 썼는가?(칭찬)
  - 멘티: 상속하지않는 객체는 final달면 메모리를 좀 더 줄일 수 있다는 걸로 알고있다.
  - 멘토: 상속받지않는 경우는 final다는게 좋은 것 맞고,
  - 그리고 dispatch라는 것이 있다. 메모리를 static(빠름)/ dynamic(느림)하게
  - 메모리 사용량 차이는 아니고 퍼포먼스를 위해서 쓰는 것이다.
  - final을 쓰면 staitc하게 dispatch하기 때문에 미세하게 성능향상이 있어서 쓰는 것이다.
23. Focus쪽 dispose안한 부분이 있는 것 같다.
24. 주석을 남길거면 왜 남길건지 history를 같이 적어두는 것이 좋다
25. FocusViewContoreller
- 여긴 delegate. 통일하기
- 합의를 하는 것이 정답이다. 싸우진말기 ㅋ
26. MusicPlayerVC
- 멘토: Player의 위치가...?
- Extension쪽에 + Layout클래스도 있는데? 이건 분리하는 편이?
27. MediaListReposiroyProtocol
- 프로토콜 많다(이거 지우라는 것은 아님 필요하면 쓰면 된다)
28. BrigtMode.swift.swift
- 사소한 오류 수정 -> 이건 리뷰에서 잡아야했다
29. 테스트 코드들도 빌드되는지 계속 확인하기
- CI/CD에서 잡아내는건데 지금 없으니 더욱 신경써서 확인하기
30. firebase 관련 이야기
- apple. android -> 테스트해볼수 있게 앱을 구성하라(기본 에셋을 넣어라)
- firebase에 너무 의존적이다. 무조건 쓰는 애들은 프로젝트내에 포함.
- 기본적인 음원을 채워넣고 추가적으로 더 다운받아서 쓸 수 있게 구성하는 편이 좋다.
- tide: 기본앱이 100mb넘음. 우리앱은 현재 ipa파일은 8mb....
31. youtube 데모발표
- 최종발표에는 단점을 부각시키지 마라.
- 버그가 없을때까지 찍어라.
- 최대한 버그가 있어도 없는 것처럼 해라.
- 자신감 가지고 완벽한 flow를 짜고 (스크립트 짜고) 발표하라
- 미리 준비된 말이 아니면 하지마라
- 최종발표때는 재네 혼자 노네라고 생각하지 않게끔 하라. 
32. 현업에 대한 조언을 너무 절대적으로 (근거로 삼아서) 생각해서 말하지마라


요약: 테스트정말로다할건가 + 주입 + 프로토콜 + RxCocoa/Delegate/Handler 통일+ Firebase이슈


1시반

각자 입장 - 프로토콜 줄이는 방향

기완: 일부 오버하는 부분을 제거한다->기준은 viewModel 쪽 테스트하는 부분제외 제거
예:) usecaseAccessable은 viewModel관련이니까 남김. 
    - (ViewModel)
상진: 테스트를 수행할 부분과 수행하지 않을 부분을 정리해서 하지 않을 부분을 지우고 나머지 부분을 남겨둠.
    - (ViewModel, Input Output)

현식: 전부 제거
수현: 다 지우고 차후 테스트 수행하는 부분에서 다시 Protocol 분리

결론: 
- Repository, Infra 쪽 Protocol 전부 삭제
- Infra쪽 Manager들은 모두 SingleTon (shared)
- viewModel (Input, Output)

##RxCocoa / delegate / handler
기완: 아직 cocoa잘 알지는 못하지만 되도록 cocoa쓰고 못쓸거같으면 delegate/hanlder 써도될거같다
상진: cocoa
현식: cocoa
수현: 별 생각 없음 뭐든 

결론: 
- RxCocoa 적극 활용
- 비동기로직에 Rx 적극 활용


## 주입
- 삭제하기(SceneDelegate?부분 수정하기)

array.first
array.last
array[safe: n]
[0]

subscript (safe index: Int)
if count < index return nil
return 

## AVPlayer. Layer
1. view (cell)
- AVplayer

2. Manager로 관리하자
- 


#### 합의를 하는 것이 정답이다. 싸우진말기 ㅋ




