[Essay] 지도는 정치다 : 내 블로그에 내 지도를 올리기까지

블로그에 맛집 사진을 올리면서 좌표를 같이 적어 두고 있었습니다. 어느 날 이걸 지도에 찍어 보면 좋겠다 싶어 작업을 시작했는데, 지도 한 장을 붙이는 일이 생각보다 훨씬 깊은 우물이었습니다. 어떤 투영법을 쓸지, 어느 나라를 뭐라고 부를지, 어떤 도시를 먼저 보여 줄지. 지도는 처음부터 끝까지 선택이었고, 그 선택은 하나같이 정치적이었습니다.
이 글은 그 우물의 기록입니다. 앞부분은 지도가 왜 정치적인가에 대한 이야기이고, 뒷부분은 실제로 제 지도를 만들면서 겪은 일입니다. 그림이 많아서, 그림은 화면에 붙어 있고 글을 내리면 그 자리의 그림이 바뀌는 방식으로 짰습니다.
1. 지도는 처음부터 정치였다
그린란드는 아프리카만 하지 않다

우리가 벽에 걸어 두고 자란 세계 지도는 1569년 게라르두스 메르카토르가 항해용으로 만든 투영법입니다. 나침반 방위를 직선으로 그릴 수 있어서 배를 모는 데는 더할 나위 없었지만, 대신 적도에서 멀어질수록 땅이 부풀어 오릅니다. 그린란드(약 217만 km²)와 아프리카(약 3,037만 km²)는 실제로 열네 배 차이가 나는데, 이 지도에서는 비슷한 크기로 보입니다. 유럽과 북미는 크고 아프리카와 남미는 작아 보이는 세계관이 여기서 나왔습니다.
이게 옛날 얘기가 아닙니다. 지금 쓰는 웹 지도 — 구글, 네이버, 그리고 제가 이 글에서 만든 지도까지 — 전부 웹 메르카토르라는 같은 투영법 위에서 돌아갑니다. 타일을 정사각형으로 자르기에 편해서입니다.

면적을 지키는 투영법도 있습니다. 2025년 8월에는 아프리카연합이 메르카토르 대신 Equal Earth(2018)를 쓰자는 “Correct the Map” 캠페인을 공식 지지했습니다. 구글은 2018년에 데스크톱 지도를 줌아웃하면 지구본으로 보이게 바꿨지만, 모바일 앱은 여전히 메르카토르입니다. 어느 투영법을 고르든 무언가는 왜곡되고, 무엇을 지킬지 고르는 것부터가 선택입니다.

지도의 위가 북쪽이어야 할 이유도 없습니다. 1979년 호주의 스튜어트 매카서는 남쪽을 위로 두고 호주를 한가운데에 놓은 “Universal Corrective Map"을 만들었습니다. 처음 보면 어지러운데, 그 어지러움 자체가 우리가 얼마나 한 가지 관습에 길들여져 있는지를 말해 줍니다. 중세 유럽의 지도는 동쪽(예루살렘 방향)이 위였고, 그래서 방향을 잡는 일을 지금도 “orient(동쪽으로 맞추다)“라고 부릅니다.
위 세 장은 이 블로그의 지구본이 쓰는 같은 국경 데이터(Natural Earth 110m)로 제가 직접 그린 것입니다. 같은 데이터, 다른 투영법입니다.
지도를 나라 밖으로 내보낼 수 없는 나라
우리나라에서 지도는 오랫동안 안보 자산이었습니다. 국가가 만든 정밀 지도(측량 성과)를 국외로 반출하려면 정부 심의를 거쳐야 합니다. 구글이 2007년과 2016년에 1:5,000 지도 데이터 반출을 신청했다가 두 번 다 불허됐고, 2025년 2월에 낸 세 번째 신청은 심의가 세 차례 미뤄진 끝에 2026년 2월 27일 국토지리정보원이 조건부 허가를 내렸습니다. 군사·보안 시설을 가리고, 원본 처리는 국내 서버에서 하고, 정부가 검토한 정보만 내보내고, 문제가 생기면 즉시 중단할 수 있어야 한다는 조건입니다. 18년이 걸린 논쟁입니다.
그래서 구글 지도에서 한국은 오랫동안 이상했습니다. 길찾기가 안 되고 상세 지도가 비어 있었습니다. 지도는 그 자체로 국가가 관리하는 정보였고, 저는 이 사실을 알면서도 “지도는 그냥 있는 것"으로 생각해 왔습니다.
대동여지도, 국가가 아닌 사람이 만든 지도
그 반대편에 김정호의 대동여지도(1861)가 있습니다. 22첩을 이어 붙이면 세로 6.8m가 되는 한반도 지도인데, 핵심은 크기가 아니라 목판이라는 점입니다. 손으로 베끼면 틀어지는 것을 막고 찍어서 널리 퍼뜨리려고 판을 새겼습니다. 주요 도로에는 10리마다 점을 찍어 거리를 셀 수 있게 했고, 14개 항목을 22개 기호로 정리한 범례를 뒀습니다. 근대 측량 이전의 한반도 지도 중 가장 정확하다는 평가를 받고, 1898년 일본군이 자기들이 힘들여 만든 지도와 별 차이가 없는 것을 보고 놀랐다는 기록도 있습니다.
어릴 때 배운 “대원군이 지도가 외국에 새어 나갈까 두려워 목판을 불태우고 김정호를 옥사시켰다"는 이야기는 1934년 조선총독부가 낸 조선어독본에 처음 실린 것입니다. 목판은 지금도 국립중앙박물관에 남아 있고, 실록·승정원일기 어디에도 투옥 기록이 없습니다. 조선이 지도를 탄압했다는 이야기가 일제 교과서에서 나왔다는 것부터가, 지도를 둘러싼 서사가 얼마나 정치적으로 쓰이는지 보여 줍니다. 그래도 저는 이 이야기의 뼈대 — 국가가 만든 지도와 개인이 찍어 퍼뜨린 지도 — 를 좋아합니다. 제가 만들고 싶었던 것이 후자였습니다.
2. 왜 내 지도가 필요했나
블로그를 다시 만들면서 세운 원칙 하나가 DB 없이 텍스트 파일로 운영한다는 것이었습니다. 그 연장선에서, 인터넷 회사의 자료에 기대지 않고 굴리고 싶었습니다. 구글 지도 API는 키와 결제가 붙고, 방문자의 위치가 그쪽으로 흘러갑니다. 네이버 지도도 마찬가지입니다. 무엇보다 남의 지도를 빌려 쓰면 남이 정한 지명, 남이 정한 표기, 남이 정한 경계를 그대로 쓰게 됩니다.
사실 이 블로그에는 이미 남의 API 없이 돌아가는 지구본이 하나 있었습니다. 여행 페이지의 이것입니다. NASA의 지구 사진과 Natural Earth 국경, 그리고 제 GPS 기록에서 뽑은 도시 점으로 그립니다. 방문한 나라를 칠하는 것까지는 이걸로 됐지만, 사진 한 장을 찍은 골목을 보여 주는 데는 지구본이 아니라 지도가 필요했습니다.
발자국이 닿은 곳
드래그하면 돌아갑니다. 점이 다녀온 도시, 칠해진 곳이 방문한 나라입니다. 확대하면 더 작은 도시까지 나옵니다. 밝은 모드에서는 낮의 지구, 어두운 모드에서는 밤의 지구(도시 불빛)가 보입니다 — 테마를 바꿔 둘 다 보세요.
지구본을 불러오는 중…
- 나라
- –
- 도시
- –
- 대륙
- –
지구본이 안 보이면 자바스크립트가 꺼져 있는 것입니다. 목록은 여행 페이지에 있습니다.
그래서 OpenStreetMap(OSM)이었습니다. 위키백과처럼 사람들이 모아 만드는 지도 데이터이고, ODbL 라이선스라 출처만 밝히면 내 서버에서 내 마음대로 그릴 수 있습니다. 구성은 이렇습니다.
- 데이터: OSM 한국 추출본(Geofabrik) → Planetiler로 벡터 타일(OpenMapTiles 스키마) 굽기
- 서빙: tileserver-gl-light 컨테이너 하나. 타일·글리프·스프라이트·스타일 JSON을 내준다
- 화면: 블로그의 MapLibre GL JS가 스타일 JSON 주소 하나만 알고 그린다
문제는 지도 데이터가 아니라 그리는 법이었습니다.
3. OSM은 상용 지도보다 한참 떨어졌다
처음 띄운 지도를 보고 실망했습니다. OSM 스키마용 공개 스타일 여덟 종을 실제 한국 타일로 렌더해 비교했는데, 어느 것도 제가 지도라고 부르는 물건과 달랐습니다.

Positron. 거의 무채색입니다. 지도를 배경으로 물리고 위에 마커를 얹을 때 쓰는 스타일이라, 지도 자체를 읽으려면 대비가 부족했습니다.

OSM Bright. 가장 “지도다운” 색이지만 도로가 테두리와 속을 따로 그리는 70개 레이어라 선이 진합니다. 사진 핀을 얹으면 핀이 묻힙니다.

Maptiler Basic. 공원과 물이 살아 있고 도로가 얌전합니다. 이걸 바탕으로 골랐습니다. 다만 이 상태로는 여기가 종로라는 것을 알 수 없습니다.

Dark Matter. 다크 테마가 있다는 것 말고는 읽을 것이 없었습니다. 그리고 라이트 스타일과 짝이 맞는 다크는 어디에도 없었습니다.

지형지물이 제대로 안 나오는 것, 밝은 테마와 어두운 테마가 따로 없는 것은 그렇다 칩시다. 지도라면 당연히 보일 거라고 생각했던 것 — 지하철역, 공원, 학교, 아파트 단지 — 이 하나도 없어서, 종로를 띄워 놓고도 여기가 어딘지 알 수가 없었습니다. 네이버 지도를 보며 자란 눈에 OSM의 기본 스타일은 도로망 도면에 가까웠습니다. 그래서 스무 번 커밋하며 하나씩 채웠습니다.
4. 스무 번의 커밋
다크 테마는 명도를 뒤집는 것이 아니었다
Maptiler Basic에는 공식 다크 버전이 없어서 라이트 스타일의 색을 변환해 다크를 만들었습니다. 첫 시도는 명도를 통째로 뒤집는 것이었는데, 도로가 배경보다 어두워져서 갈색 바탕에 검은 도로가 나왔습니다. 다크맵의 전제가 뒤집힌 겁니다.

레이어를 역할로 나눠서 면은 채도를 죽여 가라앉히고, 도로는 배경보다 밝게 올리고, 라벨은 방향을 뒤집었습니다. 밝은 배경에서 가장 어둡던 글씨가 가장 중요한 글씨이므로 어두운 배경에서는 가장 밝아야 합니다. 그래도 아직 도로 채움이 라벨과 명도가 겹쳐 지명이 도로망에 묻힙니다.

배경 0.09 · 도로 0.17–0.36 · 라벨 0.58–0.92로 읽히는 순서를 라벨 > 도로 > 면으로 다시 세웠습니다. 원본 도로색은 거의 전부 흰색이라 선형 변환으로는 위계가 안 생겨서, 도로만 등급별로 명도를 직접 줬습니다. 고속도로가 이면도로보다 밝은 위계가 밤 버전에서도 살아남습니다.
세계가 없었다

한국 추출본으로 구운 타일이니 당연히 한국 밖은 비어 있었습니다. 줌을 빼면 한반도 상자 밖은 배경색뿐입니다. 전 세계를 z14까지 구우려면 planet.osm.pbf 88GB를 받아야 합니다.

“깊지 않은 레벨에서 세계가 보이는 것"이 목표였으므로 세계는 z0~7까지만 따로 구워 붙였습니다. 14MB입니다. 그런데 굽고 나니 한국 밖에 지명이 하나도 없었습니다. Planetiler의 OpenMapTiles 프로필은 지명을 OSM에서만 가져오는데 우리 입력이 한국 추출본이라서입니다.

Natural Earth에 국가 258개·도시 7,342개가 name_ko까지 붙어 있길래 거기서 채웠습니다. OSM의 name:ko는 해외 지명에서 비는 곳이 많아, 한국어 라벨로는 오히려 이쪽이 촘촘합니다.

한국 밖에서 줌을 넣으면 국경과 나라 이름까지 사라지는 문제도 있었습니다. 세계와 한국을 한 파일로 합친 탓이었습니다. 벡터 타일은 “그 줌의 타일이 없으면 부모를 늘려 그린다"는 규칙이 있지만 소스가 선언한 maxzoom을 넘었을 때만 발동합니다. 합친 파일이 maxzoom 16이라고 선언하면 유럽 z10 타일을 실제로 요청하고, 서버가 빈 타일로 답하는 순간 그 자리는 “진짜 비어 있음"으로 확정됩니다. 세계(maxzoom 7)와 한국(bounds 한국)을 별도 소스로 나누니 해결됐습니다. 그러고도 한국 밖은 해안선뿐이라 휑했습니다.

국경·강·호수·도시권·바다 이름을 Natural Earth에서 한 번 더 보충했습니다. 전부 이미 받아 둔 파일 하나(811MB) 안에 있어서 추가 다운로드는 없었습니다.
대한민국이 사라지고 북한만 남았다
이 작업에서 가장 열이 받았던 순간입니다.

줌을 빼면 한반도 위에 조선민주주의인민공화국이라는 긴 이름이 떡하니 보이는데, 정작 대한민국과 서울특별시는 안 보였습니다. 오픈소스라서 이상한 성향의 사람들이 북한을 계속 보이게 해 둔 건가 싶었습니다.
원인은 그게 아니었습니다. MapLibre는 라벨끼리 자리를 다투면 우선순위가 낮은 쪽을 그냥 안 그립니다. 제가 서울 근처에 찍어 둔 마커와 도시 라벨들이 대한민국 라벨의 자리를 가리고 있었고, 대한민국은 다툼에서 밀려 사라진 겁니다. 북한은 위가 텅 비어 있으니 경쟁자 없이 살아남았고요. 악의가 아니라 충돌 처리의 결과였습니다.

대한민국 라벨을 충돌에서 아예 빼서(text-allow-overlap) 언제나 그리게 하고, 등장 순서도 직접 정했습니다. 대한민국은 z0부터 끝까지, 일본은 z2, 북한은 z3.
국호도 손봤습니다. Natural Earth의 정식 국호대로 두면 조선민주주의인민공화국·중화인민공화국·중화민국이 나오는데, 저는 이 나라들을 국호 그대로 부를 생각이 없었습니다. “인민"은 퇴색되긴 했어도 일반 대중을 뜻하는 말인데, 두 나라 모두 인민공화국이라는 칭호에 어울리는 나라라고 생각하지 않기 때문입니다.

제 지도에서는 북한·중국·대만입니다. 이건 순전히 제 선택이고, 그래서 정치적입니다. 남의 지도를 빌려 썼다면 이 선택은 제 것이 아니었을 겁니다. 우리나라와 일본이 독도와 동해 표기를 두고 싸우는 것도 같은 구조입니다. 지도에 무엇이 어떤 이름으로 적히느냐는 데이터의 문제가 아니라 이해관계의 문제이고, 지도를 그리는 사람이 그 자리에서 결정을 내립니다.

또 하나 눈에 걸린 것은 광주가 서울특별시나 대한민국보다 먼저 뜨고, 줌을 넣는 동안 더 오래 남는다는 점이었습니다. OSM의 지명 순위(rank)가 그렇게 잡혀 있었습니다. 광주광역시와 전라남도가 합쳐져 2026년 7월 1일 전남광주통합특별시로 출범한 것이 반영된 결과로 보였는데, 저는 이 승격 자체에 정치적인 이유가 있다고 생각합니다. 그동안 계속 광역시였던 곳을 특별시로 바꿀 이유가 없었고, 우리나라에서 두 번째 특별시가 될 이유는 더더욱 없었다고 봅니다.

그래서 등장 줌을 데이터의 순위가 아니라 제가 직접 정했습니다. 서울과 광역시 여섯 곳, 그리고 제주도 — 이 여덟이 z6에서 함께 뜨고 함께 사라집니다. 광주도 그중 하나일 뿐입니다. 이것도 충돌 처리 때문에 등장 줌만 맞춰서는 안 됐습니다. 인천은 서울에, 울산은 부산에, 대전은 국가 라벨에 밀려 넷다섯 개만 남아서, 광역시 라벨도 충돌에서 뺐습니다.
지도를 지도답게
이제 정치 얘기는 그만하고, 지도를 지도답게 만드는 일이 남았습니다.

Basic 스타일은 z14 이상에서 1순위 POI 이름만 찍고 공원·학교 면이 없었습니다. OSM 타일에 있는 것들로 채웠습니다. 지하철역과 출입구, 공원·학교·병원 면, 75m 이상 건물, 랜드마크. 아이콘 대신 종류별로 글자색을 줬습니다(역 남색·공원 초록·학교 갈색). 드디어 여기가 어딘지 보입니다.

그 위에 OSM Bright에서 POI 아이콘과 토지이용, 물 이름만 골라 이식했습니다. Bright를 통째로 쓰지 않은 이유는 앞에서 본 그 도로 테두리 때문입니다. 다크용 아이콘은 명도를 뒤집어 따로 만들었습니다.

지하철은 따로 만들어야 했습니다. OpenMapTiles 스키마에는 역에 노선 정보가 없어서, OSM의 route 릴레이션에서 노선 색을 직접 읽어 역을 노선색 점으로, 선로를 노선색 선으로 그렸습니다. 같은 이름의 환승역은 승강장이 노선마다 떨어져 있어서 700m 안에서 묶었습니다.

이 지도는 차량 운행과 관계가 없다고 판단해서 국도 번호판은 지웠고, 휴대폰에서의 가시성을 위해 도로에 색 테두리는 넣지 않았습니다. 종로를 지나는 1·3·5호선이 이제 보입니다.

아파트는 한국 지도의 특수성입니다. OSM 건물 레이어에는 이름이 없지만 한국 OSM은 단지(21,038개)와 동(89,830개)이 두 층으로 들어 있습니다. 큰 단지부터 z14, 동 번호는 z17에 찍었습니다. 마지막으로 해상 경계(EEZ, NLL), DMZ 한계선, 작은 만·해협 이름처럼 줌을 빼면 국경을 덮는 것들을 정리했습니다.
5. 결과

세계. 메르카토르는 그대로입니다. 1절에서 그렇게 말해 놓고도 제 지도는 여전히 메르카토르인데, 웹 타일 지도가 그 위에서만 돌아가기 때문입니다. 한계를 알고 쓰는 것과 모르고 쓰는 것은 다르다고 생각합니다.

한반도. 북한, 대한민국, 일본, 그리고 여덟 도시가 함께 뜹니다.

서울. 지하철 노선이 노선색으로 깔려 있습니다.

종로. 역·공원·큰 건물·아파트가 있습니다. 첫 커밋의 회색 도로망과 비교해 보세요.

다크 테마의 서울. 사이트 테마를 바꾸면 지도도 같이 바뀝니다.

다크 테마의 종로. 라벨 > 도로 > 면의 순서가 밤에도 유지됩니다.
그리고 이것이 그 지도 위에 실제로 사진을 찍은 자리를 올린 것입니다. 이 블로그의 Maps 메뉴와 같은 것이고, 사진 페이지마다 맨 아래에 같은 지도가 붙습니다. 핀을 누르면 사진으로 갑니다.
여전히 OSM은 네이버나 카카오, 구글에 비해 부족합니다. 상호가 빠진 건물이 많고, 새로 생긴 길이 늦게 반영되고, 검색도 길찾기도 없습니다. 그래도 데이터 주권이 온전히 저에게 있는 지도를 만든 것 같아 뿌듯합니다. 이 지도에서 북한을 북한이라 부르는 것도, 광주를 광역시들과 같은 줌에 두는 것도, 국도 번호를 지운 것도 전부 제 결정이고, 마음이 바뀌면 커밋 하나로 되돌릴 수 있습니다. 관련 스크립트와 스타일 생성기는 정리해서 git으로 공개할 예정입니다.
6. 네이버도 OSM이었다
어제(8월 28일) 네이버 지도가 앱의 실험실 메뉴에 ‘세계지도’ 기능을 넣었습니다. 일본을 포함한 해외의 도로와 철도, 일부 장소가 보이고 철도 노선은 색으로 구분됩니다. 검색이나 길찾기는 아직 안 됩니다. 네이버 지도를 볼 때마다 일본과 중국이 휑해서 이상했는데 드디어 채워진 것도 신기했지만, 더 재미있었던 건 공식 발표는 없어도 사용자들이 “오픈스트리트맵 데이터로 보인다"고 바로 알아봤다는 점입니다. 저와 같은 재료를 쓰고 있었던 겁니다.
같은 자리를 나란히 놓고 보면 무엇이 같고 무엇이 다른지 보입니다.

네이버, 종로. 건물마다 상호가 붙어 있고 POI 아이콘이 종류별 색으로 깔려 있습니다. 큰길은 노란색으로 채워 위계가 한눈에 보이고, 피맛골·젊음의거리 같은 동네 이름, 경복궁·종묘 같은 랜드마크 아이콘이 있습니다. 지하철역은 노선 번호가 든 동그라미입니다. 이 밀도는 네이버가 직접 모은 데이터에서 나옵니다.

내 지도, 같은 자리. 도로망·지하철 노선·공원·큰 건물은 있습니다. 동 이름과 길 이름도 있습니다. 없는 것은 상호입니다 — OSM에 누가 적어 둔 가게만 나옵니다. 큰길을 노란색으로 채우지 않은 것은 휴대폰에서 핀이 잘 보이라고 일부러 뺀 것이고, 지하철역을 노선색 점으로 그린 것도 제 선택입니다. 뼈대는 거의 같고, 살이 적습니다.

네이버, 서울. 구 이름이 큰 글씨로, 지하철 노선은 역 아이콘까지 전부, 고속도로는 주황색입니다. 인왕산(339.8m)처럼 산 이름에 높이가 붙는 것은 네이버다운 디테일입니다.

내 지도, 서울. 노선색 지하철은 같은 그림입니다. 그런데 이 배율에서 제 지도는 “서울특별시” 하나 말고는 이름을 안 찍습니다 — 역 이름은 z12부터, 동 이름은 그보다 더 들어가야 나옵니다. 산도 없고 고속도로도 흰색입니다. 같은 도시가 이렇게 다르게 읽힙니다.

네이버 세계지도, 한반도. 이 화면이 제일 재미있었습니다. 네이버도 국호를 북한과 대한민국으로 씁니다. 저와 같은 선택입니다. 바다에는 동 해, 황해(서해), 남 해, 대한해협이라고 적혀 있고, 서해에는 NLL이 점선으로 그어져 있으며, 이 배율에서 울릉도 옆에 독도가 이름으로 찍혀 있습니다. 중국 도시는 칭다오·웨이하이·옌타이처럼 한글로, 일본 도시는 후쿠오카·나가사키로 나옵니다. 광주는 전남광주입니다. 하나하나가 “여기는 이렇게 부른다"는 결정입니다.

내 지도, 같은 자리. 북한·대한민국·서울특별시, 그리고 오사카. 여덟 도시는 한 단계 더 들어가야(z6) 나옵니다. 저는 바다 이름과 해상 경계, NLL을 지웠고 독도는 이 배율에서 이름을 안 붙였습니다 — 바다 위 표시가 국경을 덮는 것이 싫어서였는데, 네이버 화면을 보고 나니 그것도 선택이었다는 것을 알겠습니다. 동해라고 적는 것도, 아무것도 안 적는 것도 정치입니다.
그렇다면 네이버의 스타일을 잘 따라 하면 같은 지도를 만들 수 있을 텐데, 하는 생각이 들었습니다. 다만 같은 데이터에서 출발해도 같은 지도가 나오지는 않을 겁니다. 네이버는 네이버의 선택을 하고 저는 제 선택을 할 테니까요. 그리고 그 선택이 무엇인지 볼 수 있다는 것이, 남의 지도를 빌려 쓸 때는 없던 것입니다.
참고한 것들
- 아시아투데이, 네이버 지도 ‘세계지도’ 기능 등장…“신기하다” vs “정보 부정확” (2026-08-28)
- ZDNet Korea, 18년 끌어온 구글 지도 반출 논쟁…‘조건부 허가’로 마침표 (2026-02-27)
- 서울신문, 대한민국 첫 광역행정통합 ‘전남광주통합특별시’ 공식 출범 (2026-07-01)
- Slashdot / Reuters, African Union Urges Adoption of World Map Showing Continent’s True Size (2025-08)
- Britannica, Why Does Greenland Look So Big on Some Maps?
- 위키백과, 대동여지도 · 김정호
- 지도 데이터 © OpenStreetMap contributors, Natural Earth