카카오 주소 api 기능 추가

백민혁·2024년 1월 5일
0

개인프로젝트

목록 보기
2/7
post-custom-banner

목적 : 주소 찾기 기능을 위해 카카오 주소 api를 활용한 기능 추가

카카오 주소 api 관련 공식문서는 https://postcode.map.daum.net/guide 이 페이지에 자세하게 나와서 어떤 방식으로 진행되는지 확인했습니다.

개인프로젝트 진행중 react에 해당 라이브러리가 있어서 명령어를 이용해 호출하였습니다.

npm install react-daum-postcode

원하는 컴포넌트파일에 import 하였습니다.

import DaumPostcode from 'react-daum-postcode';

바로 컴포넌트를 사용하면 위의 이미지처럼 나와서 모달과 함께 사용하기로 했고 우선작업으로는 사용할 데이터들의 타입을 정했습니다.

interface AddressData {
    address: string
    sido: string
    sigungu: string
    addressType: 'R' | 'J' // 도로명주소 또는 지번주소에 대한 타입
    bname: string
    buildingName: string
}
interface Address {
    areaAddress: string
    townAddress: string
}

이후 주소, 상세주소가 필요하여 상태관리를 진행하였습니다.

 const [addressObj, setAddressObj] = useState<Address>({
        areaAddress: '',
        townAddress: '',
    })

주소검색을 클릭하면 원하는 주소 선택 후 담겨오는 데이터 관리를 위해 작성하였습니다.

 const handleComplete = (
        data: AddressData,
        onComplete: (address: Address) => void,
    ) => {
        let fullAddress = data.address
        let extraAddress = '' // 추가될 주소
        const localAddress = data.sido + ' ' + data.sigungu // 지역주소(시, 도 + 시, 군, 구)
        if (data.addressType === 'R') {
            // 주소타입이 도로명주소일 경우
            if (data.bname !== '') {
                extraAddress += data.bname // 법정동, 법정리
            }
            if (data.buildingName !== '') {
                // 건물명
                extraAddress +=
                    extraAddress !== ''
                        ? `, ${data.buildingName}`
                        : data.buildingName
            }
            // 지역주소 제외 전체주소 치환
            fullAddress = fullAddress.replace(localAddress, '')
            // 조건 판단 완료 후 지역 주소 및 상세주소 state 수정
            setAddressObj({
                areaAddress: localAddress,
                townAddress: (fullAddress +=
                    extraAddress !== '' ? `(${extraAddress})` : ''),
            })
            // 주소 검색이 완료된 후 결과를 매개변수로 전달
        }
    }

카카오 주소 찾기 모달 위치를 맞추기 위해 따로 스타일을 정하였습니다.

 const daumModal: React.CSSProperties = {
        width: '300px',
        position: 'absolute',
        top: '50%',
        left: '50%',
        transform: 'translate(-50%, -50%)',
        zIndex: 99,
    }

마지막으로 사용할 페이지에 props를 넘겨줘야하는 과정이여서 return코드에 작성하여 데이터를 전달하였습니다.

<Container>
           <label>{label}</label>
           <AdressStyle>
               <input
                   type="text"
                   readOnly={true}
                   placeholder={placeholder}
                   value={addressObj.areaAddress}
                   onChange={onChange}
               />
               <AdminBtn text={'주소검색'} onClick={onClickToggleModal} />
           </AdressStyle>
           {isOpenModal && (
               <Backdrop onClick={onClickToggleModal}>
                   <DaumPostcode
                       style={daumModal}
                       onComplete={(data) => {
                           handleComplete(data, setAddressObj)
                           onClickToggleModal()
                       }}
                   />
               </Backdrop>
           )}

           <input
               type="text"
               readOnly={true}
               placeholder={detailPlaceholder}
               value={addressObj.townAddress}
               onChange={onChange}
           />
       </Container>

개인프로젝트를 진행하는 과정에서 주소찾기 기능을 사용해야하는 부분이 있어서 카카오 주소찾기 api를 서칭 후 사용했습니다. 리액트에서 사용가능한 라이브러를 사용했고 주소 검색 후 원하는 주소를 선택하면 데이터를 받아서 원하는 부분만 정해 필요한 데이터만 보여지게 작성했습니다. 처음에는 많은 데이터를 받아와서 당황하였지만 필요한 데이터만 바꾸고 넘겨주는 과정이 흥미로웠습니다.

profile
프론트엔드를 공부하는 주니어 개발자입니다.
post-custom-banner

0개의 댓글