UIKit 프로젝트에 SwiftUI 적용 전 고려할 4가지

딜라이트룸 iOS팀에서 swiftui 적용하기까지의 후기

Joon Won Lee
DelightRoom
8 min readJan 12, 2023

--

WWDC 2019 에 SwiftUI 가 처음으로 소개되고, 신난 마음으로 뜯어 보았었다. 보다보니, 실무에서 쓰기에는 아직 이른 감이 있어서(사실 그때 제대로 이해를 못해서,,,) 기다려보기로 결정 했었다.

이후에 SwiftUI 기술의 성숙도가 점점 올라가고, 실제로 실무 프로젝트에서 사용하는 팀들과 이야기할 자리들이 몇번있었다. 들었던 시행착오에 대해서 팀내 멤버들과도 나누면서 내부에서의 인사이트를 쌓아갔다.

다양한 인사이트를 통해서, 선언형 UI 개발로 갖는 유지보수의 용이함 뿐만 아니라, 개발속도도 더 빨리질것으로 기대가 되었다. 그래서 본격적으로 프로젝트에 적용하기 위한 고민은 2022년 1분기부터였다.

딜라이트룸 iOS 프로젝트에 실제로 적용하기까지 겪었던 시행착오를 정리하다보니,

크게 4가지 고려사항이 있었다.

  • 공동 목표로 만들기
  • 호환성 고려하기
  • 기존 UI 마이그레이션
  • 학습 비용 (Learning Curve)
freepik.com

#1 공동 목표로 만들기

SwiftUI 쓰자! 하더라도, 새로운 시도에 대한 열정이 멤버들마다 다를수가 있다.

그러다 보면, 어떤 멤버는 열심히 SwiftUI 를 적극적으로 적용하는 반면, 그렇지 않은 멤버들도 생길수 있다.

SwiftUI 사용에 대한 열정의 온도를 비슷하게 맞추기 위해서, 팀내 공동 목표로 설정해보는 방법이 있다.

실제로 iOS 팀에서는 분기 목표에 SwiftUI를 포함해서 진행했었다.

딜라이트룸은 분기별로 OKR 을 이용해서 목표를 설정하고 있기 때문에, 보다 정량적이고 명확한 목표를 설정할수가 있었다.

목표를 달성해 나가는 과정에서 팀내에서 정했던 원칙은 아래와 같다

  • 신규 UI는 무조건 SwiftUI 적용
  • 기존 UI는 iOS 팀내에 논의를 통해서 결정

실제로, 공동의 목표를 구체적으로 설정하고 원칙을 정해놓다 보니 가시적인 성과를 낼수가 있었다.

freepik.com

#2 호환성 고려하기

SwiftUI 는 iOS13 이상에서 사용 가능하다. 그래서 min sdk 타겟을 13 이상 올리고 나면, 공격적으로 사용 할수 있겠다고 보았었다. 그런데, SwiftUI를 실제 적용해본 팀들과의 기술교류와 내부 논의를 통해서 iOS14 이상으로 올려야, 보다 효과적으로 실무에서 사용할수 있겠다고 판단했다.

특히, 일부 SwiftUI 컴퍼넌트의 경우, iOS 13에서 사용 못하는 것들이 있었고, iOS 14에서도 세부 버젼별로도 사용 가능하지 않은 컴퍼넌트가 있었다.

(예: LazyVGrid Component 의 경우, iOS14 이상에서 사용가능)

(당시 돌이켜 보면, iOS 14.7 이상 되면, 무난하게 제약없이 쓸수 있다고 생각 했었다. 근데, WWDC 2022 iOS16 들어서 새로운 컴퍼넌트 많이 소개되고, 또 그나마 쓰던 녀석들은 deprecated되고, 하아… )

기술적 호환성 말고도, 사용자 호환에 대해서도 판단이 필요했다.

딜라이트룸은 사용자 중심적인 제품을 만들고 있기 때문에, min sdk 타겟을 14로 올리게 되었을때 이후 업데이트를 받지 못하는 사용자가 얼마나 되는지 고려해야 했다.

비즈니스적으로 iOS13 이하 사용자가 0.5% 이하가 되었을때, min sdk 를 14로 올리기로 결정했다.

iOS 사용자들은 Android 사용자 보다 상대적으로 OS 업데이트를 빨리 하시지만, 그렇지 않은 사용자들도 글로벌로 상당히 있어서 기다림의 시간이 필요했다. 기다리면서, SwiftUI 를 맞이하기 위한 기술적 전환도 미리 준비했었다. 예를 들면, 비동기 처리에 있어서 Rx 걷어내고 Combine 과 Swift async/await 사용한다던지, Apple 네이티브 프레임웍을 더 사용함으로써 외부 의존성을 줄이고자 노력했었다.

#3 기존 UI 마이그레이션

단기간에 기존 UI를 모두 SwiftUI로 마이그레이션 할수 없기 때문에, 작업간 정해진 규칙이 있으면 보다 명확할 것이라고 생각했었다. 하지만 진행간에 예외 케이스가 발생하고 이럴때, 논의를 통해서 결정해나갔다.

논의 할때 나눈 주요 고려사항은 아래와 같다.

  • 작업자 선호도가 있는가?
  • 임팩트가 높은 영역인가?
  • 난이도가 높은가?

작업자 선호도

작업 내용에 따라서, 작업자가 SwiftUI 를 적용하고 싶은지 충분히 물어보고 자율에 따라 결정하게 두었다.

마냥, SwiftUI 를 쓰라고 강요 할수 없었다. 왜냐하면, 해당 스프린트에 달성해야하는 비즈니스 골도 있고, 기술성숙도가 덜 올라온 상태에서는 작업이 부담이 될수 있기 때문이다.

임팩트가 높은 영역여부

작업간 발생한 버그로 인한 비즈니스 임팩트를 최소화가 목표이고,

임팩트가 높은 영역일수록 작게 점진적으로 개선하고자 했었다.

작업의 난이도

기술뿐만 아니라 기획적으로도 난이도가 있는 구현에 대해서는 버그를 최소화 하기 위해서,

점진적으로 영역을 나누어서 개선을 시도 했었다.

결국, 위의 3가지 고려사항은 작업자가 자신감있게 기술적 성숙도를 높이고, 실수를 하더라도 비즈니스 임팩트를 적게 받기 위한 원칙이였다.

또한 모든 UIKit 이 SwiftUI Component 에 1:1 매칭이 되는 것이 아니다.

따라서, UIKit 과 혼용해서 사용해야 할때도 있었다. 구체적인 예로는 UICollectionView 인데, 모양을 비슷하게 구현해주기 위해서 SwiftUI 에서는 1) ScrollView + V/HStack, 2) List, 3) ScrollView + LazyVGrid 와 같은 방법이 존재한다. 하지만, UICollectionView 가 해주는 그 많던 기능들을 소화하려면 추가적인 구현도 많이 들어가야 하는 부분이 있다. (기능적인 부분 외에도, 성능적으로도 UICollectionView 랑 비슷하게 하려면 더 많은 커스터마이징이 필요할것으로 생각함)

WWDC 2022: Use SwiftUI with UIKit 에서도 UICollectionView를 SwiftUI Component 로 직접대체한다기보다, UICollectionView 와 함께 잘쓸수 있는 방법에 대해서 소개해주고 있다.

freepik.com

#4 학습 비용 (Learning Curve)

SwiftUI는 기존 UIKit 작업과는 개념이 많이 달라졌기 때문에, 팀내에 학습이 필요했었다.

다행히, 팀내에 SwiftUI 를 개인 프로젝트에 적용해서 사용하고 있는 사람들이 있어서, 작업 적용간에 알고 있는 노하우를 자유롭게 주고 받을수가 있었던 것은 아주 감사할 일이었다.

그래도, 팀내에 기본적인 SwiftUI 의 최소 지식의 레벨을 올려야 했기 때문에, 단체학습하는 시간을 가졌었다. iOS 팀은 분기마다 워크샵을 하는데, 이때 4시간을 확보해서 애플에서 제공하는 SwiftUI Tutorial 을 같이 학습했었다. (애플이 튜터리얼도 기깔 나게 잘 만들어 놓았다. 개념 + 실습 + 퀴즈 형식으로 아주 커리큘럼이 좋다)

SwiftUI Tutorial 은 4시간 25분 코스로 크게 4개 챕터가 있다.

4시간내에 챕터 4개 모두 완료하기도 어렵고, 마지막 챕터는 당장 학습하지 않아도 될것 같아서 스킵했었다. 대신 진행하면서 궁금한 포인트를 시간을 두고 팀내 멤버들과 논의를 하면서 학습내용을 다졌다.

튜토리얼에서 킬포가 있다면, 퀴즈가 참 좋았다. 실습을 하다보면, 개념을 이해 못한 상태에서 따라 치기만 할때가 있는데, 퀴즈로 바로 잡기 좋았다. 팀내에서는 이후에 면접 과제 문제로도 좋겠다는 논의를 했었다.

알맞은 아키텍쳐를 찾기

기존에 UIKit 사용할때는 내부적으로 Clean-Architecture MVVM 을 가져가고 있었다. SwiftUI 를 사용하다보니, 기존 사용하던 아키텍쳐를 그대로 적용하는 것에 의문을 갖게 되었다. 그래서 현재는 TCA 를 적용을 시도하고 있는 중이다.

TCA 알아보기

결론

기존 프로젝트에 SwiftUI 적용할때는 위에 4가지를 고려해서 적용해보기

  • 공동 목표로 만들기
  • 호환성 고려하기
  • 기존 UI 마이그레이션
  • 학습 비용 (Learning Curve)

아직 망설여지거나, 어떻게 시작할지 모르겠을때 저희의 시행착오를 참고하셔서

더 나은방법으로 적용하시길 기대합니다. 🔥

⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다 🙌
딜라이트룸의 다양한 채널들을 팔로우하고 빠르게 소식을 받아보세요!

--

--