React Gatsby로 카카오 맵 API를 사용하려고 합니다.
몆일동안 , static, require(), dangerouslySetInnerHTML, gatsby-ssr.js, setHeadComponents, useEffect() 등 수많은 조언을 받았으나 다 되지 않았습니다.
가능하면 작동되는 React로 카카오 맵API를 사용한 코드를 공유 부탁드립니다. 염치없지만, 워낙 버그가 많아서 그냥 버그없이 작동되는 코드가 절실히 필요합니다.
사실 도지님의 예전 글을 보고 따라했으나, 에러가 났던 기억이 납니다.
다시보니 여기선 HTML을 부르는 템플릿 페이지에 script를 넣으라고 하셨네요.
저 또한 같은방법으로 해결했습니다. 다만 전 componentDidMount()부분을 useEffect() 로 대신했습니다.
React는 View를 효율적으로 그리기 위해 사용하는 라이브러리(어떤 관점에서는 프레임워크) 입니다.
그래서 React는 컴포넌트 개념을 만들었습니다. 이것은 화면에 직접 그려질 요소들을 추상화 한 개념인데,
이 컴포넌트는 실제 문서에 표현되는 HTML DOM Element가 아니며 가상의 DOM Element를 의미합니다.
제가 동작하지 않는 확률을 언급한 이유는,
React가 결국 이 가상 DOM을 render() 함수를 통해 실제 DOM을 생성/조작 하여 DOM Tree에 반영하는데
third party 라이브러리를 불러오는 스크립트 태그를 JSX로 넣어줘도
React 구조의 이해 없이 사용하는 기본적인 기능만으로는 처리하기 힘들기 때문입니다.
불러오려는 스크립트 내용이 어떻게 구성되어 있느냐에 따라서 더 복잡해 질 수 있고요.
실제로도 별다른 트릭 사용(실제 DOM Ref를 가져와 라이프사이클에 맞게 조작) 이나
특정 스크립트 로딩 모듈의 도움을 받지 않고 않고 질문하신대로만 쓰면 제대로 동작하지 않고요.
정확하게 왜 그런지 확인하고 싶으시면 React 공식 문서를 살펴보시길 바랍니다.
autoload=false 파라메터는 카카오 지도 JS SDK에서 제공해주는 기능이며
지도가 필요한 상황에서 비동기로 스크립트를 로딩하여 쓸 수 있게 해 줍니다.
JSX로 스크립트 태그(script src)를 쓰는 방식은
React가 render() 시점에 실제 DOM에 엘리먼트를 만들어 잘 반영한다 해도
스크립트 내용이 모두 다운로드 되고 실행이 끝난 시점을 알기 힘들기 때문에
특정 라이프 사이클 hook에서 일반적으로 알려진 비동기 스크립트 로딩 방식으로 처리를 하는 것이 편합니다.
하지만 카카오 지도 SDK는 로딩 구조상 일반적읜 비동기 스크립트 로딩 방식을 사용하면
정확히 사용 가능한 시점을 컨트롤 하기 힘들기 때문에
특별히 다음과 같은 방식으로 카카오 SDK에서 사용할 수 있도록 지원하고 있습니다.