NC2를 진행하기에 앞서 애플 생태계를 알아가는 과정이 매우 흥미로웠다. 200명이 50개의 Apple에서 제공하는 프레임워크와 기술들을 알아보았고 나누는 시간이 있었는데, 이렇게나 다양한 기술을 제공하고 있다는 것에 놀랐고 개발의 범위가 엄청나게 다양할 수 있다는 것을 알게 되었다. 그리고 생각보다 UIKit기반으로 만들어진 기술들이 많다보니 UIKit에 대한 공부 없이는 더 발전할 수 없을 것 같다고 생각하게 되었다. UIKit을 꼭 하자!보다는 해당 프레임워크가 어떻게 동작하는지, 어떤 특성이 있는지를 공부해보면 기술을 응용하는데 좋을 것 같다고 생각했다.
내가 하고싶었던 1,2순위 기술은 아니였지만 러너들이 작성해준 기술 설명을 읽다가 나름 흥미로워보여 선택한 3순위 RoomPlan이 배정되었다. RoomPlan은 AR, ML 등을 기반으로 공간 및 배치된 물체를 스캔하고 이를 3D 모델링으로 보여주는 기술이다. 이와 더불어 각 물체의 크기를 확인할 수 있지만 더 이상의 기능이 없다. 따라서 공간에 3D 물체를 놓아보거나, 스캔된 공간 및 물체에 실제 데이터를 입혀주는 과정은 ARKit, SceneKit, SpriteKit 등을 사용해주어야 한다. 하지만 RoomPlan 프레임워크 자체에서 제공하는 내용들을 이해하고, 이를 코드화하는 것이 우선적이여야 한다고 생각해서 RoomPlan 기능만 사용한 테스트 앱을 만들어보고자 하였다. RoomPlan의 경우 관련 레퍼런스는 없는 것과 마찬가지이다. 오픈소스도, 블로그도 애플에서 제공하는 Sample코드에서 활용을 한 코드는 2~3개, 그 중에서도 RoomPlan만 사용해서 기능을 구현한 것은 하나도 없었다. 그래서 우선은 WWDC영상, 애플문서, 모든 오픈소스는 다 살펴본 것 같다. 우선 UIKit기반인 프레임워크를 SwiftUI로 변환하는 코드를 메인으로 살펴보았고, 공식문서를 꼼꼼하게 읽고 아이패드에 각 기능들의 구조가 어떻게 설정되어 있는지, 내가 그 중에서 어떤 것을 활용할 수 있는지를 찾아보면서 기술 구현이 될지를 꼼꼼하게 찾아보고 기록했다.
RoomPlan을 하는 오후팀 3팀중 모두가 기술의 구현가능성에 대해 고민을 했던 부분이 Scan단계가 끝나면서 자동으로 생성해주는 CapturedRoom 데이터를 저장해놓고, Scan과 별개로 원하는 때에 실행을 해주고 싶다는 것이였다. 공식문서에서 따로 Input을 받아서 CapturedRoom 데이터를 3D모델링로 생성해주고 뷰로 리턴해주는 기능은 없었다. 멘토를 통해서 작년에 AR관련 스터디에서 RoomPlan관련 프로젝트를 진행했었는데 거기서도 마찬가지로 내부적으로 데이터를 3D로 보여주지는 못했고, Export기능을 사용해서 FileSystem에 .usdz파일 형식으로 저장을 하고, 해당 내용을 SceneKit을 통해서 .usdz 파일을 다시 View로 생성해주는 기능을 사용했었다는 것을 듣게 되었다. 하지만! 분명히 내부적으로 처리되는 동작에서 CapturedRoom 데이터를 View로 바꿔주고 있기 때문에, 앞서 실행되어야 하는 Scan을 사용하지 않고도 자동으로 실행되는 3D 모델링을 생성해주는 부분에 접근해서 사용할 수 있을 것 같다는 생각을 하면서도 정말 안되는 것에 도전하는 것일지 고민을 많이 했다. 그래서 다시 한번 공식문서를 꼼꼼하게 읽고 그런 작업이 진행되는 흐름을 그려보았고 내가 생각했을 때 구현이 가능할 것 같은 유일한 방법이였던 RoomCaptureView하위에 delegate인 roomCaptureViewDelegate의 captureview(data:)에 업데이트된 데이터를 넣은 뒤 View로 반환하는 테스트를 진행해 보고 안된다면 더 이상은 아이디어가 생각나지 않았기에 체념을 해야했다.
현재 사용하는 프레임워크가 제공하는 기술에 따라 UIKit의 UIView로 반환되는 것을 SwiftUI의 view로 로 바꿔주기 위해서 UIViewRepresentable을 사용하고 있었다. 따라서 Roomplan 관련 기능을 처리하는 Class를 @StateOvject로 변화를 관찰해주고, 변화가 있으면 자동으로 실행되는 UupdateUIView()의 코드에서 captureview(data:)에 업데이트된 데이터를 넣은 뒤 View로 반환해주도록 수정을 하고 테스트를 해보았다. 어머어머!!! 생각한 흐름대로 실행이 되었고 프로젝트의 메인 기능 2개를 무사히 구현할 수 있었다. 기술을 구현했다고 생각한 것은 착각이였다.... 마지막으로 스캔된 결과에 해당되는 3D 평면도만 보여줄 수 있고, 스캔을 진행하지 않고 임의로 내가 원하는 원시데이터 혹은 3D 데이터를 저장했다가 3D 평면도로 보여줄 수는 없었다. 여러가지 가능성을 모두 테스트해보았고, 뷰에 다른 데이터들은 정확하게 넘어가는 것을 확인하면서 불가능한 기술인 것 같다고 짐작했다. 이런 상황을 멘토에게 문의하였고, Apple DR의 연락처를 받게 되었다.
문의 결과 USDZ파일을 Export 하는 방법을 제안받았고, 결론적으로 내부적으로 3D 평면도를 생성해주는 기술은 구현할 수 없다는 것을 체념할 수 밖에 없었다. 하지만 내가 할 수 있는 최선을 다했기 때문에 문의할 수 있는 기회가 주어졌다고 생각한다. 또한 내가 원하는 기술을 원하는 방식으로 구현할 수 없을 뿐이지 다른 방법은 존재하기 때문에 해당 방식으로 디벨롭을 진행해 봐야겠다. 정말 짧은 기간이였지만 결과적으로보다 과정적으로 많은 성장을 이뤘다고 생각한다. 단순히 구현하는 것에 집중했다면 이미 참고 코드를 보고 구현했을 지도 모른다. 하지만 왜 안되는 것인지, 정말 안되는 것인지를 모르고 진행했다면 왜 그렇게 하지 않았나요?라는 질문에 답변할 수 없었을 것이다. 아직 우리의 프로젝트는 완성되지 않았기 때문에 제안받은 기술과, 사용하는김에 추가적으로 SeneKit과 관련된 새로운 기술들을 추가해 볼 예정이다. 또한 다른 페어들의 프로젝트 결과를 보는데 한주도 안되는 짧은 개발기간동안 다들 너무나 멋진 아이디어와 결과물을 만들어 낸 것을 보면서 스스로 더 분발해야겠구나 생각했다. 기존에는 일반적인 SNS나 서비스를 제공하는 앱을 만들어왔다면, 애플만의 기술을 활용하여 새로운 가치를 만드는 개발자가 되고 싶다는 생각이 들었다. 점점 하고 싶은 것만, 해보고 싶은 것만 많아지는 것 같아서 더 열심히 시간 활용을 해봐야겠다. 모두 고생 많았어욥 :)
'2024 Apple Developer Academy 3기' 카테고리의 다른 글
[MC3] 내 기준 가장 이상적인 팀플레이 (0) | 2024.07.10 |
---|---|
[Bridge3] 나의 1순위 내재적 동기를 찾아서 (0) | 2024.06.24 |
[MC2] 유저 파악하기 실패의 기록 (0) | 2024.05.08 |
[Bridge2] 조금 늦은 정리와 계획세우기 (2) | 2024.05.01 |
[Nano Challenge 01] 프로젝트 꼼꼼하게 진행하기 (0) | 2024.04.15 |