Skip to content

Commit e7d21b1

Browse files
zeakdclaude
andauthored
docs: 마이그레이션 문서 개선 (#145)
- Before (v0.1) / After (v0.2) 표기로 이전/현재 명확히 구분 - 이벤트 비교를 같은 수준으로 수정 - 불필요한 섹션 제거, 신규 기능 소개 제거 - 커스텀 오버레이 비교를 실제 v0.1 코드 기반으로 Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 93d14fc commit e7d21b1

1 file changed

Lines changed: 101 additions & 85 deletions

File tree

website/src/content/docs/guides/migration-from-v1.mdx

Lines changed: 101 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -4,117 +4,133 @@ category: guides
44
order: 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

Comments
 (0)