본문 바로가기
UIKit Project

[LilsMusic] MusicKit을 활용한 음악 앱 출시 회고 (Post Mortem)

by thekoon 2024. 3. 26.

 

만들 수 있을까 걱정하던 음악 앱을 무사히 만들고 앱 심사에 제출했습니다.

프로젝트 기간은 약 3주였고, 제가 중간에 건강이슈가 있어서 실질적인 프로젝트 기간은 2주 조금 넘었던 것 같습니다.

 

프로젝트를 진행하기 앞서 했던 기획은 

기본적인 플레이 기능이 가능한 음악플레이어 + 

인스타그램 릴스처럼 최신 뮤직비디오를 넘기면서 감상하고, 마음에 드는 노래를 바로 내 플레이리스트에 저장하도록 하자!였습니다.

제가 예전부터 음악과 미디어 앱에 관심이 많아서 언젠가 음악, 영상을 재생하는 앱을 만들어보고싶다고 막연하게 생각했었는데 

이번 기회에 둘 다 만들어 볼 수 있어서 좋았습니다.

 

제가 이번 프로젝트에 사용한 기술스택은 UIKit + MVVM-C + RxSwift + MusicKit입니다.

MusicKit같은 경우 비교적 최신 API라 SwiftUI에 최적화된 API라서 예제 앱과 다른 레퍼런스들이 모두 SwiftUI 기반이었고, 

UIKit에 MusicKit을 활용한 레퍼런스는 찾지 못해 맨땅에 처음부터 구현을 하다보니 기능 구현에 많은 시간을 들였습니다.

 

 

첫 5일은 프로젝트의 구조를 잡고, MusicKit에 대해 공부하는데 시간을 사용했습니다.

MusicKit을 찾아보고, 노션에 필요한 정보들을 정리하며 학습했습니다.

 

 

공식문서를 학습하면서 한 가지 걱정이 되던 부분이 MusicKit이 Swift Concurrency기반 API라는 것이었습니다.

이번 프로젝트에 RxSwift를 사용할 예정이었는데 RxSwift와 SwiftConcurrency를 함께 사용해본적이 없어서 어떻게 잘 구현할지 고민이 되었습니다.

 

공식문서와 예시 앱을 보면서 필요한 요소들을 정리하고, 제 앱 안에서 사용할 함수들을 만들어갔습니다.

미니플레이어도 만들어야 하고 로딩화면, 인증화면 등 화면 이동이 생각보다 복잡해져서

처음에 MVVM으로 기반을 만들다가 Coordinator를 추가해 MVVM-C로 기반을 바꿨습니다.

이 선택은 앞으로 앱을 만들면서 정말 좋은 선택이었다 생각합니다.

복잡한 화면전환 로직이 정리되서 편하게 화면전환을 구현할 수 있었습니다.

 

첫 기획했던 뮤직비디오 재생을 위해 MusicKit의 뮤직비디오 관련 API를 찾아보고,

AVFoundation과 AVKit도 학습하면서 대략적인 Test 뮤직비디오화면을  MVC로 구현했습니다.

 

만들다보니 애플뮤직에서는 지원되지만, 아직 API로는 지원되지 않는 기능이 생각보다 많았습니다.

MusicVideo 타입이지만 뮤직비디오를 직접적으로 주지 않고, 애플뮤직 앱으로 연결해준다거나

가사의 유무를 Bool값으로 주지만, 가사를 직접적으로 제공해주지는 않았습니다.

아쉬운대로 현재 지원해주는 범위 안에서 최선을 다해 앱을 만들어보기로 했습니다.

 

 

MusicKit 관련 테스트를 하면서 앱을 만들다보니 하나하나 MVVM으로 구성하기에는 시간이 많이 걸렸고,

빠르고 간단하게 확인하기 위해서 MVC패턴으로 빠르게 테스트하며 앱을 구성하고 있었습니다.

이번 기간에는 기존의 MVC테스트했던 코드들을 MVVM으로 리팩토링하면서 

RxSwift를 활용해 Input, Output 패턴으로 바인딩을 하는 대공사를 시작했습니다.

 

음악플레이어같은 경우에 기본적인 음악재생은 되지만, 곡을 다음곡으로 넘길때 화면이 바뀐다거나,

반복재생, 랜덤재생 등의 설정을 한다거나,

음악의 구간을 다른 곳으로 넘긴다거나 하는 세부 기능을 구현하지는 못한 상황이었습니다.

음악앱을 사용할때는 당연하게 생각하던 것들이 하나 하나 구현하기 까다롭고 신경써야할게 생각보다 많다는 생각이 들었고,

RxSwift로 바인딩을 하면서 Queue의 변경사항들을 옵저빙하고, 화면을 그려줘야겠다고 생각했습니다.

 

 

컨디션이 서서히 안좋아지더니 몸이 많이 아파서 금요일까지 개발을 하지 못했습니다. 

다들 건강 잘 챙기면서 개발하세요!! 토요일부터 회복되서 프로젝트 출시를 위해 기존에 기획했던 기능을 조금 덜어내고,

최소한의 기능을 가진 앱을 만들기로 기획을 변경했습니다.

 

 

MVVM으로 리팩토링도 어느정도 완료했고, 세부적인 디테일한 기능들도 어느정도 정리한 뒤에

앱의 전반적인 디자인을 다듬었습니다.

처음에 기획했던 스토리보드의 대략적인 디자인이었는데요,

예전 아이팟 쓸때 좋아했던 커버플로우를 꼭 넣고 싶었습니다!

이 기획을 기반으로 디자인했는데, 생각보다 앱이 이쁘지가 않아서 

디자인에 재능있는 친구를 밥 한끼 사주고 잠시 마우스를 잡도록 부탁했습니다.ㅎㅎ

그렇게 같이 이야기하면서 디자인을 다듬고, 나온 이 디자인을 바탕으로 다시 앱을 구성했습니다.

앱의 디자인을 다 변경하다보니 시간이 꽤 많이 들 줄 알았는데

생각보다 위치를 변경하고, 크기를 조정하는 시간이 많이 들지는 않았습니다.

 

위 디자인을 적용하고, 다듬으면서 만든 최종 화면입니다.

제가 좋아하던 커버플로우도 넣었고, 다들 디자인이 이쁘다고 칭찬해줘서 기뻤습니다.ㅎㅎ

 

최종적으로 마지막 디테일을 잡는데 시간이 많이 걸렸습니다.

1. 애플뮤직 권한 요청 -> 거절시 설정앱으로 가도록 만들기

2. 애플뮤직을 결제하지 않은 상태라면 재생버튼을 눌렀을때 애플뮤직 결제 유도 화면을 present 하기

3. 뮤직비디오 로딩시점을 파악해 로딩인디케이터를 넣고, 뮤직비디오 재생 최적화

4. 뮤직비디오 구조체에 관련 노래항목이 모두 nil로 나와, 아티스트와 노래제목을 검색하고, 일치하는 항목이 있는 노래를 찾아 플레이리스트에 저장하기

5. 좋아요 저장한 노래의 id를 realm으로 저장했는데, Swift Concurrency의 Task구문 안에서 사용할때 스레드 문제 처리

등등 평소에 경험하지 못한 다양하고 디테일한 처리를 하면서 앱의 완성도를 높여갔습니다!

 

마지막으로 Firebase의 Analytics와 Crashlytics를 추가하고,

주변 애플뮤직을 사용하는 지인들에게 TestFlight를 보내 피드백을 받고, 개선한 뒤

앱스토어 심사에 제출한 상태입니다.좋은 결과가 있으면 좋겠네요ㅎㅎ

 

아쉬운 점

- 중간에 아파서 약 5일간 개발을 하지 못했던 점... ㅠㅠ 건강이 최고입니다!!

- 처음에 기획했던 다양한 플레이리스트 추가는 하지 못했습니다.

- 검색이 현재 개별 곡만 검색되고 앨범이나 아티스트 전체가 검색되지는 않습니다.

- 사용자의 취향을 파악하고, Charts를 통해 그래프로 표현하려했지만 덜어냈고, 애플뮤직의 사용자 추천 플레이리스트로 대체했습니다.

 

긍정적인 점

- 짧은시간 내에 기획한 앱을 만들었다는 점

- MusicKit과 AVFoundation 등 평소에 접하기 힘들었던 기술스택을 도전하고, 구현했다는 점

- RxSwift, MVVMC 등을 사용하면서 해당 기술에 대해 더 고민하고, 이해하며 구현했다는 점

- MusicKit의 Swift Concurrency와 Combine을 UIKit, RxSwift로 구현했다는 점입니다.

 

앞으로도 부족한 기능을 업데이트하고, RxSwift 공부를 하며 새롭게 배운 것들을 적용하며 개선해보겠습니다. 

화이팅화이팅!!!