웹 앱에 지도를 통합할 때, 이후 모든 결정을 좌우하는 아키텍처 선택이 하나 있다: 래스터 타일이냐, 벡터 타일이냐. 제대로 고르면 지도가 빠르고, 예쁘고, 유연하다. 잘못 고르면 디자인 시스템과 매번 충돌하는 픽셀 깨진 배경 이미지를 배포하게 된다.
이 가이드에서는 두 포맷의 기술적 차이를 설명하고, 프론트엔드 개발자 입장에서 실제로 중요한 트레이드오프를 짚어보고, 명확한 의사결정 프레임워크를 제시한다. 다 읽고 나면 어떤 포맷을 선택해야 하는지, MapAtlas에서 vector tiles를 어떻게 시작하는지 확실히 알 수 있을 거다.
타일 포맷 질문은 거의 모든 매핑 프로젝트 초반에 나온다. 인터넷에는 "vector tiles가 더 최신"이라고만 말하고 끝내는 얕은 답변이 넘쳐난다. 이 가이드는 렌더링 파이프라인, 페이로드 크기, 브라우저 호환성, 스타일링 제어, 그리고 raster tiles가 여전히 올바른 선택인 구체적인 시나리오까지 더 깊이 다룬다.
이미 개발 중이고 코드만 필요하다면 빠른 시작 섹션으로 바로 넘어가도 된다.
래스터 타일이란?
Raster tile은 특정 줌 레벨에서 세계의 고정된 영역을 표현하는, 보통 256×256 또는 512×512 픽셀의 사전 렌더링된 PNG 또는 JPEG 이미지다. 사용자가 지도를 이동하거나 줌하면 브라우저는 서버가 이미 렌더링하고 캐시해 둔 인접하거나 더 높은 해상도의 타일을 요청한다.
렌더링은 완전히 서버 사이드에서 일어난다. 브라우저에 도달하는 타일 이미지는 이미 완성된 그림으로, 픽셀은 이미 배치되어 있고 색상도 이미 고정되어 있다. 브라우저가 할 일은 그걸 화면에 표시하는 것뿐이다.
래스터 타일 서버가 동작하는 방식
Raster tile 스택은 보통 이런 구조다:
- 원시 지리 데이터(OpenStreetMap, 지적 데이터, 고도 모델)가 데이터베이스로 처리된다.
- 렌더링 엔진(Mapnik이 고전적 선택)이 모든 줌 레벨의 타일을 사전 렌더링해 타일 캐시에 저장한다.
- 타일 서버(래스터 모드의 TileServer GL이나 관리형 CDN)가
/{zoom}/{x}/{y}.pngURL 규칙에 따라 캐시된 이미지를 서빙한다.
결과는 단순하고 빠르며 무상태(stateless)다. 브라우저, 모바일 앱, 지도 이미지를 생성하는 서버 사이드 프로세스, GIS 데스크톱 애플리케이션 등 어떤 HTTP 클라이언트라도 타일을 요청할 수 있다.
래스터 타일의 강점
- 클라이언트 사이드 렌더링 오버헤드 제로. 브라우저는 이미지만 표시하면 된다. WebGL도, 셰이더 컴파일도, 폰트 렌더링도 필요 없다.
- 범용 호환성. Internet Explorer와 헤드리스 렌더링 환경을 포함해 모든 버전의 모든 브라우저에서 동작한다.
- 예측 가능한 외관. 지도가 타일 서버가 렌더링한 것과 정확히 동일하게 보인다. 클라이언트 사이드 변동이 없다.
- 서버 사이드 이미지 생성이 쉽다. 이메일, PDF 리포트, 소셜 공유 카드용 정적 지도 이미지를 생성하기에 완벽하다.
래스터 타일의 약점
- 큰 파일 크기. 일반적인 256×256 PNG 타일은 콘텐츠 밀도에 따라 30~200 KB다. Retina(512×512) 타일은 픽셀 수가 네 배다.
- 고DPI 화면에서 픽셀 깨짐. 1x 디스플레이용으로 렌더링된 타일은 2x Retina 화면에서 흐릿하게 보인다. @2x 타일을 서빙하지 않으면 대역폭이 두 배로 든다.
- 회전이나 기울기 불가. raster 지도를 회전하면 텍스트 레이블도 함께 돌아서 읽을 수 없게 된다. 그래서 raster 지도는 항상 북쪽이 위다.
- 클라이언트 사이드 스타일 변경 불가. 도로 색상을 바꾸거나, POI 아이콘을 숨기거나, 다크 모드로 전환하고 싶다면? 서버 사이드에서 사전 렌더링된 새 타일 세트가 필요하다.
- 줌 보간 문제. 정수 줌 레벨 사이에서 브라우저는 기존 이미지를 스케일링하는데, 그러면 흐릿해진다. vector tiles에서 느낄 수 있는 "부드러운 줌" 감각은 raster에선 없다.
벡터 타일이란?
Vector tile은 지도 영역의 원시 지리 데이터를 담고 있다. 도로 지오메트리, 건물 폴리곤, 수체, 토지 이용 구역, 레이블 배치 데이터가 압축된 바이너리(보통 Mapbox Vector Tile 포맷, .mvt)로 인코딩되어 있다. 타일에는 픽셀이 없다. 그 영역에 무엇이 있는지를 설명할 뿐, 어떻게 보여야 하는지는 담지 않는다.
렌더링은 WebGL을 사용해 완전히 클라이언트 사이드에서 일어난다. Mapbox GL JS 호환 지도(MapAtlas 같은)를 로드하면, SDK가 vector tiles를 요청해 지오메트리 데이터를 받고, 스타일 명세를 사용해 모든 도로, 건물, 레이블을 실시간으로 초당 60프레임으로 <canvas> 요소에 그린다.
벡터 타일 렌더링이 동작하는 방식
Vector tile (.mvt) + Style JSON → WebGL shader → Canvas pixels
Style JSON(당신이 제어하는 구조화된 파일)은 렌더러에게 지시한다: 이 색상으로 도로를 그려라, 이 높이로 건물을 돌출시켜라, 레이블엔 이 폰트를 써라, 줌 12 이하에서는 이 레이어 타입들을 숨겨라. 스타일은 새 타일을 가져오지 않고도 런타임에 변경할 수 있다.
벡터 타일의 강점
- 작은 페이로드. 바이너리 인코딩된 지오메트리는 렌더링된 이미지보다 훨씬 압축적이다. 밀집된 도심 지역의 일반적인 vector tile은 15
50 KB인 데 반해, 동등한 raster tile은 80200 KB다. - 어떤 해상도에서도 선명함. 벡터 지오메트리는 수학적으로 스케일된다. Retina 디스플레이도 표준 디스플레이와 동일한 타일을 받는다. 렌더러가 더 많은 픽셀을 출력할 뿐이다. @2x 타일 변형은 필요 없다.
- 부드러운 줌과 회전. 렌더러가 원시 지오메트리를 다루기 때문에, 줌은 연속적으로(정수 레벨만이 아니라) 보간될 수 있고, 지도를 기울이고 회전해도 레이블은 항상 올바른 방향을 유지한다.
- 완전한 클라이언트 사이드 스타일 제어. 스타일 객체를 업데이트해 도로 색상, 레이블 폰트, 레이어 가시성, 불투명도 등 모든 시각적 속성을 변경할 수 있다. 새 타일 요청 없이. 다크 모드는 새 타일 세트가 아닌 style JSON 교체다.
- 3D 건물 돌출. Vector tiles에는 건물 높이 메타데이터가 포함된다. 렌더러는 WebGL을 사용해 폴리곤을 3D로 돌출시킬 수 있다. Raster tiles에는 고도 개념이 없다.
- 데이터 기반 스타일링. 제한 속도에 따라 도로 색상을 변경하고, 카테고리별로 토지 이용을 음영 처리하고, 인구에 따라 마커를 스케일하는 것이 모두 서버에 손대지 않고 타일의 데이터 속성으로 구동된다.
벡터 타일의 약점
- WebGL 필수. WebGL 지원이 없으면 vector tile 렌더링도 없다. 매우 오래된 브라우저(IE11)와 특정 헤드리스 환경이 제외된다.
- 클라이언트 사이드 CPU/GPU 부하. 렌더링은 사용자 기기에서 일어난다. 저사양 Android 폰이나 부하가 많은 데스크톱에서는 레이어가 많은 복잡한 지도 스타일이 프레임 드롭을 일으킬 수 있다.
- 초기 설정이 더 복잡하다.
<img>태그만으로는 안 되고 렌더링 라이브러리(Mapbox GL JS, MapLibre GL, 또는 MapAtlas SDK)와 style JSON이 필요하다. - 폰트 및 글리프 로딩. 레이블 렌더링에는 글리프 파일이 별도로 서빙되어야 한다. 첫 로드 시 네트워크 요청이 몇 개 추가된다.
성능 비교: 실제 수치
트레이드오프를 구체적으로 파악하기 위해, 줌 레벨 14에서 암스테르담 중심부 지도 타일의 실제 측정값을 보자:
| 지표 | Raster (PNG 512px) | Vector (.mvt) |
|---|---|---|
| 타일 크기 | 142 KB | 31 KB |
| Retina 요청 수 | 1개 (@2x 타일) | 1개 (동일 타일) |
| 줌 보간 | 픽셀 스케일링(흐림) | 수학적(선명) |
| 회전 지원 | 없음 | 있음 |
| 스타일 변경 | 새 타일 요청 | 요청 없음 |
| WebGL 필요 | 없음 | 있음 |
규모가 커지면 vector tiles는 지도 관련 대역폭을 60~80% 줄인다. 월 1천만 건의 타일 요청을 발생시키는 중간 트래픽 앱에서 이 차이는 CDN 이그레스 비용을 의미 있게 줄여준다.
래스터 타일을 써야 할 때
Raster tiles는 구식이 아니다. 여전히 올바른 선택이 되는 명확한 시나리오가 있다:
레거시 시스템 통합. .NET WebForms 앱, 서버 렌더링된 Rails 뷰, 또는 HTML과 기본 JavaScript만 제어할 수 있는 환경에 지도를 삽입한다면, Leaflet이나 OpenLayers를 통한 raster tile 레이어가 WebGL 렌더러를 도입하는 것보다 더 단순하고 안정적이다.
서버 사이드 지도 이미지 생성. 이메일 템플릿, PDF 내보내기, 오픈 그래프 이미지를 위해 Node.js 서버에서 지도 스냅샷을 렌더링해야 한다면, 헤드리스 래스터 렌더링이 답이다. node-canvas와 raster tile 소스를 결합한 도구가 WebGL이 동작하지 않는 곳에서 작동한다.
위성 및 항공 이미지. 항공 사진은 본질적으로 래스터 데이터다. 벡터 지도에서도 위성 이미지 레이어는 항상 raster tiles로 전달된다. 하이브리드 지도는 두 포맷을 섞는다. 도로와 레이블은 벡터, 사진 베이스는 래스터.
매우 단순한 사용 사례. 연락처 페이지에 정적 위치 지도를 삽입하는 거라면? Leaflet + OpenStreetMap raster 구성은 20분이면 되고 JavaScript 복잡도는 제로다. 비인터랙티브 위치 핀 하나를 위해 vector tiles로 업그레이드할 이유는 없다.
벡터 타일을 써야 할 때
다음과 같은 것들을 신경 쓰는 모든 현대적 웹 애플리케이션에서는 vector tiles를 선택하라:
- 커스텀 브랜드 스타일링. 디자인 시스템에 특정 색상이 있다면 지도도 그래야 한다. Vector tiles는 이걸 JSON 변경으로 만든다.
- 다크 모드 지원. 다크 style JSON은 설정 파일 하나다. 라이트와 다크 전환은
map.setStyle()호출 하나면 된다. - 고DPI / Retina 선명도. 모바일 퍼스트 앱과 선명한 렌더링이 디자인 우선순위인 모든 UI에서 특히 중요하다.
- 부드러운 사용자 경험. 벡터 지도의 연속적인 줌 보간과 60fps 렌더링은 사용자가 즉시 느낀다. 인터랙티브 맥락에서 raster 지도는 비교적 투박하게 느껴진다.
- 데이터 시각화 레이어. 벡터 지도에 히트맵, 단계 구분도, 클러스터 레이어를 추가하려면 클라이언트 사이드 설정만 있으면 된다. Raster 지도에서는 새 레이어를 타일로 굽거나 캔버스 오버레이 해킹을 써야 한다.
- 3D 또는 기울어진 시각. Vector tiles와 WebGL로만 가능하다.
빠른 시작: MapAtlas로 벡터 타일 사용하기
MapAtlas는 Mapbox GL JS 호환 API를 통해 vector tiles를 서빙한다. Mapbox GL JS를 써본 적 있다면, 마이그레이션은 style URL 변경과 API 키 교체가 전부다. 처음 시작한다면, 완전한 설정이 여기 있다.
SDK 설치
npm install @mapmetrics/mapmetrics-gl
또는 순수 HTML 프로젝트의 경우 CDN 사용:
<link rel="stylesheet" href="https://unpkg.com/@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.css" />
<script src="https://unpkg.com/@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.js"></script>
벡터 지도 렌더링
import mapmetricsgl from '@mapmetrics/mapmetrics-gl';
import '@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.css';
const map = new mapmetricsgl.Map({
container: 'map', // ID of your <div>
style: 'https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY',
center: [4.9041, 52.3676], // [longitude, latitude], Amsterdam
zoom: 12,
pitch: 0, // 0 = top-down, 60 = 3D tilted
bearing: 0, // 0 = north-up, any value = rotated
});
style URL은 MapAtlas 서버에 호스팅된 JSON 파일을 가리키는데, 모든 레이어, 폰트, 소스를 정의한다. 직접 커스텀 style JSON을 호스팅해 지도의 모든 시각적 측면을 제어할 수도 있다. 지도 시각화 및 스타일링 가이드를 참고하자.
런타임에 다크 모드로 전환하기
document.getElementById('toggle-dark').addEventListener('click', () => {
const isDark = map.getStyle().name?.includes('dark');
map.setStyle(
isDark
? 'https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY'
: 'https://tiles.mapatlas.eu/styles/dark/style.json?key=YOUR_API_KEY'
);
});
이미 캐시된 데이터에 대해서는 새 타일 요청이 발생하지 않는다. 스타일만 변경되고, 타일은 동일한 바이너리 지오메트리를 유지하면서 새 색상으로 다시 렌더링된다.
GeoJSON 데이터 레이어 추가하기
Vector tiles의 가장 강력한 기능 중 하나는 자신의 데이터를 스타일이 적용된 레이어로 오버레이하는 것이다:
map.on('load', () => {
// Add your own data source
map.addSource('delivery-zones', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Polygon',
coordinates: [[[4.85, 52.34], [4.95, 52.34], [4.95, 52.40], [4.85, 52.40], [4.85, 52.34]]],
},
properties: { zone: 'Zone A', capacity: 150 },
},
],
},
});
// Style it as a colored fill layer
map.addLayer({
id: 'delivery-zones-fill',
type: 'fill',
source: 'delivery-zones',
paint: {
'fill-color': '#97C70A',
'fill-opacity': 0.2,
},
});
map.addLayer({
id: 'delivery-zones-outline',
type: 'line',
source: 'delivery-zones',
paint: {
'line-color': '#97C70A',
'line-width': 2,
},
});
});
소스를 추가하고, 레이어를 추가하고, 스타일 표현식으로 페인트하는 이 패턴은 히트맵, 경로 선, 등시선 폴리곤, 단계 구분도에서도 동일하다. Vector tiles가 완성된 픽셀이 아닌 원시 지오메트리를 렌더러에 제공하기 때문에 가능한 것이다.
래스터에서 벡터로 마이그레이션하기
Leaflet + raster tile 기반의 기존 구성을 업그레이드하고 싶다면, 최소한의 마이그레이션 경로가 여기 있다:
- Leaflet 교체. MapAtlas SDK(또는 완전한 오픈소스 렌더러를 선호한다면 MapLibre GL JS)로 교체한다.
- 타일 URL 교체. MapAtlas style JSON URL로 교체한다.
- 오버레이 이전. Leaflet 레이어에서 GL JS 소스와 레이어로 옮긴다.
- WebGL 미지원 환경 테스트. WebGL을 사용할 수 없는 소수의 사용자를 위한 폴백 또는 graceful degradation 메시지를 추가한다.
최종 결과는 더 선명하고, 더 빠르게 로드되며, 서버에 손대지 않고 재스타일링할 수 있는 지도다.
벡터 타일 기반 위에 마커, 팝업, 주소 검색, React 통합을 추가하는 전체 안내는 웹사이트에 인터랙티브 지도 추가하는 방법을 참고하자.
다크 모드, 브랜드 색상, 커스텀 폰트, 워터마크 제거 등 스타일링을 더 발전시키고 싶다면 커스텀 브랜드 지도 스타일링 방법을 확인하자.
비용과 기능 측면에서 MapAtlas와 Google Maps를 비교 평가 중이라면 MapAtlas vs. Google Maps: 개발자들이 전환하는 이유에서 주요 차이점을 다룬다.
요약: 의사결정 프레임워크
| 시나리오 | 권장 포맷 |
|---|---|
| 현대적 SPA 또는 PWA (React, Vue, Svelte) | Vector tiles |
| 커스텀 브랜드 색상 또는 다크 모드 | Vector tiles |
| 3D 건물 또는 지도 기울기/회전 | Vector tiles |
| 데이터 시각화 오버레이 | Vector tiles |
| 레거시 브라우저 지원 (IE11) | Raster tiles |
| 서버 사이드 이미지 생성 | Raster tiles |
| 위성/항공 이미지 레이어 | Raster tiles |
| 단순 비인터랙티브 위치 핀 | Raster tiles |
2026년에 인터랙티브한 것을 만들고 있다면 vector tiles가 기본 선택이다. Raster tiles는 특정 호환성이나 렌더링 제약을 위한 의도적인 예외다.
Vector tiles로 개발을 시작할 준비가 됐다면? 무료 MapAtlas API 키 발급받기, 신용카드 없이 바로 가능하다. 키 하나로 타일, 지오코딩, 라우팅, 등시선 API 모두 첫날부터 사용할 수 있다.
자주 묻는 질문
벡터 타일이 래스터 타일보다 낫나요?
대부분의 현대 웹 앱에서는 그렇죠. 벡터 타일은 크기가 작고, 부드러운 줌과 회전으로 60fps로 렌더링되며, 클라이언트에서 완전히 스타일을 바꿀 수 있어요. 래스터 타일은 구현이 간단하고 WebGL을 지원하지 않는 환경에서도 작동하지만, 용량이 크고 고DPI 화면에서 픽셀화되며 클라이언트 측 스타일 제어가 안 됩니다.
벡터 타일을 사용하려면 WebGL이 필요한가요?
네. Mapbox GL JS와 MapAtlas SDK 같은 벡터 타일 렌더러는 canvas 엘리먼트에 지도 형상을 그리기 위해 WebGL을 사용해요. 모든 현대 브라우저는 WebGL을 지원합니다. 매우 오래된 브라우저나 canvas가 없는 서버 사이드 렌더링 환경을 지원해야 한다면, 래스터 타일이 더 안전한 대안입니다.
MapAtlas는 벡터 타일과 래스터 타일 둘 다 지원하나요?
MapAtlas는 주로 Mapbox GL JS 호환 API를 통해 벡터 타일을 제공해요. 이미 Mapbox GL JS에 익숙한 개발자라면 스타일 URL과 API 키만 바꿔서 MapAtlas로 전환할 수 있고, 다른 코드 변경은 필요 없습니다.

