"위치를 알면 주소를 알 수 있다! React와 OpenCage API를 활용한 역지오코딩 기술 구현을 소개함."
사이트에서 사용자 현재 위치를 기반으로 지역 정보를 설정하는 기능을 구현. 이를 통해 사용자 경험(UX)을 향상시키는 것이 목표.
| 개념 | 설명 |
|---|---|
| 지오코딩 | 주소를 좌표(위도, 경도)로 변환 |
| 역지오코딩 | 좌표(위도, 경도)를 주소로 변환 |
const fetchRegion = async (latitude, longitude) => {
try {
const response = await axios.get('https://api.opencagedata.com/geocode/v1/json', {
params: {
key: process.env.REACT_APP_OPENCAGE_API_KEY,
q: `${latitude}+${longitude}`,
pretty: 1,
no_annotations: 1,
language: 'ko',
},
});
return response.data;
} catch (error) {
console.error('API 호출 실패:', error);
}
};
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import { ClipLoader } from 'react-spinners';
import { useNavigate } from 'react-router-dom';
const LocationSetter = ({ setRegion }) => {
const [loading, setLoading] = useState(true);
const [error, setError] = useState(false);
const navigate = useNavigate();
const fetchRegion = async (latitude, longitude) => {
try {
const response = await axios.get('https://api.opencagedata.com/geocode/v1/json', {
params: {
key: process.env.REACT_APP_OPENCAGE_API_KEY,
q: `${latitude}+${longitude}`,
language: 'ko',
},
});
const region = response.data.results[0]?.components.city;
if (region) {
setRegion(region);
localStorage.setItem('userRegion', region);
navigate(`/?in=${encodeURIComponent(region)}`, { replace: true });
} else {
setError(true);
}
} catch (err) {
console.error('역지오코딩 실패:', err);
setError(true);
} finally {
setLoading(false);
}
};
const getLocation = () => {
if (!navigator.geolocation) {
setError(true);
return;
}
navigator.geolocation.getCurrentPosition(
(position) => {
fetchRegion(position.coords.latitude, position.coords.longitude);
},
() => setError(true),
{ enableHighAccuracy: true }
);
};
useEffect(() => {
getLocation();
}, []);
if (loading) return <ClipLoader color="#3b82f6" loading={true} size={50} />;
if (error) return <p>위치 정보를 가져올 수 없습니다.</p>;
return null;
};
export default Location;
useState로 로딩 및 오류 상태 관리.질문이나 의견은 댓글✌️