Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

AI가 번역한 다른 언어 보기

뚠뚠멍의 생각들

리액트 - kakao is not defined 어떻게 해결하는게 좋을까

  • 작성 언어: 한국어
  • 기준국가: 모든 국가 country-flag

언어 선택

  • 한국어
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

durumis AI가 요약한 글

  • React 18 환경에서 카카오 맵 API를 사용 시, 전역 객체에 직접 접근하지 않아 지도가 렌더링되지 않는 문제 발생.
  • 컴포넌트 바깥에서 kakao 객체를 선언하거나, 커스텀 훅을 사용하여 캡슐화 및 모듈성을 유지하는 것이 해결책.
  • 리액트는 컴포넌트 독립성, 성능 및 유지보수를 위해 중앙 상태 관리를 권장하며, 서버 사이드 렌더링 환경에서는 window 객체 접근에 유의해야 함을 알게 되었습니다.
  • 문제
  • 해결
  • 이유
  • 소감


문제

React 18, create-react-app환경에서 카카오 맵 API를 연동하는 도중, 지도가 렌더링 되지 않았다!

head 태그 내에 스크립트 태그를 삽입하였으니, 브라우저가렌더링 되기 전에 로드될 것으로 생각하였다.

** html을 작성했는데 안 보이네요!!

~대충 index.html의 head 태그 안에 카카오맵을 불러 온다는 코드~

<!-- index.html -->
 
<head>
    <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=%REACT_APP_API_KEY%&libraries=services,clusterer,drawing" id="map-lib"></script>
</head>

useEffect(() => {
    // map 불러오기    
}, []}


그러나 console에는 kakao is not defined만 기록될 뿐 아무것도 렌더링 되지 않았다.


해결

기초 : 리액트의 컴포넌트는 전역 객체에 직접 접근하지 않는다.


해결방안1-1

컴포넌트 함수 바깥에 전역객체로부터 kakao 속성을 뽑아 선언한다.

const { kakao } = window;

function Map() {
    //...
}


해결방안1-2

카카오 맵을 렌더링할 때 필요한 함수들을 별도의 커스텀 훅으로 작성한다.

//hooks/useKakaoMap.js

const { kakao } = window;

function useKakaoMap() {
    const initializeMap = useCallback(() => {
        const container = document.getElementById('map');
        const options = {
        center: new kakao.maps.LatLng(33.450701, 126.570667),
            level: 3
        };
        const newMap = new kakao.maps.Map(container, options);
        setMap(newMap);
    }, []);

    //...    
    
    return {
        initializeMap
    }
}

export default useKakaoMap;

//Map.js

function Map() {
    
    const {
        initializeMap,
    } = useKakaoMap();
    
    useEffect(() => {
        initializeMap();
    }, [initializeMap]);
    
    
    return(
     <div id="map"></div>
    
    )
    
}



드래그 이벤트, 클릭 이벤트, 마커 핸들링 등 일반적으로 지도의 필요한 기능들은

컴포넌트 내에 구현하는 것보다,

커스텀 훅으로 분리하는 것이 재사용성이나 가독성 측면에서 좋다.


이유

리액트에서 전역객체에 접근하지 않는 이유 - 리액트의 컨셉에 대해서 이해할 필요가 있다.


1) 캡슐화와 모듈성

- 각 컴포넌트는 독립적이고 재사용 가능해야 한다. 수많은 컴포넌트에서 전역객체에 의존하면 독립성을 잃어버리고, 굉장히 복잡해질 것이다.


2) 성능과 쉬운 유지보수

- 리액트는 상태가 변하면 재렌더링 하는데, 전역객체는 상태 변화를 추적하기 적합하지 않다.


3) 상태관리는 중앙에서

- 그럼에도 여러 변수를 공유하려면 Redux와 같은 중앙 상태 관리 라이브러리를 사용한다.

중앙 -> 컴포넌트로 데이터 흐름을 제어하여 에러를 피하고 유지보수를 쉽게 한다.


* 서버 사이드 렌더링

최근에는 SEO(검색엔진 노출 최적화)를 위해 서버 사이드 렌더링이 많이 사용되고 있는데, window 객체는 서버 사이드에서 접근할 수 없다!!


소감

첫 리액트 프로젝트를 하면서 겪었던 시행착오입니다.

vue로 실무를 2년 넘게 했는데, 리액트 프로젝트를 시작하면서

카카오 맵을 띄우지 못해 상당히 당황했습니다...!!!


vue에 비하면 폴더 구조나 훅 등 조금 자유로운 느낌이 있어 오히려 어렵습니다.

어떻게 작성하는 것이 효율적일까? 생각을 많이 하게 됩니다.

토이 프로젝트, 말 그대로 장난감처럼 다루면서 조금 더 익혀야 겠습니다.


* 블로그는 처음인데, 두루미스 상당히 독특하고 재미있습니다.

한국인이 좋아하는 3줄 요약도 해주고요 ㅋㅋ

해외 개발자 분들도 만날 수 있지 않을까요?

코드 에디터는 조금 개선되었으면 좋겠네요


의견 교류, 지적 환영합니다~!

행복한 하루 보내세요!




뚠뚠멍
뚠뚠멍의 생각들
뚠뚠멍의 생각들
뚠뚠멍
CSS의 기본 규칙 (Normal flow, BFC, IFC) CSS의 기본 규칙인 Normal flow, BFC, IFC에 대해 설명하며 레이아웃 구성 및 반응형 디자인에 필요한 지식을 제공합니다.

2024년 9월 7일

[React Hook] useState React Hook useState의 작동 방식과 리렌더링 스코프, 상태값 유지 방법을 설명하며, 내부 구현 방식까지 살펴봅니다.
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

2024년 3월 14일

기술 기업은 어떻게 '메타버스'를 준비할 수 있을까? 엘든링 게임 유저의 영웅적 행동을 통해 메타버스 구현 시 기술적 성취뿐 아니라 유저와의 의미있는 관계 형성이 중요함을 시사합니다.
Byungchae Ryan Son
Byungchae Ryan Son
엘든링 게임 유저의 영웅적 행동을 통해 메타버스 구현 시 기술적 성취뿐 아니라 유저와의 의미있는 관계 형성이 중요함을 시사합니다.
Byungchae Ryan Son
Byungchae Ryan Son

2024년 5월 8일

한국투자증권 API 개발 시행착오에 대한 기록 한국투자증권 API를 활용한 자동매매 프로그램 개발 과정에서 겪은 시행착오와 해결 과정을 기록한 글입니다. 웹소켓 활용, 매매 방법론 설정 등의 어려움을 솔직하게 공유하며 개발 의뢰도 받습니다.
(로또 사는 아빠) 살림 하는 엄마
(로또 사는 아빠) 살림 하는 엄마
한국투자증권 API를 활용한 자동매매 프로그램 개발 과정에서 겪은 시행착오와 해결 과정을 기록한 글입니다. 웹소켓 활용, 매매 방법론 설정 등의 어려움을 솔직하게 공유하며 개발 의뢰도 받습니다.
(로또 사는 아빠) 살림 하는 엄마
(로또 사는 아빠) 살림 하는 엄마

2024년 4월 23일

[Java] Reflection 개념 및 사용 방법 Java 리플렉션은 힙에 로드된 클래스 정보를 통해 객체 생성, 필드 및 메소드 접근을 가능하게 하는 API입니다. 스프링 프레임워크 등에서 객체 생성 및 의존성 주입에 활용됩니다.
제이온
제이온
제이온
제이온

2024년 4월 25일

5월 1주차 스타트업 소식 및 일정 정리 5월 1주차 스타트업 소식을 정리한 내용으로, 투자 유치, 성과 지표, 출시/업데이트, 업계 동향 등을 담고 있습니다.
스타트업 커뮤니티 씬디스 (SeenThis.kr)
스타트업 커뮤니티 씬디스 (SeenThis.kr)
스타트업 커뮤니티 씬디스 (SeenThis.kr)
스타트업 커뮤니티 씬디스 (SeenThis.kr)

2024년 4월 30일