๐Ÿ—บ React Kakao Map SDK ์‚ฌ์šฉํ•˜๊ธฐ

์ง€์€ยท2023๋…„ 1์›” 11์ผ
13
post-thumbnail

React Kakao Map SDK

: Kakao Maps API๋ฅผ react์— ๋งž๊ฒŒ ํฌํŒ…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
ReactKakaoMapSKD

1. ์„ค์น˜

npm install react-kakao-maps-sdk

2. <script> ํƒœ๊ทธ ์ถ”๊ฐ€

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ Kakao Maps API๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.
API ํ‚ค ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋ฒ•

<script
  type="text/javascript"
  src="//dapi.kakao.com/v2/maps/sdk.js?appkey=๋ฐœ๊ธ‰๋ฐ›์€ APP KEY"
></script>

๋งต ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

import { Map } from 'react-kakao-maps-sdk';

const App = () => {
	return (
      <Map 
        center={{ lat: 33.5563, lng: 126.79581 }}   // ์ง€๋„์˜ ์ค‘์‹ฌ ์ขŒํ‘œ
        style={{ width: '800px', height: '600px' }} // ์ง€๋„ ํฌ๊ธฐ
        level={3}                                   // ์ง€๋„ ํ™•๋Œ€ ๋ ˆ๋ฒจ
      >
      </Map>);
};


๋งต ์œ„์— ๋งˆ์ปค ํ‘œ์‹œํ•˜๊ธฐ

import { Map, MapMarker } from 'react-kakao-maps-sdk';

const App = () => {
	return (
		<Map 
          center={{ lat: 33.5563, lng: 126.79581 }} 
          style={{ width: '800px', height: '600px' }}
          level={3} 
        >
			<MapMarker position={{ lat: 33.55635, lng: 126.795841 }}> </MapMarker> // ๋งˆ์ปค ์ขŒํ‘œ
		</Map>
	);
};


๋งˆ์ปค ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œํ•˜๊ธฐ

import { Map, MapMarker } from 'react-kakao-maps-sdk';

const App = () => {
	const locations = [
		{ title: '์นด์นด์˜ค', latlng: { lat: 33.450705, lng: 126.570677 } },
		{ title: '์ƒํƒœ์—ฐ๋ชป', latlng: { lat: 33.450936, lng: 126.569477 } },
		{ title: 'ํ…ƒ๋ฐญ', latlng: { lat: 33.450879, lng: 126.56994 } },
		{ title: '๊ทผ๋ฆฐ๊ณต์›', latlng: { lat: 33.451393, lng: 126.570738 } },
	];

	return (
		<Map center={{ lat: 33.450701, lng: 126.570667 }} style={{ width: '800px', height: '600px' }} level={3}>
			{locations.map((loc, idx) => (
				<MapMarker
					key={`${loc.title}-${loc.latlng}`}
					position={loc.latlng}
					image={{
						src: 'https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/markerStar.png',
						size: { width: 24, height: 35 },
					}}
					title={loc.title}
				/>
			))}
		</Map>
	);
};


๋งต ์œ„์— ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด ํ‘œ์‹œํ•˜๊ธฐ

import { Map, CustomOverlayMap } from 'react-kakao-maps-sdk';

const App = () => {
	return (
		<Map 
          center={{ lat: 33.5563, lng: 126.79581 }} 
          style={{ width: '800px', height: '600px' }}
          level={3} 
        >
			<CustomOverlayMap position={{ lat: 33.55635, lng: 126.795841 }}>
				<div className='overlay'>Here!</div>
			</CustomOverlayMap>
		</Map>
	);
};


์ง€๋„ ํ™•๋Œ€/์ถ•์†Œ ๋ฒ„ํŠผ

import './App.css';
import React, { useState } from 'react';
import { Map, CustomOverlayMap } from 'react-kakao-maps-sdk';

const App = () => {
	const [level, setLevel] = useState(3);
	return (
		<Map 
          center={{ lat: 33.5563, lng: 126.79581 }} 
          style={{ width: '800px', height: '600px' }} 
          level={level}
        >
			<CustomOverlayMap position={{ lat: 33.55635, lng: 126.795841 }}>
				<div className='overlay'>Here!</div>
			</CustomOverlayMap>
			<button onClick={() => setLevel(level + 1)}>-</button>
			<button onClick={() => setLevel(level - 1)}>+</button>
		</Map>
	);
};


Geolocation API

: ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” API
๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ„์น˜ ์ •๋ณด์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๋ฐ›์€ ํ›„ ์œ„์น˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Geolocation.getCurrentPosition() : ๊ธฐ๊ธฐ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์†Œ๋“œ
  • Geolocation.watchPosition() : ๊ธฐ๊ธฐ์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค, ์ƒˆ๋กœ์šด ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

geolocation์œผ๋กœ ํ˜„์žฌ ์œ„์น˜ ๋งˆ์ปค ํ‘œ์‹œํ•˜๊ธฐ

import React, { useState, useEffect } from 'react';
import { Map, MapMarker } from 'react-kakao-maps-sdk';

const App = () => {
	const [location, setLoacation] = useState(null); // ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•  ์ƒํƒœ

	useEffect(() => {
		navigator.geolocation.getCurrentPosition(successHandler, errorHandler); // ์„ฑ๊ณต์‹œ successHandler, ์‹คํŒจ์‹œ errorHandler ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
	}, []);

	const successHandler = (response) => {
		console.log(response); // coords: GeolocationCoordinates {latitude: ์œ„๋„, longitude: ๊ฒฝ๋„, โ€ฆ} timestamp: 1673446873903
		const { latitude, longitude } = response.coords;
		setLoacation({ latitude, longitude });
	};

	const errorHandler = (error) => {
		console.log(error);
	};

	return (
		<>
			{location && (
				<Map 
                  center={{ lat: location.latitude, lng: location.longitude }} 
                  style={{ width: '800px', height: '600px' }} 
                  level={3}
                >
					<MapMarker position={{ lat: location.latitude, lng: location.longitude }} />
				</Map>
			)}
		</>
	);
};


*์ž„์˜์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค


ํ˜„์žฌ ์œ„์น˜ ์ขŒํ‘œ๊ฐ’ ์–ป๊ธฐ

useRef()๋ฅผ ์‚ฌ์šฉํ•ด Map ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ , ref ๊ฐ์ฒด์˜ current ๊ฐ’์— ์ ‘๊ทผํ•ด ํ•ด๋‹น Map ๊ฐ์ฒด์˜ ์ค‘์‹ฌ ์ขŒํ‘œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

import React, { useState, useRef } from 'react';
import { Map, MapMarker } from 'react-kakao-maps-sdk';

const App = () => {
	const [coordinates, setCoordinates] = useState(null); // ํ˜„์žฌ ์œ„์น˜์˜ ์ขŒํ‘œ๊ฐ’์„ ์ €์žฅํ•  ์ƒํƒœ
	const mapRef = useRef();

	const getCoordinates = () => {
		const map = mapRef.current;

		setCoordinates({
			center: {
				lat: map.getCenter().getLat(),
				lng: map.getCenter().getLng(),
			},
		});
	};

	return (
		<>
			<Map 
              center={{ lat: 37.5566803113882, lng: 126.904501286522 }} 
              style={{ width: '800px', height: '600px' }} 
              level={3} 
              ref={mapRef}
            >
				<MapMarker position={{ lat: 37.5566803113882, lng: 126.904501286522 }} />
				<button onClick={getCoordinates}>ํ˜„์žฌ ์œ„์น˜ ์ขŒํ‘œ ์–ป๊ธฐ</button>
			</Map>

			{coordinates && (
				<div>
					ํ˜„์žฌ ์œ„์น˜์˜ ์ขŒํ‘œ๋Š”..
					<p>์œ„๋„ : {coordinates.center.lat}</p>
					<p>๊ฒฝ๋„ : {coordinates.center.lng}</p>
				</div>
			)}
		</>
	);
};


์ขŒํ‘œ๊ฐ’์œผ๋กœ ์ฃผ์†Œ ์–ป๊ธฐ

<script> ํƒœ๊ทธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

<script> ํƒœ๊ทธ์— &libraries=services๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

<script
  type="text/javascript"
  src="//dapi.kakao.com/v2/maps/sdk.js?appkey=๋ฐœ๊ธ‰๋ฐ›์€ APP KEY&libraries=services"></script>

const { kakao } = window; ์ถ”๊ฐ€

React์—์„œ Kakao Maps API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด window.kakao๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ,
์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์ผ์ผํžˆ window.๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

import React, { useState } from 'react';
import { Map, MapMarker } from 'react-kakao-maps-sdk';

const App = () => {
	const { kakao } = window;
	const [address, setAddress] = useState(null); // ํ˜„์žฌ ์ขŒํ‘œ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ƒํƒœ

	const getAddress = (lat, lng) => {
		const geocoder = new kakao.maps.services.Geocoder(); // ์ขŒํ‘œ -> ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฐ์ฒด
		const coord = new kakao.maps.LatLng(37.5566803113882, 126.904501286522); // ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•  ์ขŒํ‘œ ์ž…๋ ฅ
		const callback = function (result, status) {
			if (status === kakao.maps.services.Status.OK) {
				setAddress(result[0].address);
			}
		};
		geocoder.coord2Address(coord.getLng(), coord.getLat(), callback);
	};

	return (
		<>
			<Map center={{ lat: 37.5566803113882, lng: 126.904501286522 }} style={{ width: '800px', height: '600px' }} level={3}>
				<MapMarker position={{ lat: 37.5566803113882, lng: 126.904501286522 }} />
				<button onClick={getAddress}>ํ˜„์žฌ ์ขŒํ‘œ์˜ ์ฃผ์†Œ ์–ป๊ธฐ</button>
			</Map>

			{address && (
				<div>
					ํ˜„์žฌ ์ขŒํ‘œ์˜ ์ฃผ์†Œ๋Š”..
					<p>address_name: {address.address_name}</p>
					<p>region_1depth_name: {address.region_1depth_name}</p>
					<p>region_2depth_name: {address.region_2depth_name}</p>
					<p>region_3depth_name: {address.region_3depth_name}</p>
				</div>
			)}
		</>
	);
};

profile
๋ธ”๋กœ๊ทธ ์ด์ „ -> https://janechun.tistory.com

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 8์›” 24์ผ

์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ