Skip to content

AWord Description

hogumachu edited this page Dec 13, 2021 · 2 revisions

AWord

일정: 2021.11.29 ~2021.12.7

영어 단어장 애플리케이션 (개인 프로젝트)

시연 영상

Link

사용 기술

  • CoreData
  • RxSwift
  • RxDataSource
  • SnapKit

앱 설명

WordSetViewController

스크린샷 2021-12-08 오후 4 09 27

화면은 TableView 로 구성하였습니다.

TableView 에 Item 이 하나도 없을 경우 좌측 이미지 처럼 흰 Pop up View 와 Hand Tap Image 를 보이게 하였고 Hand Tap Image 에는 Animation 을 주어 탭하는 장면을 연출하였습니다.


WordSetCreateViewController

스크린샷 2021-12-08 오후 4 09 52

WordSet 을 생성할 수 있는 화면입니다.

만약 동일한 이름으로 WordSet 을 생성하면 우측 화면처럼 생성이 불가능하다는 화면이 나옵니다.


WordListViewController

스크린샷 2021-12-08 오후 4 10 23

WordSet 화면과 유사한 방식으로 구현했습니다.

단어를 클릭할 시 가장 우측의 화면처럼 단어 + 뜻 으로 Flip 되도록 구성하였습니다.

스크린샷 2021-12-08 오후 4 10 36

또 학습하기 버튼은 단어 5개 보다 적을 때는 이렇게 알려주도록 하였습니다.


WordListCreateViewController

스크린샷 2021-12-08 오후 4 10 49

WordSetCreateViewController 와 유사하게 구현하였습니다.


TestViewController

스크린샷 2021-12-08 오후 4 11 00

Word 배열을 받아 shuffled 하여 TestWord 배열을 생성합니다.

TestWord 에는 problem: Word, examples: [Word] 이 있어

좌측 상단의 Happy 는 problem 으로 생성하였고 하단에 있는 예시는 examples 로 생성하였습니다.

스피커 버튼을 누르면 AVFoundation 의 AVSpeechSynthesizer 를 이용하여 영어인지 한글인지 확인하고 발음하도록 하였습니다.


TestResultViewController

스크린샷 2021-12-08 오후 4 11 08

테스트 결과 화면입니다.

CollectionView 로 구현을 하였고 스피커 버튼도 동일하게 구현하였습니다.

확인 버튼을 누르게 되면 초기 화면 (WordListViewController) 로 가게 되고

해당 단어를 맞췄는 지, 틀렸는 지에 대해 v, x 마크로 표시가 됩니다.


어려웠던 점 (느낀 점)

  1. Coordinator 패턴

Coordinator 라는 Class 를 생성하여 그 Coordinator 가 모든 화면 전환을 하도록 하였습니다.

SceneDelegate 에서 Coordinator 를 생성하였고, ViewModel 은 이 Coordinator 를 갖도록 의존성을 주입하였습니다.

화면 전환이 Pop 이나 Push 같은 Navigation 은 괜찮았으나,

Modal, Dismiss 는 ViewController 를 받아서 사용해야 했습니다.

즉, ViewController 에서 ViewModel 로 자신 (ViewController) 를 넘겨주고 그것을 또 Coordinator 로 넘겨주어 화면 전환을 진행했습니다.

이런 화면 전환에 대해 더 개선해야할 것 같습니다.

  1. Protocol

CoreData 를 사용하기 전에 단어에 대해 CRUD 하는 것을 메모리로 진행했습니다.

전에는 프로토콜을 사용하지 않았으나 이번에는 프로토콜을 이용하였고 덕분에 메모리 저장소에서 CoreData 로 변경할 때 바꿔야할 코드가 적어서 좋았습니다.

그러나 프로토콜 을 한 번에 잘 설정하였으면 좋았을텐데 CoreData 로 적용하면서 (+ 새로운 기능을 추가하면서) 프로토콜을 자주 변경해야한 점이 아쉬웠습니다.

  1. CoreData

CoreData 는 처음 사용하는 거라 많이 헷갈렸습니다.

WordSet 이 Word 라는 배열을 갖고 있는 구조인데

WordSet 을 지우면 Word 가 모두 지워져야 하는데

또, WordSet 을 선택하게 되면 해당 Word 로 연결이 되는 그런 Relation 에 대한 방법을 검색해봐도 잘 파악하지 못했습니다.

따라서, WordSet 을 생성할 때 Identity (String) 을 같이 생성하는데

Word 를 생성할 때 WordSet 의 Identity 를 받아 생성하도록 하였습니다. (parentIdentity 라 함)

Word 는 단순히 Word 만 제거하면 되지만,

WordSet 을 제거할 때는 먼저 WordSet 의 Identity 로 Word 의 parentIdentity 와 동일한 것을 모두 제거하는 방식으로 구현하였습니다.

총평

처음에 시작할 때는 코드가 나름 깔끔하고 체계화된 것 같았지만,

처음 사용하는 기능이 추가될 때 점차 지저분하게 작성하고 있다는 것을 느꼈습니다.

기능에 대해 더 학습하고 어떻게 적용할 것 인가에 대해 더 고민해야할 것 같습니다.