• 티스토리 홈
  • 프로필사진
    redpome
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
redpome
  • 프로필사진
    redpome
    • 분류 전체보기 (50)
      • 내일배움캠프 (23)
      • 웹개발 지식 (2)
      • 프로그래머스 (8)
      • React (7)
      • 코딩테스트 (1)
      • UI-UX (1)
      • 타입스크립트 (2)
      • Next.js (3)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 아웃소싱 프로젝트 - (1)
        2025년 02월 27일
        • redpome
        • 작성자
        • 2025.02.27.:11

        아웃소싱 프로젝트를 통해 외부 API를 사용하여 카카오맵과 유튜브 API를 연결시키고 지도상에서 장소와 관련된 영상을 제공해주는 서비스를 기획하게되었다.

         

        맡은 역할

        아직까지 정해야할 사항은 많지만 우선은 카카오맵 API를 사용하여 지도 API 구성을 맡았다. 공식문서에서 제공하는 것을 최대한 끌어와서 다양한 기능을 쓸 수 있도록해야한다. 지난 번의 팀 프로젝트에서 외부 API를 끌고와서 사용하는 것이 실패한 나머지 이번에는 제대로 API를 쓸 수 있도록해야겠다.

         

        카카오맵 API 호출

        공식문서에서는 자바스크립트를 통해 카카오맵 API를 사용하고 있지만 이걸 리액트로 사용하기 위해서는 useEffect를 이용하여 컴포넌트가 마운트 될 시 동적으로 API를 로드한 후에 실행이 필요하다.

         

        현재 프로젝트는 Vite 기반으로 리액트 프로젝트를 구성했고 공식문서에서는 이하의 코드를 index.html에 추가하는 것을 나타낸다.

         

        <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은 APP KEY를 넣으시면 됩니다."></script>

         

        그 외의 카카오맵의 공식 문서에서 제공하는 환경설정을 따라서 API 키를 발급받고, 앱에서 등록을 했다.

        현재 로컬 환경에서 작동하고 있으므로 로컬호스트의 도메인을 프로젝트로 등록했다.

        (2025년 2월 27일의 공식문서 기준을 따르고 있습니다)

         

         

        문제는 리액트에서의 적용이다, 우선적으로 API 호출을 목표로 하였고 다음의 코드를 통해 테스트 페이지에서 API를 호출할 수 있었다.

        import { useEffect } from 'react';
        
        function KakaoMap() {
          useEffect(() => {
            if (window.kakao && window.kakao.maps) {
              const container = document.getElementById('map');
              const options = {
                center: new window.kakao.maps.LatLng(37.365264512305174, 127.10676860117488),
                level: 3,
              };
              const map = new window.kakao.maps.Map(container, options);
              console.log(map);
            } else {
              console.error('카카오맵 API가 로드되지 않았습니다.');
            }
          }, []);
          return (
            <div>
              <div id='map' style={{ width: '500px', height: '400px' }}></div>
            </div>
          );
        }
        
        export default KakaoMap;

         

        window API를 사용하는 것을 볼 수 있는데 API 키를 통해 카카오 서버로 요청을 보내면 나는 window.kakao 라는 객체를 받는 것이다.

        window.kakao = window.kakao || {},
        window.kakao.maps = window.kakao.maps || {},
        window.daum && window.daum.maps ? window.kakao.maps = window.daum.maps : (window.daum = window.daum || {},
        window.daum.maps = window.kakao.maps),
        function() {
        ...

        위의 코드는 개발자 도구의 네트워크 탭을 통해 서버로부터 받은 코드이다.

        카카오맵의 라이브러리를 동적으로 로드하고 window.kakao를 통해 window.kakao.map을 통해 객체를 다룰 수 있게된다.

         

        따라서 나는 여기에서 해당 코드의 window.kakao 객체를 다루는 것이다.

         

        코드 설명

         

        ...
          useEffect(() => {
            if (window.kakao && window.kakao.maps) {
              const container = document.getElementById('map');
        ...

         

        먼저 컴포넌트 마운트가 성공하면 'map' 아이디를 가진 DOM 요소를 container로 지정한다. 이 방식은 DOM 직접 제어하는 안티 패턴으로 일반적으로 useRef를 이용하여 접근하는 것을 권장하고있다.

        따라서 useRef를 통해 다음과 같이 코드를 수정했다.

        import { useEffect, useRef } from 'react';
        
        function KakaoMap() {
          const mapContainer = useRef(null);
          useEffect(() => {
            if (window.kakao && window.kakao.maps) {
              const options = {
                center: new window.kakao.maps.LatLng(37.365264512305174, 127.10676860117488),
                level: 5,
              };
              const map = new window.kakao.maps.Map(mapContainer.current, options);
        
            } else {
              console.error('카카오맵 API가 로드되지 않았습니다.');
            }
          }, []);
          return (
            <div>
              <div id='map' ref={mapContainer} style={{ width: '500px', height: '400px' }}></div>
            </div>
          );
        }
        
        export default KakaoMap;

         

        차이점은 맵을 담는 container를 mapContainer로 바꾸었고 useEffect의 외부에서 선언했다는 것이다.

        useRef는 리렌더링이 될 때 값이 초기화되지 않는다. 일단 나는 맵에서의 마커를 통해 클릭 이벤트를 구현하는 것을 목표로 하고있다.

        만약에 컴포넌트에서 어떤 상태가 변경되어 리렌더링이 일어난다면 맵도 초기화 될 것이다. 아직까지는 어떤 식으로 코드가 작성될지 모르므로 상태 변경을 통한 리렌더링 시 지도가 리렌더링이 일어나는 것을 방지하여 위와 같이 useRef를 썼다고 할 수 있다.

         

        세부 설정

        ...
              const options = {
                center: new window.kakao.maps.LatLng(37.365264512305174, 127.10676860117488),
                level: 5,
              };
              const map = new window.kakao.maps.Map(mapContainer.current, options);
        ...

         

        options는 지도 API의 설정을 담당한다. Center 는 지도 중심 좌표를 의미하는 필수 값이며 LatLng은 위도,경도를 뜻한다.

        level은 지도의 확대 수준을 의미한다.

         

        window.kako.maps는 카카오맵의 모든 기능을 담고있는 최상위 객체로 지도와 관련된 기능을 제공하는 라이브러리라 할 수 있다

         

        객체 역할
        kakao.maps.Map 지도 생성
        kakao.maps.Marker 지도 위에 마커를 표시
        kakao.maps.InfoWindow 마커 클릭 시 정보 표시
        kakao.maps.LatLng 지도에서 특정 좌표를 나타냄
        kakao.maps.services.Places 장소 검색 기능
        kakao.maps.event 지도에서 이벤트 핸들링

         

        위의 표에 따르면 kakao.maps.Map은 실제 지도 객체를 생성하는 클래스라고 할 수 있다.

        그래서 new 객체 생성자를 통해 지도 인스턴스를 만들은 것을 알 수 있다.

         

        • window.kakao.maps => 카카오맵 기능 모음 라이브러리 
        • window.kakao.maps.Map() => 실제 지도 생성 객체

        '내일배움캠프' 카테고리의 다른 글

        롤 챔피언 정보 프로젝트 - (1)  (0) 2025.03.11
        아웃소싱 프로젝트 - (2)  (0) 2025.03.05
        MBTI 프로젝트 -(1):json-server와의 통신  (0) 2025.02.24
        TanstackQuery - (1)  (0) 2025.02.20
        뉴스피드 프로젝트 - (2)  (0) 2025.02.19
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바