@@ -4,117 +4,133 @@ category: guides
44order : 7
55---
66
7- ## 요약
7+ 0.2는 React 19 전용으로 재작성되었습니다.
88
9- 0.2는 React 19 전용으로 재작성되었습니다. 주요 변경 사항:
9+ ## React 19 필수
1010
11- - ** 이벤트** : ` <Listener> ` 컴포넌트 제거 → ` on* ` props (기본), ` useListener() ` 훅 (escape hatch)
12- - ** 인증 키** : ` ncpClientId ` (레거시) → ` ncpKeyId ` (표준)
13- - ** 오버레이** : ` <Overlay element={...}> ` 제거 → ` useOverlay() ` 훅
14- - ** CustomOverlay** : 신규 컴포넌트
15- - ** InfoWindow** : children 대신 ` content ` prop (문자열)
16- - ** Layer** : ` CadastralLayer ` , ` StreetLayer ` , ` TrafficLayer ` 신규
11+ ` peerDependencies ` 가 ` react@^19.0.0 ` 으로 변경되었습니다.
1712
1813## 인증 키
1914
20- ``` diff
21- - <NavermapsProvider ncpClientId="YOUR_KEY">
22- + <NavermapsProvider ncpKeyId="YOUR_KEY">
23- ```
15+ NCP 콘솔에서 발급받은 키를 ` ncpKeyId ` 로 전달합니다.
16+ 기존 ` ncpClientId ` 도 동작하지만, ` ncpKeyId ` 가 현재 NCP 표준입니다.
2417
25- ` ncpClientId ` , ` govClientId ` , ` finClientId ` 도 호환되지만, ` ncpKeyId ` 가 현재 표준입니다.
18+ ``` tsx
19+ <NavermapsProvider ncpKeyId = " YOUR_NCP_KEY_ID" >
20+ <Container style = { { width: ' 100%' , height: ' 400px' }} >
21+ <NaverMap
22+ defaultCenter = { { lat: 37.5666 , lng: 126.9784 }}
23+ defaultZoom = { 16 }
24+ />
25+ </Container >
26+ </NavermapsProvider >
27+ ```
2628
2729## 이벤트 핸들링
2830
29- 0.1의 ` <Listener> ` 컴포넌트가 제거되었습니다.
30- 표준 이벤트는 ` on* ` props로 처리합니다.
31-
32- ``` diff
33- - import { Marker, Listener } from 'react-naver-maps';
34- + import { Marker } from 'react-naver-maps';
35-
36- - <Marker position={pos}>
37- - <Listener type="click" listener={(e) => handleClick(e)} />
38- - </Marker>
39- + <Marker position={pos} onClick={(e) => handleClick(e)} />
40- ```
41-
42- ` on* ` props에 없는 이벤트(KVO changed, 생명주기 등)는 ` useListener() ` 훅을 사용합니다.
31+ ` <Listener> ` 컴포넌트가 제거되었습니다. ` on* ` props를 사용합니다.
4332
4433``` tsx
45- import { useListener , useMap } from ' react-naver-maps' ;
46-
47- const map = useMap ();
48- useListener (map , ' idle' , () => console .log (' idle' ));
34+ // Before (v0.1)
35+ <Marker position = { position } >
36+ <Listener type = " click" listener = { handleClick } />
37+ <Listener type = " rightclick" listener = { handleRightClick } />
38+ </Marker >
39+
40+ // After (v0.2)
41+ <Marker position = { position } onClick = { handleClick } onRightclick = { handleRightClick } />
4942```
5043
51- ## Overlay 컴포넌트
44+ ` on* ` props에 없는 이벤트(KVO changed, idle 등)는 ` useListener() ` 훅을 사용합니다.
5245
53- 0.1의 ` <Overlay element={...}> ` 컴포넌트가 제거되었습니다.
54- 네이티브 오버레이 인스턴스를 React에 연결하려면 ` useOverlay() ` 훅을 사용합니다.
46+ ``` tsx
47+ function IdleTracker() {
48+ const map = useMap ();
5549
56- ``` diff
57- - import { Overlay } from 'react-naver-maps';
58- - const [marker] = useState(() => new navermaps.Marker({ position }));
59- - <Overlay element={marker} />
50+ useListener (map , ' idle' , () => {
51+ console .log (' 지도 이동 완료' );
52+ });
6053
61- + import { useOverlay, useMap } from 'react-naver-maps';
62- + const map = useMap();
63- + const marker = useOverlay(() => new navermaps.Marker({ position, map }));
54+ return null ;
55+ }
6456```
6557
66- 공식 [ CustomOverlay 패턴] ( https://navermaps.github.io/maps.js.ncp/docs/tutorial-6-CustomOverlay.html ) (OverlayView 상속)도 ` useOverlay ` 로 연결할 수 있습니다.
67- 자세한 내용은 [ useOverlay API Reference] ( /react-naver-maps/api-references/use-overlay/ ) 를 참고하세요.
68-
69- ## InfoWindow
58+ ## 커스텀 오버레이
7059
71- 0.1에서 children으로 React 엘리먼트를 전달하던 방식은 더 이상 지원되지 않습니다 .
72- ` content ` prop에 HTML 문자열을 전달하세요 .
60+ ` <Overlay element={...}> ` + ` <Listener> ` 조합이 제거되었습니다 .
61+ ` useOverlay() ` + ` useListener() ` 훅으로 대체됩니다 .
7362
74- ``` diff
75- - <InfoWindow position={pos}>
76- - <div>정보</div>
77- - </InfoWindow>
78-
79- + <InfoWindow position={pos} content="<div>정보</div>" />
63+ ``` tsx
64+ // Before (v0.1)
65+ function MyCustomMarkers() {
66+ const navermaps = useNavermaps ();
67+
68+ const [marker1] = useState (
69+ () =>
70+ new navermaps .Marker ({
71+ position: { lat: 37.5666 , lng: 126.9784 },
72+ }),
73+ );
74+
75+ const marker2Ref = useRef (null );
76+ if (! marker2Ref .current ) {
77+ marker2Ref .current = new navermaps .Marker ({
78+ position: { lat: 37.5657 , lng: 126.9755 },
79+ });
80+ }
81+ const marker2 = marker2Ref .current ;
82+
83+ useListener (marker1 , ' click' , () => alert (' 서울시청' ));
84+
85+ return (
86+ <>
87+ <Overlay element = { marker1 } />
88+ <Overlay element = { marker2 } >
89+ <Listener type = " click" listener = { () => alert (' 덕수궁' )} />
90+ </Overlay >
91+ </>
92+ );
93+ }
94+
95+ // After (v0.2)
96+ function MyCustomMarkers() {
97+ const navermaps = useNavermaps ();
98+ const map = useMap ();
99+
100+ const marker1 = useOverlay (
101+ () =>
102+ new navermaps .Marker ({
103+ map ,
104+ position: { lat: 37.5666 , lng: 126.9784 },
105+ }),
106+ );
107+
108+ const marker2 = useOverlay (
109+ () =>
110+ new navermaps .Marker ({
111+ map ,
112+ position: { lat: 37.5657 , lng: 126.9755 },
113+ }),
114+ );
115+
116+ useListener (marker1 , ' click' , () => alert (' 서울시청' ));
117+ useListener (marker2 , ' click' , () => alert (' 덕수궁' ));
118+
119+ return null ;
120+ }
80121```
81122
82- React 컴포넌트를 렌더링해야 한다면 ` <CustomOverlay> ` 를 사용하세요.
83-
84- ## 스크립트 로딩
85-
86- ` loadNavermapsScript() ` 가 내부 전용으로 변경되었습니다.
87- Provider 외부에서 미리 로드하려면 ` preloadNavermaps() ` 를 사용합니다.
88-
89- ``` diff
90- - import { loadNavermapsScript } from 'react-naver-maps';
91- - await loadNavermapsScript({ ncpClientId: 'KEY' });
92-
93- + import { preloadNavermaps } from 'react-naver-maps';
94- + preloadNavermaps({ ncpKeyId: 'KEY' });
95- ```
123+ 네이버맵 공식 [ CustomOverlay 패턴] ( https://navermaps.github.io/maps.js.ncp/docs/tutorial-6-CustomOverlay.html ) (OverlayView 상속)도 동일하게 ` useOverlay ` 로 연결할 수 있습니다.
124+ 자세한 내용은 [ useOverlay API Reference] ( /react-naver-maps/api-references/use-overlay/ ) 를 참고하세요.
96125
97- ## 제거된 export 목록
126+ ## 제거된 API
98127
99128| 0.1 | 0.2 대체 |
100129| ---------------------------- | ------------------------------------- |
101- | ` <Listener> ` | ` on* ` props 또는 ` useListener() ` 훅 |
102130| ` <Overlay> ` | ` useOverlay() ` 훅 |
103- | ` EventTargetContext ` | 내부 전용 |
104- | ` useContainerContext() ` | 내부 전용 |
131+ | ` <Listener> ` | ` on* ` props 또는 ` useListener() ` 훅 |
132+ | ` useListener() ` (0.1 버전) | ` useListener() ` (콜백 안정화 개선) |
133+ | ` EventTargetContext ` | 제거 |
134+ | ` useContainerContext() ` | 제거 |
105135| ` loadNavermapsScript() ` | ` preloadNavermaps() ` |
106136| ` RenderAfterNavermapsLoaded ` | ` <NavermapsProvider> ` + ` <Container> ` |
107-
108- ## 신규 API
109-
110- | API | 설명 |
111- | -------------------- | ------------------------------------------ |
112- | ` useOverlay() ` | 네이티브 오버레이를 React 생명주기에 연결 |
113- | ` useListener() ` | 네이티브 이벤트 escape hatch |
114- | ` <CustomOverlay> ` | React children을 지도 좌표에 Portal 렌더링 |
115- | ` <CadastralLayer> ` | 지적도 레이어 |
116- | ` <StreetLayer> ` | 거리뷰 레이어 |
117- | ` <TrafficLayer> ` | 실시간 교통 레이어 |
118- | ` preloadNavermaps() ` | Provider 외부에서 스크립트 미리 로드 |
119- | ` useKVO() ` | KVO 속성 감시 |
120- | ` useControlledKVO() ` | controlled 패턴 KVO 동기화 |
0 commit comments