Let’Swift 2019 후기

A Change of Season

chanju Jeon
Nov 12 · 9 min read

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

Seamless User eXperience

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

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

Modern UI

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가 깔끔해짐
  • 프로세스 단위의 아키텍처가 아님

RIBs

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

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

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

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

의존성 주입 DI

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

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

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

어떻게 기존 프로젝트에 RIBs을 적용할까?

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

요약

장점:

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

단점:

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

Swift in SwiftUI

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

SE-0255

  • 단일 표현식일 때만 함수에서 리턴문 생략
  • SwiftUI에서 (some) view에도 적용

SE-0244

  • SwiftUI는 하나의 뷰가 여러 뷰를 감싸는 형태로 구현
  • 불투명 타입? some 으로 대체
  • 제너릭의 방향을 반대로 이해, 리버스 제너릭
  • 실체 타입만 반환 가능

SE-0261

  • 단일 개체에 대해 상태의 변화에 상관없이 식별을 위한 프로토콜 추가
  • Hashable을 준수하는 id값만 가짐

SE-0258

  • @State, @Binding, … (SwiftUI에서 쓰이는 것들)
  • Wrapper Type 구현
  • 프로퍼티에 대한 접근 패턴을 정의

Xcode Previews - IB 없이 개발하기

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

Xcode Previews

Mastering Xcode Previews 참고

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

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

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

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

Normal Build와 별도로 Preview Build가 생성

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

Xcode Previews in UIKit

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

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

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

Storyboard, XIB의 문제점

  • 읽거나 수정할 수 없는 XML
  • 졸라 큰 파일, 툴 버전도 포함…
  • 컨플릿 나면… 🤯
  • 점점 커지는 스토리보드;
  • IB와 Swift는 서로 모름,
  • 컬러 에셋을 적용할 때 버그가 있음

UI Programming using Xcode Previews

  • 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 없이 개발하기 세션이 가장 도움이 많이 되었다.

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

chanju Jeon

Written by

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

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade