[회고] 사이드 프로젝트 EmojiCommit 을 돌아보며
시작 계기
올해 초부터 회사에서 일주일에 네시간씩 자기 개발이든 뭐든 자유롭게 사용할 수 있는 시간을 주기 시작했다
이 맘때쯤 내가 갖고 있던 생각은?
흠,, SwiftUI 랑 Combine 슬슬 조져봐야하는데,,??? MVVM도 써보고,,,
TDD,,? 아주 말로만 백날 천날 듣기만 하고 테스트 코드 언제 작성해보지.. ㅎㅎ.. Quick & Nimble 많이 사용하는 듯? 하 써봐야하는디 ㅠ
언젠간 해야지,, ^.ㅠ 하고 부채감만 쌓아두고 있던 게으른 잇프피 인간은 이 기회에 반강제로 플젝 시작하기로 결정 ㅎㅎ
주제 정하기
주제 정하는 의식의 흐름은 이랬다
- 어차피 무슨 주제를 잡든 SwiftUI, Combine, Test Code 다 생소한거니까 제일 간단한것으로 잡자,,
- 그래도 네트워크 통신은 해봐야겠지?
- 흠 통신 API는 깃헙이 국룰이긴 하지
- 커밋 많이할수록 그날 잔디가 진하게 표시되는데, 이걸 단계별 이모지로 커스텀하게 표현할 수 있게 하자
그래서 탄생한게 아래의 초안!
그렇게 개발을 하다가, 단계별로 이모지를 하나 하나 설정하는게 너어무 귀찮은걸 느꼈다. 그리고 중요한건 이모지로 설정해봤자 조합이 별로 안예쁘게 나온다는 것!
나라도 안쓰고 싶을거 같아서 출시 한달 전에 단계별 색깔 테마를 설정할 수 있게 하자~ 로 노선을 변경했따. 그리고 귀여운 요소는 남아있어야하니까 색깔에 표정을 추가하기로 ㅎㅎ
사용 기술
이 프로젝트를 진행하면서 아래와 같은 기술들을 사용했다.
- SwiftUI
- Combine
- MVVM
- Widget
- SwiftLint
- Unit Test ( using Quick & Nimble )
- Localization ( ko, en, zh-Hans, ja, es )
- Google AD mobile
- FirebaseAnalytics, FirebaseCrashlytics
- Github Actions (
develop
브랜치 - test code 실행 /release
브랜치 - 테스트 플라이트 자동 등록 ) - Swift Package Manager, CocoaPods
사용하면서 느낌점들을 간략히 써보자면?
SwiftUI
- 확실히 코드가 짧고 직관적임
- 레이아웃을 안줘도 알아서 적당히 예쁘게 배치됨. 알잘딱깔센!
- 컴포넌트 단위로 뷰를 조립해가는 느낌. 컴포넌트 별로 코드 분리가 쉬워서 파일당 코드를 짧게 가져갈 수 있음
- state에 따라 알아서 뷰가 변경 돼? 꽤나 멋져..?
- 점점 지원하는 기능이 많아져서 좋음. UIKit 이용해서 짜려면 벌써 머리 지끈해오는 것도 스유에선 꽤나 간단하게 구현되는 것들이 많음
- 예전엔 UIKit 에서만 되는 것들이 많아서 섞어써야하는 부분들도 있었는데 점점 줄어드는 듯. 물론 애초에 그 정도로 정밀하게 UI를 설계하지도 않긴 함 ㅎㅎ UIKit도 쓰까 써야한다? 하면 SwiftUI-Introspect 라는 좋은 라이브러리 있음. 물론 써보진 않음
- 생각보다 preview가 잘 뜨게 하려면 노오력이 필요. 그래서 언제부턴가 아예 프리뷰 끄고 코딩 함
- 기존 뷰를 VStack 같은걸로 한번 더 감쌀때 code indent 다 옮겨져가지구 git diff 로 뜨는건 좀 많이 싫음
- GeometryReader는 여전히 어려움. 우리.. 친해져요.. 지선배..
Combine
- data 의 흐름을 나타내는 subject를 만들어서 구독하기 때문에 해당 데이터에 영향을 받는 애들을 분리해서 보기 좋음
- 근데 처음 해봐서 별걸 다 subject로 만든터라 이렇게 쓰는게 맞나 싶긴 함
- 멋진 operator 들이 많음. operator 이름으로 데이터들이 어떻게 변형될지 유추 가능. operator 들을 조합해서 단계별로 데이터를 변형하기 때문에 한번에 봐야할 코드 스코프가 짧아져서 읽기 편함
- 이전에 살짝 이론상으로 맛만 본 RxSwift 내용이 도움된걸 보니,, 이제 rx도 쓸 수 있을까?
MVVM
- 뷰 쪽 코드 짱 짧아짐
- 테스트 코드 짤 때 뷰 모델만 주입하면 됨
- 근데
let settingSystemImageName = "gear"
이런 것까지 viewModel 에 변수로 넣어버렸는데 여기 넣는게 맞나? 어디까지 넣어야하지?
Widget
- SwiftUI 로 컴포넌트 단위로 잘 쪼개놓으면 뷰 재사용할 때 편함
- 기본 유저 디폴트 값은 공유가 안되고 app groups 를 이용해야하다니 충격
- 위젯은 변경 내용을 바로 수신하는게 아니라서, 위젯에 표시할 내용은 timeline 을 설정할 때 수행해야 하다니 충격 (timeline — Widget을 언제 업데이트 할지, 즉 Date를 담은 배열)
- 그래서 변경 사항이 있을 경우 앱에서 위젯 타임라인을 다시 로드해야 하다니 충격.
SwiftLint
- 역시 코드 깔끔해짐. 덕분에 유지 보수 할때 거부감 덜 듦
Unit Test ( using Quick & Nimble )
- 처음엔 TDD를 목표로 했지만? 시작 못하겠고요? 그래서 우선 비즈니스 로직 작성한 다음에 그거에 맞는 테스트 코드 작성 함. 테스트 코드 짜기에 의의 두기로 ㅎㅎ 이렇게 익숙해지면 나중에는 TDD 도 할 수 있겠쥐~
- 중간에 TestCase fail 나서 봤는데 로직 변경이 잘못된거 발견하기도 함. 이래서 테스트 코드 짜는군?
- Test Double (테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체) 을 사용해야하는 경우도 있으니까 Dependency Injection과 의존관계 분리에 좀 더 신경쓰게 됨
- Unit Test 장점 중에 ‘test succeed 되면 로직 변경해도 자신있게! 배포 가능’이 있었는데 맞는 듯
- Quick 쓰니까 given-when-then 구조로 테스트 코드 작성하기 용이해짐
- Nimble 쓰니까 여러가지 종류의 assertion 사용할 수 있고, 에러 로그 직접 입력할 필요 없음
Localization ( ko, en, zh-Hans, ja, es )
- Localizable.strings 이용해서 현지화 해보고 싶었음
- 생각보다 별거 없고 귀찮기만 함
Google AD mobile
- 조금이나마 돈 좀 벌어보겠다고 붙여봤음
- 처음에 전면 광고로 설정 했다가 sheet 로 띄워진 뷰에서는 해당 광고 유형이 나타나지 않는 이슈가 있었음.
- 그래서 아래 작게 나타나는 배너 광고로 바꿨는데 디버그 모드에서는 잘 뜨더니 실제 배포하니까 안보인다…? 후.. 그래서 그냥 내려버림. 내가 과연 나중에 다시 붙일까?
- 덕분에? 앱이 수집하는 개인정보를 세세하게 설정해볼 수 있었긴 한데,, 정작 애드는 나오지 않다니 억울하다 억울해
FirebaseAnalytics, FirebaseCrashlytics
- 역시 얘는 기본적으로 있어야 함. 지표 확인하고 크래시 확인해야하니까!
Github Actions
develop
브랜치 - test code 실행
release
브랜치 - 테스트 플라이트 자동 등록
- test code 실행시키는 workflow는 그렇다 쳐도, test flight 까지 등록하는 workflow 작성하는게 너무너무너무 힘들었음
- 그냥 local 에서 archive 하고 업로드하는게 훨씬 빠르고 쉽기 때문에 중간에 때려칠까 하는 생각이 백번도 넘게 들었지만 나중의 내가 편할거다라고 세뇌하면서 잘 참아냄. 그리고 fastlane 등도 이용해본적 없기 때문에 한번 자동화 구축해보고는 싶었음.
- 성공했을때 엄청 기뻤고 역시나 24시간도 안돼서 v 1.0.1 을 배포하게 된 미래의 내가 편했음.
- 하지만 여전히 프로세스가 로컬에서 돌리는것보다 오래 걸리는건 좀 답답쓰. 한국 사람? 빨리 빨리.
Swift Package Manager, CocoaPods
- SPM 으로 모든 라이브러리 관리하고 싶었는데 역시 아직 지원 안하는 것들이 있어서 섞어 써야했음. 쩝…
- 근데 SPM은 헤드 바꿀 때 간간히 Package loading in progress 하면서 바로 빌드 안되는게 답답하긴 했음. 한국 사람? 빨리 빨리.
향후 계획
위에서 말했듯이 구글 애드 붙였는데 테스트에선 잘 나오고 배포했을때는 안나오는 이슈가 있어서 호다닥 지워서 재배포했다. 아쉬운대로 Buy Me a Coffee 같은 인 앱 결제도 넣어보려고 했는데 얘도 뭐 설정해야하는게 많아서 귀찮아서 못해먹겠다!
흠,, 뭐 유지 보수라도 잘하면 선방치는거 아닐까? ㅎㅎ
아래는 요즘 또 해봐야지,, 하고 부채감 갖고 있는 것들인데 해볼라면 이 프로젝트에 적용해봐야겠다
- CleanSwift
- WatchOS
- CoreData
- Tuist
GitHub 링크
과아연 궁금한 사람이 있을진 모르겠지만? 그래도 깃헙 링크 첨부!