새로운 앱 프로젝트를 진행한지 일주일이 조금 넘었다. UIKit관련 서적을 다시 보면서 따라가려고하니 뭔가 공부법이 안맞는지 약간의 지루함을 느꼈다. 그래서 방법을 바꾸어 프로젝트를 진행하며 필요한 내용들을 찾아보는 식으로 공부중이다. 앞에 포스팅 중이였던 'iOS 앱의 구조와 코코아 터치 프레임워크'주제도 얼른 마무리 지어야하는데,, 앱 개발에 몰두하느라 계속 미루고 있었다,, 그리고 프로젝트만 진행하면 왜 이렇게 밤낮이 바뀌는지 모르겠닿
쨋든 2가지 아이디어가 있는데 지금 개발중인건 나머지 하나의 아이디어를 만들기 위한 연습?이다.
RxSwift와 지도를 활용하고 싶어서 UIKit과 네이버 지도 프레임워크를 활용하는 프로젝트로 연습중인 셈이다.
OpenAPI를 요청하여 데이터를 불러온 다음, 네이버 지도(Naver Map)에 해당 위치에 마커를 표시하고, 목록 탭에서는 위치들의 정보를 볼 수 있게끔 구현했다. 그리고 리스트에서 하나의 정보를 터치하면 지도에서 해당하는 위치로 뷰가 이동하는 것까지 구현했다.
| 실행 후 '데이터 불러오기' 터치 | 마커 터치 1 | 마커 터치 2 |
|---|---|---|
![]() | ![]() | ![]() |
| 목록 및 '송옥'장소 터치 | '데이터 불러오기' 및 목록 최신화 확인 | 내 위치로 이동(위치 설정을 안해놔서 디폴트 위치로ㅠ) |
|---|---|---|
![]() | ![]() | ![]() |
막상보니 열심히 했는데 뭔가 많이 없는거 같기도 하다ㅠ 내 위치로 이동할 때도 애니메이션을 넣을걸 그랬다.
이건 이슈라고 해야될 지 모르겠다.SPM에 익숙해있다가 처음으로 podfile써봤는데 복잡하지 않아서 좋았다.
podfile설치와 사용법은 검색하면 잘 나와있다. 그 후에 git -lfs를 설치하라는데 나는 이 과정이 생략되었다?
git -lfs가 무엇인가보니 용량이 큰 라이브러리를 받는 경우(100mb이상이였나?) 받아오지 못하고 에러가 발생한다고 한다. 이를 해결해주는 것이 git -lfs (Large File Storage)이다. 그런데 왜 난 생략했는데도 멀쩡히 설치가 잘 되었는지 모르겠다.

어찌저찌 완료하고 이제 네이버 지도를 사용해볼 차례였는데 이번엔 podfile 사용으로 인한 에러가 있었다.
Sandbox~어쩌고저쩌고(캡처를 못했다ㅠ)에 관한 내용이였는데 원래는 없던 에러였다가 Xcode 15 버전부터 Sandbox에 관한 권한 설정을 반드시 해주는 정책(보안상?)을 만들었나보다.
Sandbox는 커널 수준에서 시행되는 접근 제어 기술로 앱을 보호하기 위해 외부의 앱으로부터 쉽게 접근할 수 없도록 하는 것이다. 아이가 외부의 위험에서 보호되도록 Sandbox내에서 노는 것처럼 말이다.
해결책은 프로젝트 Build Settings의 Build Options에서 User Script Sandboxing을 No로 변경해주면 된다.
네이버 지도를 활용하기 전에 애플에서 제공하는 MapKit으로 먼저 시도를 했었다. 그 이유는 구글, 네이버, 카카오 지도는 몇 번이상 호출되면 요금이 발생했다. 물론 그 횟수가 몇 십만 이상이긴 하지만 그래도 뭔가 신경쓰여서,,
그런데 OpenAPI 요청으로 받아오는 장소 데이터가 규칙이 정해져있지 않아(예를 들어 장소이름(주소)처럼 정형화되어있지 않고 마음대로) 지도 검색으로 넘겨주어, 그 검색 결과 위치를 지도에 그려주는 프로세스를 생각했다. 실험을 위해 요청으로 받아온 장소 문자열 그대로 애플 지도에 검색해주니 결과들이,, 엉뚱한 곳을 찾거나 아예 찾질 못했다.
그래서 많은 사람들이 검색할 때 이용하는 네이버가 좋을 것 같아 네이버 지도를 선택했다. 국내 위치에 특화되기도 했고 검색 엔진도 좋을 것 같아서다.
ㅋㅋㅋㅋ그런데 작업을 진행하고보니 또 네이버 지도와 검색은 별개였다. 검색은 OpenAPI로 제공하여 그대로 프로젝트에 적용시켰다. 그래도 몇 개의 장소는 검색하지 못하더라ㅠ
그리고 검색 한번 당 API요청 1번이라서 20개의 장소는 20번 요청한다. 여기서 문제되는 것이 10번을 초과한 요청은 짧은 시간에 많은 횟수라 그런지 몇 개의 데이터가 제대로 디코더되지 않았다.
어떻게 알았냐면 원래 20개를 검색 요청했을 때의 결과로, 몇개는 keyNotFound 에러가 떳다. 디코더할 때의 데이터 키와 구조체 프로퍼티와 맞지않았다면 모두가 keyNotFound 에러였어야 하는데 이를 알아보기 위해 디버깅을 진행했다.
코드 상 요청하는 부분에서 브레이크 포인트를 찍어 진행하니 또 문제없이 20개 검색이 잘 되었다.
브레이크 포인트에 멈추면서 요청하는 환경이 단시간이 아니기 때문에 모든 검색을 할 수 있었던 것 같았다.
그래서 데이터를 불러오는 갯수를 10개로 줄여서 진행했다. 나중에 딜레이를 아주 살짝 넣고 갯수를 늘려보는 실험을 해야겠다.
검색 결과로 받아오는 좌표는 KATECH(KATEC) 좌표계를 따르는 값이라고 나와있는데 이를 Tm-128좌표라고도 한단다. 그래서 변환하는 예제를 참고하여 실행해주었는데 지도에 마커가 찍히지 않는 것이다.


그렇게 시간을 날리며 뻘짓?하다가 찾은 정보가 있었다. 공지사항을 봤는데 KATECH좌표계에서 WGS84로 변경되었단다. 이것도 구글에서 검색해보다가 공지사항으로 우연히 들어가게 된 것인데 못봤더라면? 끔찍하다ㅠ
왜 공지는 해놓고 문서에는 katech으로 적어놔서 사람 헷갈리게 하는지,,

그래서 WGS84가 우리가 흔히 부르는 위도 경도인 것을 알고 그대로 적용하려고 했는데 불러오는 좌표값들의 단위가 심상치 않다.
mapx: "1269691589", mapy: "375687406"
장소 중 하나를 가져왓는데 내가 아는 위도 경도 좌표랑은 달랐다. 3n, 12n이여야하는데 뭐지? 싶었다.
그렇게 또 다른 좌표계가 있나하고 찾아보다가 숫자들의 앞자리만보니 소수점이 빠진듯한 느낌이 들었다.
mapx 앞의 세자리는 12n에 일치했고, mapy 앞의 두자리는 3n에 일치했다. 그리고 해당 숫자의 뒷자리 갯수는 둘다 7자리로 동일했다. 그래서 혹시나하고 10^-7을 곱한 좌표값을 넣어 마커를 생성하니 해당 장소와 일치했다.
아마 부동소수점에 의한 데이터 오차가 있을 수 있어서 정수로 해놓은 듯 했다.(오직 내 추측이다.)
등 생각나는 건 여기까지다. 솔직히 지도 구현하기 전에 어려울까봐 겁먹고 있었는데 재밌고 생각보다는 쉬웠다. 생각보다는. 다른 지도 라이브러리는 모르겠는데 네이버 지도는 일단 그렇다.
암튼 한달 내로 출시하는 것이 목표니 그때까지 화이팅이다! 'iOS 앱의 구조와 코코아 터치 프레임워크' 포스팅도 마무리 지을거다!