-
Notifications
You must be signed in to change notification settings - Fork 0
AWord Description
일정: 2021.11.29 ~2021.12.7
영어 단어장 애플리케이션 (개인 프로젝트)
- CoreData
- RxSwift
- RxDataSource
- SnapKit
![스크린샷 2021-12-08 오후 4 09 27](https://user-images.githubusercontent.com/74225754/145164582-bca25edd-aa5a-4300-9894-f19b8aa3c9f8.png)
화면은 TableView 로 구성하였습니다.
TableView 에 Item 이 하나도 없을 경우 좌측 이미지 처럼 흰 Pop up View 와 Hand Tap Image 를 보이게 하였고 Hand Tap Image 에는 Animation 을 주어 탭하는 장면을 연출하였습니다.
![스크린샷 2021-12-08 오후 4 09 52](https://user-images.githubusercontent.com/74225754/145164587-646f5757-a1e2-4ea2-8fc3-c5adc7c61304.png)
WordSet 을 생성할 수 있는 화면입니다.
만약 동일한 이름으로 WordSet 을 생성하면 우측 화면처럼 생성이 불가능하다는 화면이 나옵니다.
![스크린샷 2021-12-08 오후 4 10 23](https://user-images.githubusercontent.com/74225754/145164620-634c139c-83ef-4b3c-8912-8db56aa22881.png)
WordSet 화면과 유사한 방식으로 구현했습니다.
단어를 클릭할 시 가장 우측의 화면처럼 단어 + 뜻 으로 Flip 되도록 구성하였습니다.
![스크린샷 2021-12-08 오후 4 10 36](https://user-images.githubusercontent.com/74225754/145164597-750c24fd-0cda-40c0-84a6-74b80cd94a60.png)
또 학습하기 버튼은 단어 5개 보다 적을 때는 이렇게 알려주도록 하였습니다.
![스크린샷 2021-12-08 오후 4 10 49](https://user-images.githubusercontent.com/74225754/145164605-ffc5c96f-c7e1-4e22-a431-29c75892757e.png)
WordSetCreateViewController 와 유사하게 구현하였습니다.
![스크린샷 2021-12-08 오후 4 11 00](https://user-images.githubusercontent.com/74225754/145164608-436fdc1c-325c-4f07-bcdc-fb4693f3c5a6.png)
Word 배열을 받아 shuffled 하여 TestWord 배열을 생성합니다.
TestWord 에는 problem: Word, examples: [Word] 이 있어
좌측 상단의 Happy 는 problem 으로 생성하였고 하단에 있는 예시는 examples 로 생성하였습니다.
스피커 버튼을 누르면 AVFoundation 의 AVSpeechSynthesizer 를 이용하여 영어인지 한글인지 확인하고 발음하도록 하였습니다.
![스크린샷 2021-12-08 오후 4 11 08](https://user-images.githubusercontent.com/74225754/145164611-b0077cfa-651a-446f-8ba8-0cddfb254d63.png)
테스트 결과 화면입니다.
CollectionView 로 구현을 하였고 스피커 버튼도 동일하게 구현하였습니다.
확인 버튼을 누르게 되면 초기 화면 (WordListViewController) 로 가게 되고
해당 단어를 맞췄는 지, 틀렸는 지에 대해 v, x 마크로 표시가 됩니다.
- Coordinator 패턴
Coordinator 라는 Class 를 생성하여 그 Coordinator 가 모든 화면 전환을 하도록 하였습니다.
SceneDelegate 에서 Coordinator 를 생성하였고, ViewModel 은 이 Coordinator 를 갖도록 의존성을 주입하였습니다.
화면 전환이 Pop 이나 Push 같은 Navigation 은 괜찮았으나,
Modal, Dismiss 는 ViewController 를 받아서 사용해야 했습니다.
즉, ViewController 에서 ViewModel 로 자신 (ViewController) 를 넘겨주고 그것을 또 Coordinator 로 넘겨주어 화면 전환을 진행했습니다.
이런 화면 전환에 대해 더 개선해야할 것 같습니다.
- Protocol
CoreData 를 사용하기 전에 단어에 대해 CRUD 하는 것을 메모리로 진행했습니다.
전에는 프로토콜을 사용하지 않았으나 이번에는 프로토콜을 이용하였고 덕분에 메모리 저장소에서 CoreData 로 변경할 때 바꿔야할 코드가 적어서 좋았습니다.
그러나 프로토콜 을 한 번에 잘 설정하였으면 좋았을텐데 CoreData 로 적용하면서 (+ 새로운 기능을 추가하면서) 프로토콜을 자주 변경해야한 점이 아쉬웠습니다.
- CoreData
CoreData 는 처음 사용하는 거라 많이 헷갈렸습니다.
WordSet 이 Word 라는 배열을 갖고 있는 구조인데
WordSet 을 지우면 Word 가 모두 지워져야 하는데
또, WordSet 을 선택하게 되면 해당 Word 로 연결이 되는 그런 Relation 에 대한 방법을 검색해봐도 잘 파악하지 못했습니다.
따라서, WordSet 을 생성할 때 Identity (String) 을 같이 생성하는데
Word 를 생성할 때 WordSet 의 Identity 를 받아 생성하도록 하였습니다. (parentIdentity 라 함)
Word 는 단순히 Word 만 제거하면 되지만,
WordSet 을 제거할 때는 먼저 WordSet 의 Identity 로 Word 의 parentIdentity 와 동일한 것을 모두 제거하는 방식으로 구현하였습니다.
처음에 시작할 때는 코드가 나름 깔끔하고 체계화된 것 같았지만,
처음 사용하는 기능이 추가될 때 점차 지저분하게 작성하고 있다는 것을 느꼈습니다.
기능에 대해 더 학습하고 어떻게 적용할 것 인가에 대해 더 고민해야할 것 같습니다.