입소
- 삼성 청년 SW 아카데미에서 Back-End(Spring boot)만 했었는데, 막상 서버만 만들다보니 내가 만든 서버를 활용한 서비스를 만들기 위해 클라이언트를 준비하다가 네이버 부스트캠프라는 곳에서 iOS를 가르쳐 준다고 하여 신청했고 합격했다.
챌린지 과정
- Swift를 활용하여 각종 CS 문제를 활용하는 기간이였다.
- 한달 동안 새로운 언어를 배우는 과정이라 신선하고 재미있는 경험이였다.
멤버십 과정
- 본격적으로 Application을 만드는 과정으로 진입했다.
공부할 때 stanford university에서 iOS 강의하는 것을 많이 들었던 것 같다.
MVC, MVVM, Viper등 iOS에서 쓰이는 다양한 아키텍처가 쓰이는 것들에 대해 공부하려고 했으나 어차피 쓰이는 아키텍처는 사람 혹은 회사가 쓰는 것에 맞춰서 쓰면 되겠다는 생각에 가장 기본이라는 MVC패턴을 공부했다.
패턴에 대해 공부 후, AutoLayout에 대해 공부했다. 과거 스티브잡스 때는 전부 동일한 화면이라 문제가 없었지만 현재는 다양한 디바이스 디스플에이 기기에 대응하기 위해 만들어졌고 나는 주로 StoryBoard에서 작업을 하였다.
첫 번째 프로젝트(Issue Tracker)
iOS와 Web팀과의 이루어 진행하는 프로젝트여서 서로의 일정 관리가 가장 큰 이슈였고, 처음으로 다른 iOS 팀원과 협업했던 프로젝트였다.
가장 크게 기억남는 것은 Alamofire, MarkdownView 같은 외부 라이브러리를 사용했던 경험이였다.
특히 Alamofire는 따로 포스팅해 두었지만 해당 라이브러리를 사용하니 코드가 엄청 짧아지는 것과 네트워크 통신을 할 때 조금 더 쉽게 할 수 있다는 장점이 있지만 개발자의 지원이 끊길 경우 사용을 못할 수 있다는 단점을 파악했다.
두 번째 프로젝트(네이버 Map SDK를 활용한 POI Clustering Interaction Dev)
해당 프로젝트를 5주간 하기도 했고 초등학생 iOS 애플리케이션 개발자에서 중학생 iOS 애플리케이션 개발자로 성장했다고 할 만큼 많은 발전이 있었다.
-
GCD
- 이번 프로젝트의 시작과 끝은 GCD 즉, 동시성 프로그래밍을 공부한 것에 있다고 생각한다.
- 병렬, 병행 프로그래밍을 계속 헷갈려했고 처음 공부할 때는 따로 설정하지 않으면 멀티쓰레드만 지원하는 줄 알았는데 프로젝트가 거의 끝날 때가 되어서야 멀티프로세싱도 자동으로 처리한다고 확인했다.
- 또한 동시 자원 접근 문제를 직접 느껴보고 해결했던 것이 큰 소득이였다.
-
비동기 프로그래밍
- GCD로 동시성 프로그래밍을 공부하면서 비동기 프로그래밍도 같이 공부했다.
- 특히 비동기의 경우 데이터가 언제 처리될지 모르는 점과 처리된 데이터가 현재 필요 없을 경우 어떻게 해결해야 할 지 고민을 했었다.
- 해당 문제는 URLSessionTask를 사용할 때 생겼던 문제로 해당 task를 인스턴스로 들고 있고 작업이 필요가 없을 경우 취소해주는 방식으로 해결했다.
- 또한 iOS 관점에서 GCD와 연계해 UI관련 작업은 main Thread에서 처리하고 그 외의 작업은 가급적 main이 아닌 다른 Thread에서 처리해야 사용자에게 앱과의 Interaction을 끊임없이 제공할 수 있다는 것을 배웠다.
-
Core Animation
- 사실 이번 프로젝트에서 내가 CoreAnimation을 다룬 것은 극히 소수이다.
- 나는 마커가 나타낼 때의 애니메이션, 마커를 터치 할 때 애니메이션을 담당했다.
두 번째 프로젝트에서 코어애니메이션의 경우 개념적으로 이해하고, 단순한 애니메이션만 제작했다. CALayer 위에서 관리, 조작을 하는데 이 부분에서 잔상이 생기는 이슈가 생겼고 이는 차후에 설명하겠다.
아무튼 Core Animation을 사용하면 드로잉 작업을 그래픽 하드웨어에 전달하여 앱의 속도를 저하시키지 않고 애니메이션을 만들 수 있다는 장점이 있다고 이해를 했다.
-
잔상 이슈
-
CoreAnimation이 동작할 때 맵을 움직일 경우 마커들이 맵에 고정되는 것이 아닌 화면에 고정되었다.
-
맵이 움직일 때 마커를 고정시키기 위해 생각해 본 2가지의 방법
-
CALayer의 레이어 위치를 변화
func mapView(_ mapView: NMFMapView, cameraIsChangingByReason reason: Int) 함수에서 실행-
마커를 선택할 때 카메라 위치를 저장하고 움직일 때마다 현재 카메라 위치를 가져와 위치 보정
naverMapView.selectedAnimationLayer.position.x = naverMapView.mapView.layer.position.x - (mapView.projection.point(from: mapView.cameraPosition.target).x - mapView.projection.point(from: naverMapView.selectedAnimationStartCameraPosition).x) naverMapView.selectedAnimationLayer.position.y = naverMapView.mapView.layer.position.y - (mapView.projection.point(from: mapView.cameraPosition.target).y - mapView.projection.point(from: naverMapView.selectedAnimationStartCameraPosition).y)
-
-
CALayer에 올라가는 marker의 레이어 위치를 변화
func mapView(_ mapView: NMFMapView, cameraIsChangingByReason reason: Int) 함수에서 실행flashAnimator.markerLayer.layer.position = mapView.projection.point(from: NMGLatLng(lat: naverMapView.selectedLeapMarker!.position.lat, lng: naverMapView.selectedLeapMarker!.position.lng))
- 하지만 결국 NMFMapViewCameraDelegate의 이벤트 발생과 사용자의 속도가 달라 지속적으로 잔상이 생겼다.
- 따라서 이 부분은 CoreAnimaion으로 처리한 것이 아닌 Timer로 마커의 투명도를 바꾸는 방벙으로 해결했다.
- 하지만 결국 NMFMapViewCameraDelegate의 이벤트 발생과 사용자의 속도가 달라 지속적으로 잔상이 생겼다.
-
-
-
군집화 알고리즘
-
해당 부분은 iOS 관련 내용이 아니라 맨 마지막에 서술했다.
-
보통 우리가 사용하는 군집화 알고리즘은 데이터의 특성을 고려해 클러스터를 정의하고 클러스터를 대표할 수 있는 대표점을 찾는 방식이다.
-
하지만 단순히 마커들을 군집화 하는데 우리에게 알려진 K means, DBScan 등을 사용하는 것은 너무 오버스펙이라고 할 수 있고, 연산량 또한 증가한다고 생각해서 거리를 기준으로 클러스터링 하는 방식의 알고리즘을 만들었다.(프로젝트 내에서 Kim's Algorithm라 불리고 있다.)
-
또한 기기 별로 동일하게 군집되게 하기 위해 디바이스 디스플레이의 크기를 12로 나누어 해당 거리에 있는 것들을 묶는 방식으로 연산을 최소화 하였다.
let scaled = sqrt(pow(bounds.northEastLat - bounds.southWestLat, 2) + pow(bounds.northEastLng - bounds.southWestLng, 2)) / 12
-
FlowChart
-
결과
- 팀에서 사용한 K means 알고리즘과 Kim's 알고리즘의 실행 속도를 비교한 사진이다.
-
결론
- 결론적으로 부스트캠프에서 기본적인 iOS 애플리케이션 개발을 배웠고, iOS에 관련해 제로 베이스였던 내가 부스트캠프를 수료한 후 한 명의 iOS Developer가 됐다.
'일상' 카테고리의 다른 글
AWS Certified Developer - Associate 합격 후기 (2023 DVA-C02) (0) | 2023.05.16 |
---|---|
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 완강 (0) | 2022.06.15 |
스프링 핵심 원리 - 기본편 완강 (0) | 2022.06.05 |
AWS Certified Solutions Architect – Associate 합격 (0) | 2022.05.27 |
SSAFY 일상에 대해 알아보자 (Feat. 2기 교육생의 하루) (0) | 2019.10.03 |