-
Let Swift 2019 탐방 견문록, 정기 iOS 개발 행사를 엿보다iOS 2019. 11. 17. 15:59반응형
Let Swift 2019 탐방 견문록
베일에 싸인 신비로운 개발 연회, 레츠 스위프트의 이면을 엿보다
서문
베일에 싸인 신비로운 개발 연회, 레츠 스위프트의 이면을 엿보다
저번 let us: go! 2019 summer에서도 말한 바가 있었습니다만, iOS 개발자 행사는 그렇게 많지 않습니다. let us: go! 가 iOS Developer Korea 가 분기별로 진행한다고 합니다. 반면에 Let Swift는 OSXDev.org (https://www.facebook.com/groups/osxdevorg/) 가 연별로 진행됩니다.
다만 해당 그룹이 활성화되어 있는 편이 아니기 때문에,
보통 페이스북 그룹 Swift Korea(https://www.facebook.com/groups/swiftkor/)이나 동명의 슬랙 페이지에서 소식을 접할 수 있습니다.
티켓팅 서버가 불꽃이 되어 터지다
2019년 10월 10일, 티켓팅 신청은 festa를 통해 진행되었습니다. 신청자가 일제히 모이면서 심각한 서버 장애가 한 시간 이상 발생되었습니다. 80여 개의 좌석이 매진되지 않은 채였습니다. 사십여 분 정도 심각한 서버 장애가 발생했습니다. 오픈 톡방에 우후죽순 올라오는 티켓팅 성공자들의 행동 패턴이 올라왔습니다. 버튼을 계속 클릭하다 보면 언젠간 성공한다는 것입니다. 성공담에 충실히 따라 버튼을 누르고 또 누른 결과 티켓팅에 성공하게 되었습니다.
아키텍처와 개발 문화
오전에는 공통 세션이 열렸지만, 오후에는 세션 / 티타임 / 워크샵 세 종류로 열렸습니다.
저는 워크샵의 경우 하나도 참석하지 않았고, 세션과 티타임 위주로 들었습니다.
세션의 큰 흐름은 아키텍처라고 해도 과언이 아니었습니다. 유지보수와 테스트가 용이한 아키텍처를 어떤 것을 선택할 것인가. RxSwift를 어떤 패턴으로 활용할 것인가, 테스터블 코드를 어떻게 편리하게 짤 것인가에 관한 인사이트를 얻었습니다.
Keynote
발표자료 https://www.slideshare.net/godrm/letswift-2019
발표자 김정
레츠 스위프트 행사의 간단한 소개와 취지를 말씀해주시는 자리였습니다.
RxSwift to Combine (feat. SwiftUI)
발표자 박보영 https://github.com/fimuxd
발표자료 https://www.slideshare.net/BoYoungPark11/rxswift-to-combine-192620911
https://github.com/fimuxd/BringMyOwnBeer-Combine
이제 개발 방법의 메이저가 되어 버린 RxSwift과 앞으로 실무적으로 각광받을 Combine의 차이를 깔끔하게 정리해 주셨습니다.
RxSwift와 굉장히 컨셉이 유사하여, 러닝 커브가 그렇게 많아 보이지는 않겠다는 생각이 들었습니다.
Behind Scene of Delightful Experience
발표자 백성욱
개발자가 줄 수 있는 디테일한 애니메이션들에 대한 인사이트를 들었습니다.
프레임, 타이밍, 이징뿐만 아니라, 모던 어플리케이션의 실행 애니메이션, 화면 전환 애니메이션, 로딩 애니메이션에 대한 디테일을 발표하는 자리였습니다.
아래와 같이 정리해 보았습니다.
- 뷰가 나타날 때는 Ease Out (150~350ms), 사라질 때에는 Linear나 Ease in (100 ~ 150) 정도 한다.
- UIBezierPath와 CAGradientLayer를 이용해서 상세한 애니메이션을 줄 수 있다.
- UIViewControllerAnimatedTransitioning을 활용해 뷰 트렌지션을 조절할 수 있다.
- UIPropertyAnimator를 이용해 사용자가 애니메이션을 중단시키고 인터렉션을 하도록 구현할 수 있다.
미려한 UI/UX를 위한 여정
발표자 강승철
복잡한 동시성을 동반하는 UI/UX 처리를 구현하는 것을 가독성 있게 설계한 사례를 들었습니다.
아래와 같이 정리해 보았습니다.
- 화면 주사율을 고려해서 움직임을 처리하기 위해, CADisplayLink를 사용할 수 있다.
- Looper를 구현하고 애니메이션을 큐에 넣어서 콜백 헬을 정리한다.
MVC, MVVM, ReactorKit, Viper를 거쳐 RIB 정착기
발표자 안정민
다양한 아키텍처를 시도해보다가 우버의 RIBs(https://github.com/uber/RIBs)로 정착한 과정을 들었습니다.
아래와 같이 정리해 보았습니다.
기존 아키텍처에 왜 만족 못했는가?
- 아키텍처를 선택할 때. 격리화, 재사용성, 수정 용이함, 코드 표준화, 비즈니스 로직 단순화, 테스트 코드, 명확한 코드 위치를 고려한다.
- 기존 기능 수정 및 확장이 어려웠다.
- 아키텍처 도입 시절 Swift 이해도가 낮았다.
- 아키텍처별로의 표준화된 틀이 없었다.
- 유연하지 않은 설계로 인한 기능 확장의 어려웠다.
- 거대화된 팀으로 인해 많은 개발자들이 붙더라도 생산성의 향상이 없었다.
- 화면 단위가 아닌 프로세스 단위로 유연한 개발 필요
- 앱이 커지면 로직들에 대해서 프로세스 단위로 개발할 필요가 있었다.
- 복잡한 비즈니스 로직을 처리할 Viewless 아키텍처가 필요했다.
- 유명한 아키텍처를 참고해 자체 아키텍처 제작했으나, 코드가 변질되었다.
- 더 확실한 안정화를 할 필요가 있었다.
- 테스트 코드를 작성하고 싶었으나, 테스트 코드 템플릿, 가이드 있는 아키텍처가 없었다.
- 체계화된 테스트 코드 작성이 필요했다.
RIBs를 선택한 이유
- 템플릿화된 코드 및 테스트 작성이 용이한다.
- SourceKitten으로 파일을 분석해 템플릿 파일을 자동 생성한다.
- https://github.com/jpsim/SourceKitten
- 강제 프로토콜 지향
- 부모 - 자식 관계의 RIB가 통신하는 방법
- 인터렉터 간에서만 통신한다.
- 자식은 부모를 리스너로 호출한다.
- 부모는 자식의 바뀐 정보에 대해서 Rx로 구독한다.
- 부모 - 자식 관계의 RIB가 통신하는 방법
- DI
- 해당 립에서 필요한 속성을 Dependency에 정의한다.
- 필요한 정보를 컴포넌트에 정의함.
- 의존성이 확장되면 컴파일 에러가 발생한다.
- Rib 사용처에서 모두 작성해야 한다.
- 모든 것이 정적으로 일어남.
- Viewless RIB을 통한 비즈니스 로직 정리하기
- 복잡한 로직을 단위의 Rib으로 엮어서 작성한다.
- 예금 개설 시작 → 상품 조회 → 대상자 조회 → 해제 작업 끝나면 상품 소개 등을 묶어서 하나의 비즈니스 로직을 만들어서 할 수 있다.
- 복잡한 로직을 단위의 Rib으로 엮어서 작성한다.
개발자와의 심리전 - SDK 개발 중
발표자 황규영
티타임 세션이었습니다. 채팅 애플리케이션 SDK 센드버드에서 업무에 대한 일화들을 전달받았습니다.
아래와 같이 정리해 보았습니다.
- 최소 지원 버전이 iOS 8이기 때문에, 최신 기술을 쓰지는 않는다.
- 모든 코드는 테스트 코드를 작성하는 것을 원칙으로 한다.
- Android, iOS에 동일 기능을 작성하기 전에 각 파트의 시니어 레벨이 모여서 인터페이스를 설계한다.
- 리뷰어는 다른 플랫폼의 동일 기능 개발자와, 같은 플랫폼의 시니어 레벨 두 명이 담당한다.
RxTesting 같이 시작하기
발표자 이병찬
RxSwift에서 테스트 코드를 작성할 때 활용할 수 있는 라이브러리, RxTest(https://github.com/ReactiveX/RxSwift/tree/master/RxTest)와 RxBlocking(https://github.com/ReactiveX/RxSwift/tree/master/RxBlocking)에 대하여 소개하는 세션이었습니다.
아래와 같이 정리해 보았습니다.
TestCode 란
어떤 동작을 수행했을 때
-
원하는 값이 나오는지 검증하는 것
-
연속되어야 하는 코드를 검증하는 것
RxBlocking
예시 ) Observable.from([1,2,3]).toBlocking()
- onComplete 가 떨어질 때까지 기다리고, 옵저버블을 배열로 반환한다.
- onComplete 가 반드시 떨어져야 한다.
- 콜드 옵저버블에서만 가능하다.
- .toBlocking(timeout) 으로 잘라서 완료시키면 핫 옵저버블에서도 가능하다.
RxTest
-
createHotObservable
핫 옵저버블을 생성한다.
-
createColdObservable
콜드 옵저버블을 생성한다.
-
시간 개념을 옵저버블에 넣는다.
-
Hot, Cold 옵저버블 모두를 검증할 수 있다.
- 가상의 시간이 다 흐를 떄까지 관찰 후 타이밍과 Event 반환
테스트 코드
- 당연하게 동작할 것 같은 코드의 배신은 핫픽스를 낳는다.
- 테스트 코드는 당연한 코드가 당연하게 동작하는지 검증한다.
- 모이고 모여서 제품의 핫픽스를 줄인다.
- RxSwift 의 테스트 코드는 옵저버블이 당연하게 방출되는지 검증한다.
iOS 앱에서 머신러닝이 해결할 수 있는 문제들
iOS 클라이언트에서 모바일 머신러닝이 모델을 어떻게 경량화시키고 탑재하는지 소개하는 세션이었습니다. 모델의 학습하는 과정을 연구하는 것보다는, 기존에 잘 만들어진 모델을 어떻게 활용할 수 있는지 소개했습니다.
정리한 내용은 다음과 같습니다.
모바일 머신러닝을 하는 이유
- 사용자 프라이버시 친화 - 기기 안에서 모든 것을 처리
- 네트워크 비용 절감
- 지연시간 감소
머신러닝 개발 프로세스
-
학습
- 데이터를 넣어서 알고리즘을 만들어가는 단계
- 모델을 뽑아내게 되고 검증하면서 좋은 모델을 만들어나가는 모델
-
추론
- 서버, 모바일에서 모델을 직접 사용하는 단계
- 전처리 / 후처리를 해서 모델을 잘 사용할 수 있도록 조정
-
추론이 서버가 아니라 모바일에서 진행된다.
-
서버에 비해서 자원이 열악하다.
-
전처리, 후처리 등을 구현해야 한다.
-
모델을 플랫폼에 적합하게 추출해야 한다.
- 모바일에서 사용하면 프레임워크에 맞는 모델로 변환해주는 단계가 추가됨.
활용 예시
- 이미지 분류 입력: 이미지 출력: 카테고리
- 오브젝트 감지 입력 : 이미지 출력 : 위치와 영역(VNDectedObjectObservation) + 카테고리 (VNRecognizedObjectObservation)
- 텍스트 감지
- 깊이 예측 픽셀 별 카메라와 거리를 찾아줌. 입력: 이미지 출력: Depthmap 뎁스 카메라 없이 가능.
- 포즈 에스티메이션 사진에서 사람의 골격 위치를 찾아줌. 입력 : 이미지 출력: Heatmap
- 이미지 세그멘테이션 사진에서 픽셀별 카테고리를 찾아줌 입력 : 이미지 출력 : 세그멘테이션 맵 ( 픽셀마다 번호를 매겨줌 )
- Image Style Transfer
고려할 점
- 실데이터로 모델 검증
- 결과만 보고 정확도가 99% 믿고 바로 사용하나.
- 추론 속도 비교
- 디바이스마다 추론 속도가 다른 모델이 있고, 비슷한 모델이 있다.
- 어떻게 사용자들에게 똑같은 경험을 줄 것인지 고려해야 한다.
스타일쉐어 iOS팀 개발 문화
마지막으로 티타임 세션을 들었습니다. 스타일쉐어 iOS 개발 문화를 소개하는 자리였습니다.
정리한 내용은 다음과 같습니다.
- 풀 리퀘스트는 가능한 쪼개서 상세히 작성한다. 커밋 메시지도 리뷰어를 위해 순차적으로 작성한다.
- Xcodegen을 이용하여 빌드한다.
- 기획 스펙을 테스트 코드 위에 작성한다.
- 컨플루언스의 문서를 notion으로 옮기고, notion에 온보딩 문서를 작성한다.
발표 자료
세션들의 발표 자료들을 통합해서 정리했습니다.
-
클린 아키텍처
https://www.slideshare.net/godrm/letswift19cleanarchitecture
-
MVC MVVM ReactorKit Viper
https://speakerdeck.com/minsone/mvc-mvvm-reactorkit-viperreul-geocyeo-rib-jeongcaggi
-
프레임워크 주도 개발 Session LetusGo 2019 Spring
https://www.slideshare.net/MinM9510/a-framework-driven-development-138805806
Viper 아키텍처의 선행 자료
-
-
RxTest 같이 시작하기
https://www.slideshare.net/ssuser750dc6/rxswift-testing-feat-rxblocking-rxtest-192641266
- iOS 앱에서 머신러닝이 해결할 수 있는 문제들
https://www.slideshare.net/DoyoungGwak/lets-swift-2019-ios
-
참고자료
-
실용적인 Swift 함수형 프로그래밍
https://www.slideshare.net/imyostarr/letswift-2019-193026704
- 주니어 개발자의 성장하는 글쓰기
https://github.com/Kyoo32/letSwift2019_growingWriting
- RxSwift to Combine (feat. SwiftUI)
https://www.slideshare.net/BoYoungPark11/rxswift-to-combine-192620911
-
RxSwift + RxCocoa
-
Combine + SwiftUI
-
미려한 UI/UX를 위한 여정
https://www.slideshare.net/seungchulkang39/uiux-193451561
- Swift in SwiftUI
https://www.slideshare.net/itpersons/swift-in-swiftui
- Xcode Previews - IB 없이 개발하기
https://speakerdeck.com/vcnc/xcode-previews-ibeobsi-gaebalhagi
- 코드로 iOS UI 편하게 작업하기 위한 라이브러리 작업
http://letswift.kr/2019/resources/Session10_JungwooLEE.pdf
요약
처음으로 레츠 스위프트에 가게 되어 여러 세션을 들을 수 있었습니다. 렛어스고 서머에서는 iOS 13의 신기능에 관한 내용을 들었습니다. 반면 레츠 스위프트는 아키텍처와 단위 테스트, 개발 문화에 대해 강연을 들어볼 수 있는 자리였습니다.
여담으로 스타일쉐어 세션이 조금 늘어졌는데, 그 와중에 추첨 행사를 진행해버려서 상품을 못 받아간 게 좀 입맛이 쓰더군요. 나중에 확인해보니까 제 이름은 안 불렸던 것 같아서 다행이라고 해야 할지... 그 대신 렛어스고 가을 행사에서 에어팟2을 당첨받았으니, 그거로 충분히 만족해야겠습니다.
그럼 다음 iOS 행사에서 만나요~
반응형'iOS' 카테고리의 다른 글
iOS, Android WebView 와 네이티브간의 유용한 통신 방법 - Javascript Interface, Webkit Messaging (0) 2020.02.20 IOS 에서 머터리얼 디자인의 물결 이펙트 버튼 만들기 (0) 2019.12.26 iOS 13을 대응해야 하는 개발자가 알아야 하는 8가지 급한 불 리스트 (1) 2019.08.30 정보처리 산업기능요원을 생각한다면 반드시 숙지해야 할 사항들 (4) 2019.08.02 FCM iOS SDK 5.16.0 부터 토큰을 정상적으로 보내지 못하는 버그가 있어서, 이슈가 해결되지 않은 버전으로 절대 릴리즈하지 않을 것을 권합니다. (0) 2019.04.21