์ฐ๋ฆฌ ์๋น์ค์ ์ฃผ์์ฐพ๊ธฐ ๊ธฐ๋ฅ์ ์ฃผ์ + ์/๊ฒฝ๋ ์ ๋ณด๋ ํจ๊ป ๋ฐ์์์ผ ํ๋ค.
์ฃผ์์ฐพ๊ธฐ๋ daum์์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ์ฐํธ๋ฒํธ ๊ฒ์ ์๋น์ค api๋ฅผ ์ฌ์ฉํ๊ณ , ์/๊ฒฝ๋ ์ ๋ณด๋ ์นด์นด์ค์์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ๋ก์ปฌ API ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ค.
๋ค์ ์ฐํธ๋ฒํธ ๊ฒ์ api๋ ์ฉ js๋ก ๊ตฌํ๋์ด์๋ค. ์ด๋ฅผ react ํ๊ฒฝ์์ ๊ตฌํํ๊ธฐ ์ํด์ react-daum-postcode ์คํ์์ค ํจํค์ง๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐํ์๋ค.
๋ฆฌ์กํธ ํ์ด์ง์์ pop up ํํ๋ก ์ฐํธ๋ฒํธ ์ฐพ๊ธฐ api๋ฅผ ๋์ฐ๋ ค๋ฉด ์ฐ์ ์๋์ ์ฝ๋๊ฐ ํ์ํ๋ค.
์๋ ๋ ๊ฐ ํ์ผ ์ฝ๋๋ง ์์ผ๋ฉด ์ฐํธ๋ฒํธ ๊ฒ์ ์๋น์ค๋ฅผ ํ์ ์ผ๋ก ๋์ธ ์ ์์ด ํด๋น ํจํค์ง๋ฅผ npm install๋ก ๋ฐ๋ก ์ค์นํ์ง ์๊ณ ํ๋ก์ ํธ ๋ด๋ถ์ ํ์ผ๋ก ์ถ๊ฐํด์ฃผ์๋ค.
Daum ์ฐํธ๋ฒํธ ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ๋์ฐ๋ ์ฐํธ๋ฒํธ ๊ฒ์ ํ์ ์ฐฝ script๋ฅผ ํธ์ถํ๋ ํจ์๊ฐ ์ ์๋ ํ์ผ
์ฐํธ๋ฒํธ ๊ฒ์ ํ์ ์ฐฝ์ ๋์ฐ๊ณ ์ถ์ ํ์ด์ง์์ loadPostcode ํจ์๋ฅผ ์คํํ์ฌ ๋ฐํ๋ฐ์ ํจ์๋ก ์ฐํธ๋ฒํธ ๊ฒ์ ์๋น์ค๋ฅผ ํ์ ์ผ๋ก ๋์ฐ๋ ์ปค์คํ ํ
์ด์ ์์์ ์ถ๊ฐํ `useDaumPostcodePopup` hook์ ๊ฐ์ง๊ณ ์ค๋ฉด ํ์ ์ ๋์ธ ์๊ฐ ์๋ค.
์๋ PostCode ํ์ผ์ react-daum-postcode ํจํค์ง์์ ๋ช ์ํด์ค ๋ํ์ ์ธ ์ฌ์ฉ๋ฒ ์์๋ก, ์ฐํธ๋ฒํธ ์ฐพ๊ธฐ๊ฐ ํ์ํ ํ์ด์ง์์ ์ด ์์ ์๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
PostCode.tsx
import React from 'react';
import { useDaumPostcodePopup } from 'react-daum-postcode';
const Postcode = () => {
const open = useDaumPostcodePopup(scriptUrl);
const handleComplete = (data) => {
let fullAddress = data.address;
let extraAddress = '';
if (data.addressType === 'R') {
if (data.bname !== '') {
extraAddress += data.bname;
}
if (data.buildingName !== '') {
extraAddress += extraAddress !== '' ? `, ${data.buildingName}` : data.buildingName;
}
fullAddress += extraAddress !== '' ? ` (${extraAddress})` : '';
}
console.log(fullAddress); // e.g. '์์ธ ์ฑ๋๊ตฌ ์์ญ๋ฆฌ๋ก2๊ธธ 20 (์ฑ์๋1๊ฐ)'
};
const handleClick = () => {
open({ onComplete: handleComplete });
};
return (
<button type='button' onClick={handleClick}>
Open
</button>
);
};
๋์ ๊ฒฝ์ฐ๋ ์ฐํธ๋ฒํธ ๊ฒ์์ด ๋๋ฌ์ ๋ ์ฌ์ฉ์๊ฐ ์ ํํ ์ฃผ์๋ฅผ ๋ฐ์์ฌ ์ฝ๋ฐฑํจ์์ธ `onComplete`์ ๊ฒฐ๊ณผ๊ฐ์ ์ด PostCode.tsx ํ์ผ์ด ์๋, ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์์ผํ๋ค. ๊ทธ๋์ผ ์ด ์ฃผ์์ฐพ๊ธฐ ๋ฒํผ์ ์ฌ๊ธฐ์ ๊ธฐ ํ์ฉํ ์ ์๊ธฐ๋๋ฌธ์!
๋ชฉํ
PoseCode.tsx ์์๋ ์ฐํธ๋ฒํธ ์ฐพ๊ธฐ ๋ฒํผ์ ๋๊ณ , ๋ฒํผ์ ๋๋ฌ ์ฐํธ๋ฒํธ ๊ฒ์ ์๋น์ค๋ฅผ ํ์ ์ผ๋ก ๋์ฐ๊ณ ์ฌ์ฉ์๊ฐ ์ ํํ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ ์ฝ๋ฐฑํจ์๋ง ์คํํ๊ฒํ๋ค.
์ฌ์ฉ์๊ฐ ์ ํํ ์ฃผ์ ๋ฐ์ดํฐ๋ ๊ทธ ์์์ ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌํ๊ฒ ํ๋ค.
์์ ์ปดํฌ๋ํธ์์๋ ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์/๊ฒฝ๋ api๋ฅผ ํธ์ถํด์ ์/๊ฒฝ๋ ์ ๋ณด๋ ํจ๊ป ๋ฐ์์จ๋ค.
๋ ๊ทธ ์์ ์ปดํฌ๋ํธ์์ ์ฃผ์๋ฐ์ดํฐ + ์/๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ui์ ํ์ํ ์ํ๊ฐ์ ๊ด๋ฆฌํ๋ค.
PostCode.tsx
import { Address } from '@/components/daum-postcode/loadPostcode';
import useDaumPostcodePopup from '@/components/daum-postcode/UseDaumPostcodePopup';
interface Props {
onHandleComplete: (data: Address) => void;
}
export const PostCode = ({ onHandleComplete }: Props) => {
const open = useDaumPostcodePopup();
const handleSearchAddress = () => {
open({ onComplete: onHandleComplete }).catch(() =>
alert('ํ์ฌ ๋ค์ ์ฐํธ๋ฒํธ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.'),
);
};
return (
<Button
onClick={handleSearchAddress}>
์ฃผ์ ์ฐพ๊ธฐ
</Button>
);
};
SearchAddressWithLatiLongitude.tsx
import { Address } from '@/components/daum-postcode/LoadPostcode';
import { PostCode } from '@/components/daum-postcode/PostCode';
import { useLazyGetXYCoordinatesQuery } from '@/stores/apis/KakaoLocalApi';
import { Location } from '@/stores/apis/SiteApi';
interface Props {
onChangeAddress: (val: Location) => void;
}
export const SearchAddressWithLatiLongitude = ({ onChangeAddress }: Props) => {
const [getXYCoordinates] = useLazyGetXYCoordinatesQuery(); //kakao ์/๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ ์ฟผ๋ฆฌ
const handleComplete = (data: Address) => {
const address = data.address;
getXYCoordinates(address)
.then(({ data }) => {
if (data) {
onChangeAddress({
address,
detailAddress: data.documents[0].road_address.building_name,
zipCode: data.documents[0].road_address.zone_no,
latitude: data.documents[0].y,
longitude: data.documents[0].x,
});
}
})
.catch((err) => alert('์นด์นด์ค ์/๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.'));
};
return <PostCode onHandleComplete={handleComplete} />;
};
์ฃผ์๋ฐ์ดํฐ + ์/๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์์ ์ปดํฌ๋ํธ
const initialLocation = {
address: '',
detailAddress: '',
zipCode: '',
latitude: '',
longitude: '',
};
const [areaItemLocation, setAreaItemLocation] = useState<Location>(
type === 'edit' ? props.areaData.location : initialLocation,
);
<SearchAddressWithLatiLongitude
onChangeAddress={(val) => setAreaItemLocation(val)}
/>
๊ฒฐ๊ณผ
์ด๋ก์จ ์ฃผ์์ฐพ๊ธฐ ๋ฒํผ์ด ์๋ PostCode ์ปดํฌ๋ํธ๋ ์ฃผ์ ์ฐพ๊ธฐ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ด์ ์ ๋ง์ถ์ด ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ ์๊ฐ ์์๋ค. ์ฃผ์์ฐพ๊ธฐ ๋ฒํผ์ ์ฌ๊ธฐ์ ๊ธฐ ์ฌ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ์ด์ง์์ ์ค๋ณต๋ ๋ก์ง์์ด ์ฃผ์์ฐพ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ด ๋ ๊น๋ํ ์ฝ๋๊ฐ ๋์๊ณ ์ ์ง๋ณด์ํ ๋๋ ํด๋น ์์ ํ๊ณ ์ถ์ ๋ก์ง์ด ์๋ ํ์ผ๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก ๋ณ๊ฒฝ๊ณผ ํ์ฅ์ ์ข ๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋๋ก ๊ฐ์ ๋์๋ค!
์ฐธ๊ณ
https://postcode.map.daum.net/guide
https://www.npmjs.com/package/react-daum-postcode
https://developers.kakao.com/docs/latest/ko/local/dev-guide#address-coord
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mui textfield, select ๋ผ๋ฒจ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง ์ ์ฉ (0) | 2024.06.18 |
---|---|
Turborepo turbo.json build outputs ๋น๋๊ฒฐ๊ณผ๋ฌผ ๊ฒฝ๋ก (0) | 2024.05.28 |
html a ํ๊ทธ ๊ฐ์ด๋ฐ ์ ๋ ฌํ๊ธฐ (0) | 2024.04.16 |
javascript๋ก ์น๋ทฐ์์ ์คํ ๋๋์ง ๊ฐ์งํ๊ธฐ flutter - react (0) | 2024.04.15 |
์ด๋ฏธ์ง ๋ฆฌ์คํธ FCP First Contentful Paint ์ฑ๋ฅ ๊ฐ์ (0) | 2024.03.08 |