[센디] 이사모아 앱 업데이트

주식회사 센디로 이직하고 처음으로 처리한 작업, 이사모아 앱 리뉴얼…

현재 우리회사는 센디를 주력으로 사업을 진행하고 있으나, 회사 온보딩겸 기존에 있던 제품인 이사모아를 리뉴얼 하는 업무를 받았음

기존 버전

문제점

  1. 디자인 리소스가 없음
  2. 아키텍처가 명확하지 않음
  3. API 문서가 없음

내가 입사하기 전까지 명확한 iOS 개발자가 없었던거 같음. 안드로이드 버전을 기준으로 마이그레이션 하면서 작성한 느낌.

안드로이드 개발자 또는 학생 인턴이 기능 구현을 해서 뷰 마다 코드가 다름 어떤 부분은 안드로이드 코드를 그대로 복사한 듯한 느낌이 들기도 하고 어떤부분은 미묘한 VIP를 따르는 것 같으면서도 어딘가는 MVC이다.

다행히 Objective-C와 Swift의 혼종은 아닌듯 하나 메인터넌스가 매우 오랫동안되지 않아 엄청 구버전의 라이브러리들을 사용하고 있는 듯했다.

앱 리뉴얼

입사 후 몇 주간은 기존 코드 리딩 및 부분 개선을 진행했고 이후에 iOS 디자인 리소스가 나와서 넘겨 받았다.

디자인을 넘겨 받고 기존 프로젝트의 코드 리딩을 한 결과 점진적 기능 개선은 매우 매우 험난한 길을 갈 것 같아서 그냥 새로 만들기로 했다.

개선사항

  1. MVVM 아키텍처로 변경
  2. GitHub Action을 사용하여 CI / CD 환경 구성
  3. 유닛테스트 작성
  4. 레거시 라이브러리 제거

아키텍처 변경은 80% 정도 진행했으며 추후 개선점이 보여서 리팩토링이 필요한 상황이다.

CI / CD 환경구성은 기존에도 잘 쓰고 있어서 간단하게 설정 할 수 있었음.

테스트 코드 작성은 적극적으로 진행하지 않아서 현재 커버리지가 한 자릿수이다. 개선이 필요함…

레거시 라이브러리는 성공적으로 모두 제거했다.

일정이 부족하여 몇 가지 기능은 빠진채로 출시하게 되었는데 센디 iOS 버전이 마무리 되는대로 작업할 예정이다.

이사할 때 한 번쯤은 써보시길 바란다. -끝-

https://apps.apple.com/us/app/%EC%9D%B4%EC%82%AC%EB%AA%A8%EC%95%84-%EC%9D%B4%EC%82%AC%EB%B9%84%EC%9A%A9%EA%B3%84%EC%82%B0%EA%B9%8C%EC%A7%80-1%EB%B6%84/id1136075052

Xcode Project 버전 관리

Xcode 프로젝트는 일반적으로 사용자들이 인식하는 버전과 빌드 두가지가 존재한다. 여기서 버전은 유의적 버전 표기법으로 표현 가능하고 빌드는 단순하게 증가하는 정수 값이다.

테스트 플라이트에서 인식하는 버전은 유의적 버전과 빌드는 상호 의존적이다.

0.1.0 버전의 1번 빌드와 0.2.0 버전의 1번 빌드는 독립적인 바이너리로 판단한다.

Xcode는 타겟의 버전을 Info.plist 또는 Build Settings에 기록하는데 버전을 변경할 때마다 개발자가 직접 관리하면 타겟 별로 버전 관리를 잊을 수 있으므로 버전을 관리하는 도구를 애플에서 제공하고 있다.

터미널에서 버전을 지정할 프로젝트의 경로로 이동한다음 해당 프로젝트의 모든 타겟의 빌드 번호를 변경하기 위해서는 다음 명령어를 실행한다.

$ agvtool new-version -all 1

모든 타겟의 버전을 변경하기 위해서는 다음 명령어를 실행하면된다.

$ agvtool new-marketing-version 0.1.0

업데이트 마다 버전 변경을 개발자가 직접하지 않고 도구를 사용하여 버전 기록이 유실되는 실수를 하지 않는 버릇을 들이는게 중요하다.

CI / CD 환경에서 빌드 번호 자동 증가와 같은 자동화를 할 때 사용하면 좋은 도구이기도 하다.

에 발행했습니다
iOS, macOS(으)로 분류되었습니다 , , 에 태그되었습니다

CocoaPods 설치하기

Cocoa 또는 Cocoa Touch 환경에서 개발을 할 때 외부 라이브러리 사용을 쉽게 도와주는 패키지 관리 도구는 여러가지가 있지만 이 글을 작성하는 기준으로 가장 많이 사용하는 도구는 아마도 CocoaPods 일 것이다.

내가 CocoaPods을 사용하는 방법을 정리한 글이다.

CocoaPods은 Ruby를 사용하여 개발된 의존성 관리 도구 이다. 따라서 CocoaPods을 사용하기 위해서는 Ruby가 필요한데 macOS에 기본적으로 내장되었는 Ruby를 사용하여도 충분하다.

하지만 나의 경우 macOS 버전 별로 내장되어 있는 Ruby 버전이 다르고 RubyGems를 사용하여 gem을 설치할 때에도 내장된 Ruby의 경우 sudo 권한을 요구할 수도 있다.

이러한 단점을 보완하기 위해 나는 시스템 별로 rbenv를 사용하여 Ruby 환경을 관리하고, Bundler를 사용하여 설치되는 RubyGems를 관리하고 있다. CocoaPods을 제외하더라도 Ruby로 작성된 도구를 사용할 일이 아주 가끔있는데 로컬 머신과 빌드 머신과의 Ruby 환경의 차이를 최소화 하기 위해 rbenv를 사용하는 것을 권장한다. 귀찮으면 안써도 된다.

rbenv 설치

rbenv를 설치하는 방법은 Homebrew를 사용하면 매우 쉽다.

$ brew install rbenv

rbenv를 설치한 다음 적당히 설정을 마치고(여기서는 생략) Ruby 2.6.6 버전을 설치한다. 작성일 기준으로 Ruby의 안정 버전은 3.0.0이지만 경고 없이 실행되는 CocoaPods의 버전이 2.6.6인 것 같아서 나는 2.6.6버전의 Ruby를 사용하고 있다.

$ rbenv install 2.6.6

다음으로 rbenv 명령어 또는 .ruby-version 파일을 사용하여 우리가 사용할 프로젝트의 Ruby 버전을 일치시킨다.

Bundler 설치

이제 rbenv를 사용하여 우리가 사용할 Ruby 버전을 설치했으면 Bundler를 사용하여 RubyGems의 버전을 관리하면 된다.

우리가 사용할 CocoaPods은 Ruby로 개발된 일종의 RubyGems이다. rbenv를 사용하여 우리가 사용할 Ruby 환경을 구성했으므로 이제 Bundler를 사용하여 RubyGems를 관리하면 된다. Bundler의 최신 버전 설치는 터미널에서 다음과 같이 진행하면 된다.

$ gem install bundler

이제 프로젝트 별로 Bundler를 사용하여 RubyGems를 관리하려면 우리가 작성한 프로젝트 경로로 이동하고 다음 명령어를 실행한다.

$ bundle init

이제 해당 경로에 Gemfile이 추가되었을 것이다. Gemfile에 우리가 사용할 RubyGems와 버전을 명시하면 되는데 우리가 사용할 RubyGems는 CocoaPods 최신 버전이므로 Gemfile에 다음 내용을 추가하고 저장한다.

gem "cocoapods"

이제 우리 프로젝트에 의존적인 패키지를 정의했으므로 다음 명령어로 해당 경로에 RubyGems를 설치하면 된다.

$ bundle install

CocoaPods 사용

일반적으로 로컬에 설치하는 CocoaPods RubyGems와 달리 Bundler를 사용하여 설치한 CocoaPods을 실행할 때는 다음과 같다.

$ bundle exec pod <명령어>

이제 시스템과 독림적으로 운용가능한 CocoaPods 환경이 구성되었다.