React와 OpenCage API를 활용한 역지오코딩 구현기 🚀

ZENMA·2024년 12월 23일

"위치를 알면 주소를 알 수 있다! React와 OpenCage API를 활용한 역지오코딩 기술 구현을 소개함."


프로젝트 개요와 역지오코딩의 필요성

프로젝트 개요 🛠

사이트에서 사용자 현재 위치를 기반으로 지역 정보를 설정하는 기능을 구현. 이를 통해 사용자 경험(UX)을 향상시키는 것이 목표.

역지오코딩의 필요성 🌍

  • 위치 기반 서비스(지도, 검색, 날씨 앱 등)에 필수.
  • 사용자 위치를 지역 정보로 변환해 맞춤형 서비스를 제공 가능.

역지오코딩의 기본 개념 🌐

지오코딩 vs 역지오코딩

개념설명
지오코딩주소를 좌표(위도, 경도)로 변환
역지오코딩좌표(위도, 경도)를 주소로 변환

역지오코딩 활용 사례

  • 지도 서비스(Google Maps)
  • 위치 기반 검색(네이버 플레이스)
  • 날씨 정보 제공(AccuWeather)

사용한 기술 스택 💻

  • React: 컴포넌트 기반 UI 개발.
  • OpenCage Geocoding API: 좌표를 주소로 변환.
  • Axios: HTTP 요청 처리.
  • React Spinners: 로딩 인디케이터.
  • React Router: 클라이언트 사이드 라우팅.

역지오코딩 구현 과정 🔧

1. OpenCage Geocoding API 설정

API 키 발급

  1. OpenCage 데이터 계정 생성.
  2. API 키 발급 후 프로젝트에 환경 변수로 저장.

API 요청 방식

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);
  }
};

2. Location.js 컴포넌트 구현

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;

주요 구현 내용 ✍️

  1. Geolocation API 사용:
    • 사용자 위치(위도, 경도) 가져오기.
  2. OpenCage API 호출:
    • 좌표를 주소로 변환해 지역 정보 추출.
  3. 상태 관리:
    • React useState로 로딩 및 오류 상태 관리.
  4. React Router 연동:
    • 지역 정보를 URL 파라미터로 추가해 상태 공유.

배운 점 📚

  1. 비동기 처리: API 호출과 상태 업데이트 간의 흐름을 효율적으로 관리하는 방법.
  2. 에러 처리: 사용자에게 명확한 피드백을 제공하는 UI의 중요성.
  3. 로컬 스토리지 활용: 지역 정보를 캐싱해 불필요한 API 호출 방지.

구현 결과 🎉

  • 사용자 현재 위치 기반 지역 정보 설정.
  • 브라우저 권한 설정 안내로 UX 개선.
  • 로컬 스토리지를 활용한 성능 최적화.

참고 자료 📖

질문이나 의견은 댓글✌️

profile
개발하면서 습득한 지식 끄적끄적✍️

0개의 댓글