| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 플러그인
- 기획
- nginx
- jwt
- 배포
- react-query
- AWS
- Firebase
- 회고록
- vue
- PWA
- vsCode
- 토이프로젝트
- 셋팅
- javascript
- extension
- express
- 정리
- login
- 신상마켓
- Git
- vuex
- react
- database
- 뷰
- Docker
- 로그인
- plugin
- vue login
- 프론트
- Today
- Total
강디너의 개발 일지
React Native + WebView + 카카오 지도 연동 삽질기 (with Expo) 본문
Next.js로 만든 기존 서비스를 앱으로 확장하고 싶었다. 그래서 Expo를 선택했고, 그 과정에서 카카오 지도를 붙이며 겪은 문제들과 해결 방법을 정리해본다. 이 글은 완벽한 가이드라기보다는 내가 실제 겪은 시행착오를 기록하는 삽질기에 가깝다. (지금도 만들고 있는데 계속 작성할수도 있다...)
Next.js 서비스 → 앱으로 만들기 시작
부동산에 관심이 많았었기에 국토부 실거래 자료를 기반으로 한 웹 기반의 Next.js로 만든 서비스가 있었다.
"이걸 앱으로 만들어보고 광고를 한번 붙여봐 ?" 라고 결정하고, Expo를 사용해 개발을 시작했다. 이유는 단순했다:
- React 기반이라 코드 재사용이 쉬울 것 같았고,
- 배포가 빠를 것 같았고,
- 네이티브 개발을 하고 싶지 않았고,
- 이전엔 CLI로 한번 개발을 했었는데, Expo도 한번 이참에 해보고 싶었기 때문.
Expo로 앱 개발 시작
React Native 자체도 초보였던 나는 Expo로 빠르게 프로젝트를 시작했다. Expo Go로 테스트할 수 있어서 서버 올릴 필요 없이 바로 앱에서 확인할 수 있는 점이 좋았다. CLI와 다르게 안드로이드 스튜디오, Xcode가 없이 테스트 가능하다는게 너무 좋았다. 세팅하는게 개발자의 최고의 귀차니즘이니깐...
카카오 지도 연동 – 시작부터 막힘
문제는 카카오 지도였다. 기존 웹에서는 쉽게 붙였던 카카오 지도가 앱에서는 생각보다 어려웠다.
- Expo는 네이티브 SDK(안드로이드/iOS)를 사용할 수 없다.
- 카카오에서 제공하는 React Native SDK도 없다.
그래서 WebView로 카카오 지도 웹 SDK를 불러서 띄우는 방식을 선택했다. 여기까지는 괜찮았다.
마커 찍기 실패 – Geocoder의 배신
문제는 특정 주소에 마커를 찍는 것이었다. 기존 웹 서비스에서는 문제없이 성공했었다. 그래서 자연스럽게 카카오에서 제공하는 kakao.maps.services.Geocoder를 사용했다.
하지만 결과는 계속 실패.
- status 값은 항상 null
- result 값은 "ERROR"
- Web에서는 잘 되던 코드가 앱(WebView) 안에서는 실패했다.
WebView 안에서 지도를 띄우면서 이런 불편함도 있었다:
- WebView에서는 DevTools가 안 보이므로 디버깅이 어렵다.
- 로컬에서 지도 WebView가 보이지 않아서 테스트할 때 매번 핸드폰으로 확인해야 했다.
- React Native ↔ WebView 통신도 postMessage로 일일이 처리해야 했다.
그래도 메시지 핸들러를 만들어서 로그를 찍어가며 디버깅했다. AI한테도 자주 물어보면서 많은 시간을 아꼈다.
정말 하루동안 세상에 나온 AI들을 다 괴롭혀본것 같다.
하지만 전부 실패하고야 말았고 아래와 같은 결론을 내렸다.
- 카카오 Geocoder는 서버 호출이 필요하다.
- 그런데 WebView에서 실행되는 HTML의 origin은 보통 file://, about:blank, localhost로 인식된다.
- 카카오 개발자센터에서 등록한 도메인이 아니면 Geocoder 호출 자체가 막힌다.
즉, 지도가 로컬에서 잘 보였던 것은 SDK 자체는 클라이언트에서 동작하기 때문이고, 좌표 검색(Geocoder)은 서버에서 동작하기 때문에 도메인 제한에 걸렸다고 생각했다.
(허용 도메인에 로컬호스트, file:// 등을 등록해봤지만 당연히 실패)
결국 카카오 문서를 다시 뒤져서 다른 API 방식을 찾았다.
- 카카오에서 제공하는 주소 → 좌표 변환 WEB API를 쓰기로 결정.
- 앱에서는 서버 통신이 허용되므로, 이 API는 문제없이 호출 가능.
- WebView 안에서 Geocoder 쓰기를 포기하고,
- React Native 코드 단에서 API로 좌표를 가져와서 WebView로 넘겨주기로 했다.
좌표를 받으면 WebView에 마커를 찍으면 되니까...
REST API 호출 → 비용 발생 → 캐싱 도입
테스트 중 API를 생각보다 너무 많이 쏘는 것 처럼 느껴졌다.
REST API 호출은 무료가 아니다. 호출이 늘어날수록 비용이 발생한다. 돈벌려고 시작했는데 돈쓰는 서비스가 된다면 섭종이다.
그래서 React Query를 도입했다.
- 주소 → 좌표는 거의 변하지 않으므로 캐싱해도 문제가 없다.
- 다른 Kakao API들도 길게 캐싱해도 문제 없다.
- 처음에는 App.tsx에서 설정했지만,
- Expo Router를 쓰면서 _layout.tsx에 적용해야 한다는 것도 알게 됐다.
덕분에 호출 비용도 아끼고, 속도도 개선됐다.
마무리
- 카카오 지도 SDK는 웹에서는 편하지만, 앱에서는 도메인 제한 때문에 일부 기능이 막힌다.
- 지도는 WebView에서 띄우되, 좌표 변환은 REST API로 처리하는 것이 안전하다.
- REST API 호출은 캐싱이 중요하다. 비용이 실제로 발생하기 때문이다.
- WebView 안에서 마커, 정보창 등은 HTML/JS에서 처리하고, 부모 React Native와 통신은 postMessage로 단순화하는 게 유지보수에 좋다.
React Native + WebView로 카카오 지도를 붙이는 건 생각보다 쉬웠지만,
주소 → 좌표 변환이 막히면서 하루 넘게 삽질했다.
다음에는 더 빠르게 해결할 수 있을 것 같다.
지금도 React Native에서 카카오 지도를 붙이려는 사람이 있다면…
WebView 안에서 Geocoder 쓰지 말고, REST API로 처리하세요.
'Javascript > 삽질' 카테고리의 다른 글
| 로그인 프로세스 개선 - Axios 통신 한줄기로 만들기 (0) | 2021.05.31 |
|---|---|
| 이미지 업로드 - 프론트 부터 AWS S3 까지의 과정 (0) | 2021.04.25 |
| Node.js - AWS Lambda 용량 줄이기(Layer를 사용하자) (0) | 2021.02.28 |
| javascript - JWT 로그인 및 세션 유지 (0) | 2021.02.07 |
| 화면에 특정 DOM 이 보이는가? - InterSectionObserver API (4) | 2020.09.03 |