프로젝트에서 네이버 지도(Naver Map)와 같은 외부 라이브러리를 사용하여 지도 위에 커스텀 정보창(InfoWindow)을 표시해야 하는 상황이 있었습니다. 네이버 지도 API는 정보창의 내용을 HTML 문자열 형태로 요구했지만, 애플리케이션은 React를 기반으로 UI를 구축하고 있었습니다. 따라서 React 컴포넌트를 직접적으로 정보창에 전달할 수 없어, UI를 동적으로 커스텀하는 과정에서 어려움을 겪었습니다.
문제를 해결하기 위해 ReactDOMServer.renderToString
을 사용하여 React 컴포넌트를 문자열로 변환하는 방법을 도입하였습니다. 이를 통해 React 컴포넌트를 HTML 문자열로 변환하여 네이버 지도 API의 정보창에 전달할 수 있게 되었습니다. 구체적인 구현 과정은 다음과 같습니다:
React 컴포넌트 생성: 커스텀 정보창 내용을 표시하기 위한 React 컴포넌트 AddressInfoWindow
를 작성했습니다. 이 컴포넌트는 주소 목록을 받아 화면에 렌더링합니다.
React 컴포넌트를 문자열로 변환: 네이버 지도 API의 infoWindow.setContent
메서드에 전달할 HTML 문자열을 생성하기 위해 ReactDOMServer.renderToString
을 사용했습니다. 이를 통해 React 컴포넌트를 HTML 문자열로 변환하였습니다.
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import AddressInfoWindow from './AddressInfoWindow';
import makeAddress from './makeAddress';
function searchCoordinateToAddress(infoWindow, map, latlng) {
infoWindow.close();
window.naver.maps.Service.reverseGeocode(
{
coords: latlng,
orders: [
window.naver.maps.Service.OrderType.ADDR,
window.naver.maps.Service.OrderType.ROAD_ADDR].join(',')
},
function (status, response) {
if (status === window.naver.maps.Service.Status.ERROR) {
return alert('Something Wrong!');
}
let items = response.v2.results,
address = '',
htmlAddresses = [];
for (let i = 0, ii = items.length, item, addrType; i < ii; i++) {
item = items[i];
address = makeAddress(item) || '';
addrType = item.name === 'roadaddr' ? '[도로명 주소]' : '[지번 주소]';
htmlAddresses.push(addrType + ' ' + address);
}
const contentString = ReactDOMServer.renderToString(
<AddressInfoWindow addresses={htmlAddresses} />
);
infoWindow.setContent(contentString);
infoWindow.open(map, latlng);
}
);
}
export default searchCoordinateToAddress;
테스트 및 검증 React 컴포넌트를 문자열로 변환하여 네이버 지도 정보창에 적용한 후, 다양한 좌표에서 정보창이 정상적으로 표시되는지 테스트했습니다. 또한, 에러 핸들링을 통해 변환 과정에서 발생할 수 있는 문제를 관리하였습니다.
ReactDOMServer.renderToString
을 사용하여 React 컴포넌트를 HTML 문자열로 변환한 후, 네이버 지도 API의 정보창에 성공적으로 적용할 수 있었습니다. 이를 통해 다음과 같은 개선 효과를 얻었습니다:
renderToString
의 유용성: React 컴포넌트를 문자열로 변환하여 외부 라이브러리와 통합할 수 있다는 점을 배웠습니다. 이는 외부 API가 HTML 문자열을 요구하는 경우 유용하게 사용할 수 있습니다.renderToString
을 사용하면 클라이언트에서 추가적인 렌더링 작업이 필요 없다는 장점이 있지만, 너무 많은 컴포넌트를 문자열로 변환하면 성능에 영향을 미칠 수 있음을 인지하게 되었습니다.