Let’Swift 2019 후기

A Change of Season

Let’Swift 컨퍼런스에 참여해서 발표를 듣고 정리한 내용과 간단한 생각들을 정리해봤다. (잘못되거나 틀린 내용이 있을 수 있습니다.)

키노트 + 컨퍼런스를 즐기는 방법

  • 1~10년차의 다양한 개발자가 참여
  • 작년부터 워크숍 세션 진행 (참여형)

A Change of Season
Swift로만 지원하는 프레임워크가 나오면 스위프트를 시작해도 된다,
올해 SwiftUI, Combine 등이 나옴. 바로 지금이 그 때이다!

“고수가 되려면 고수가 있는 커뮤니티에 들어가라"

커뮤니티가 축적되지 않고 소비되고 있는 게 요즘 현실,
페이스북 그룹, 카카오톡 오픈챗, 슬랙 채널 등등…

컨퍼런스를 즐기는 방법:
직접 참여해서 만드세요.

RxSwift to Combine (feat. SwiftUI)

Combine은 ‘이벤트 처리 연산자를 결합하여 비동기 이벤트 처리를 다루는(customize)’ 프레임워크

기존의 UIKit에는 비동기 인터페이스가 여러 개 있었는데, 이것을 변화하는 값을 처리하는 선언적 API로 만든 것

RxSwift와 비교해서 Combine에만 있는 오퍼레이터:
try가 붙는 것들 (에러 핸들링 쉽게 처리할 수 있도록 함)

Combine에는 RxSwift와 비교해서 DisposeBag 개념이 없는데, 전수열님이 CancelBag을 이미 만드셨음

Combine 관련 WWDC 세션:
Introducing Combine, Combine in Practice, Modern Swift API Design

Data Flow Through SwiftUI:
Action → State → View

BringMyOwnBeer🍺 예제코드 비교 (RxSwift, Combine + SwiftUI)
RxSwift-MVVM 예제, Combine+SwiftUI 예제

정리
- 앱 사이즈에 영향 (RxSwift 프레임워크를 포함하지 않아서 Combine이 더 작음)
- 퍼포먼스 비교에서도 Combine이 우세 (처음부터 성능에 중점을 두고 만들어짐)

Behind Scene of Delightful Experience

애니메이션에도 중요한 기본 원칙들이 있다.

개발에서 다룰만한 것들: Frame, Easing, Timing

Launch Animation
스플래시 이후에 초기 실행을 위한 동작을 하는 동안에 애니메이션 처리

Loading Animation
컨텐츠가 표시되기 전에 플레이스홀더 보여줌

UIViewController Animation
뷰 컨트롤러 사이의 전환에서 애니메이션 처리

Interrupt an Animation
예) (애플)지도에서 하단에 뜨는 메뉴 UI
중간에 애니메이션 취소가 가능

미려한 UI/UX를 위한 여정

CADisplayLink:
화면 주사율에 맞춰서 작성한 코드를 실행한다.

Looper:
애니메이션 처리에 필요한 데이터, 실행에 필요한 코드를 클로저로 받아서 처리…

여기까지 이해를 했고, 이후에는 급격히 난이도가 올라갔다; 📈

MVC, MVVM, ReactorKit, Viper를 거쳐 RIB 정착기

발표자료

RIB: 라우터, 인터렉터, 빌더. 뷰가 없는 아키텍처 (기존 아키텍처와 가장 큰 차이점)

화면 단위가 아닌 프로세스 단위로 유연한 개발 필요

  • viewless 아키텍처 필요 (비즈니스 로직)
  • 자체 아키텍처의 한계

더 확실한 안정화 필요

  • 테스트 코드 작성 필요
  • 테스트 코트 템플릿, 가이드 없었음 (기존의 아키텍처)

MV(C) → MVVM → ReactorKit → VIPER

MVVM:

  • MVVM에 대한 표준화된 틀이 없고, 사람마다 이해가 다름
  • 테스트 코드 작성이 가능하지만 어려움

ReactorKit:

  • 단방향으로 View가 깔끔해짐
  • 프로세스 단위의 아키텍처가 아님

템플릿화된 코드 및 테스트 작성

  • Xcode 템플릿 제공 (유닛 테스트, 컴포넌트 익스텐션 포함)
  • 기본적인 테스트 코드 추가, Mock 제공

(강제)프로토콜 지향 프로그래밍

  • 각 객체가 프로토콜로 연결
  • 프로토콜을 준수하지 않으면 컴파일 에러

의존성 주입 DI

  • 해당 RIB에서 필요한 속성을 Dependency에 정의
  • Dependency가 확장되면 컴파일 에러 발생

Viewless RIB을 통한 비즈니스 로직 정리

  • 전체적인 비즈니스 로직 중에 화면이 필요없는 로직에 적용 가능

프로젝트를 별도로 만들어서 패키징하고 RIB을 작게 시작 (프레임워크)

장점:

  • 템플릿화
  • 프로토콜 지향 프로그래밍
  • 모듈화 & 재사용

단점:

  • 프로토콜 지향 꼭 해야 하는가? (손이 많이 감…)
  • 파일이 많이 생성되는 문제 (VIPER와 같은 문제)
    - 프레임워크로 분리하면 해결 가능함

Swift in SwiftUI

Swift 5.1에서 추가된 기능 중에서 SwiftUI에 적용된 것들

  • 단일 표현식일 때만 함수에서 리턴문 생략
  • SwiftUI에서 (some) view에도 적용
  • SwiftUI는 하나의 뷰가 여러 뷰를 감싸는 형태로 구현
  • 불투명 타입? some 으로 대체
  • 제너릭의 방향을 반대로 이해, 리버스 제너릭
  • 실체 타입만 반환 가능
  • 단일 개체에 대해 상태의 변화에 상관없이 식별을 위한 프로토콜 추가
  • Hashable을 준수하는 id값만 가짐
  • @State, @Binding, … (SwiftUI에서 쓰이는 것들)
  • Wrapper Type 구현
  • 프로퍼티에 대한 접근 패턴을 정의

Xcode Previews - IB 없이 개발하기

원래 부제는 ‘타다가 IB를 버린 이유'… 쎄다!!

Mastering Xcode Previews 참고

보통의 개발자와 디자이너와 협업 과정:
수정 → 빌드 → 화면으로 이동 → 피드백 → (반복)
시간이 매우… 오래 걸림 (빌드 & 상태 맞추기 & 화면으로 이동)

PreviewProvider 프로토콜을 구현하면 Xcode의 Previews 기능 사용 가능

layout, environment을 바꾸면서 미리보기 가능 (위의 과정이 필요없음)

Development Assets (Previews에서 사용할 수 있는 리소스)

Normal Build와 별도로 Preview Build가 생성

원본 파일 외 추가적인 소스 파일 생성 (내부적으로)

UIViewControllerRepresentable 프로토콜을 구현하면 이전의 UIKit도 Previews 가능

사실은 UIKit → SwiftUI를 해결해주는 프로토콜

Tip. 디버깅 빌드 설정만 iOS 13으로 바꾸고 canImport, @available 활용

  • 읽거나 수정할 수 없는 XML
  • 졸라 큰 파일, 툴 버전도 포함…
  • 컨플릿 나면… 🤯
  • 점점 커지는 스토리보드;
  • IB와 Swift는 서로 모름,
  • 컬러 에셋을 적용할 때 버그가 있음
  • IB의 장점: 시각화, 미리보기, 뷰와 컨스트레인트 구조 파악.
  • 코드로 UI 작성의 단점: 전체 구조 어려움, 파악하려면 코드 전체를 봐야,
  • IBKit
    - Swift 5.1의 기능과 SnapKit의 컨셉을 가지고 선언적인 UI 구현 가능한 프레임워크

iOS 앱에서 머신러닝이 해결할 수 있는 문제들

발표자료

모바일 머신러닝에서 어려운 부분: 모델 추출, 추론

Core ML Survival Guide (책)

추론이란? 입력에 대한 예측한 결과를 출력하는 것

도구들: Core ML, TF Lite, Pytorch Mobile

머신러닝을 사용하는 방법

  • 프레임워크 API 활용
  • 모델을 찾아서 활용

이후에는 여러가지 머신러닝 기법을 데모를 통해 직접 시연으로 보여주셨음

코드로 iOS UI 편하게 작업하기 위한 라이브러리 작업

제목 맨 마지막의 ‘작업'을 미처 못보고 UI를 편하게 만들 수 있는 라이브러리를 소개하는 세션인 줄 알았다. 하지만 프레임워크를 만들게 된 과정을 이야기 하는 세션이었다. Xcode Previews 세션과 다소 겹치는 내용들이 있었다.

코드로 UI 작업을 할 때 가장 큰 문제점은 뷰의 중첩과 오토레이아웃.

코드로 오토레이아웃을 다루는 방법

  • Layout Constraint 사용
  • Visual Format 사용
  • Anchor 사용

하지만 모두 뷰가 복잡해질수록 코드가 늘어나고 가독성이 떨어짐

그래서 오토레이아웃을 다룰 때 가장 많이 사용되는 equalTo: greaterThanOr…: 과 같은 메서드를 연산자로 만들어서 가독성을 높일 수 있는 라이브러리를 만듬

원래 계획했던 스위프트 클린코드 + 클린아키텍처 워크숍 세션을 듣지 못해서 조금 아쉬웠지만, 전체적으로 매우 만족스러운 콘퍼런스였다. 새로운 경험과 지식, 사람들을 만나면서 환기를 할 수 있었고 여러 가지로 자극을 받은 하루였다. iOS 개발자가 정말 많다는 사실에 놀랐고 다른 개발자들도 비슷한 고민을 한다는 사실에 재미있었고 발표하는 분들과 내용을 보면 아직도 배워야 할 게, 부족한 게 많다는 사실에 흥미로웠다!

발표자료와 동영상이 공개되면 다시 복기하면서 앞으로 해야 할 일을 정리해야 할 것 같다. 개인적으로는 RxSwift to Combine (feat. SwiftUI) / MVC, MVVM, ReactorKit, Viper를 거쳐 RIB 정착기 / Xcode Previews - IB 없이 개발하기 세션이 가장 도움이 많이 되었다.

콘퍼런스를 준비해주신 스탭분들과 좋은 발표를 해주신 스피커 여러분 모두에게 다시 한번 감사합니다~ 👏

Written by

one of computer programmers. write is code, think ux design. interested in #SNS #UX #Mobile #Startup

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store