프로젝트

TIL-221124- React 다음 우편주소 찾기 API사용법

혹등고래1호기 2022. 11. 24. 22:59

 

 

기존의 결제페이지에서의 배송지 선택을 조금 기획을 바꾸게 되었다. 네이버 스마트 스토어를 레퍼런스로 참고를 했는데 

구현을 할려고 다시 한번 네이버에서 사용을 해보니  조금 불편한 감이 있는 것 같아 조금 수정하기로 했다. 

 

MVP형태로 이번 주 기획의 형태는

 

체크박스를 통해 유저 정보에 있는 배송지를 선택하거나 직접 입력 하는 식으로 구현을 할려고했는데 

다음 주소찾기 API는 라이브러리로 사용감이 쉬운 것 같아 실험을 해보고 적용을 하기로 했다. 

 

 

 

먼저 npm에서 다운 로드를 해주자 

 

npm install react-daum-postcode

 

https://www.npmjs.com/package/react-daum-postcode

 

react-daum-postcode

Daum Postcode service for React. Latest version: 3.1.1, last published: 5 months ago. Start using react-daum-postcode in your project by running `npm i react-daum-postcode`. There are 16 other projects in the npm registry using react-daum-postcode.

www.npmjs.com

 

 

본인 같은 경우는 일단은 주소를 사용자의 주소 직접 입력을 막고 우편번호 찾기를 통해 주소를 칸을 채울 수 있도록 만들었다.

 

 

팝업창 방식

import React, { useState } from 'react';
import { useDaumPostcodePopup } from 'react-daum-postcode';

export default function Postcode() {
  const open = useDaumPostcodePopup();

  const [zonecode, setZonecode] = useState('');
  const [roadAddress, setLoadAddress] = useState('');
  const [jibunAddress, setJibunAddress] = useState('');

  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})` : '';

      setZonecode(data.zonecode);  // 우편번호
      setLoadAddress(fullAddress); // 도로명 주소
      setJibunAddress(data.jibunAddress); // 지번주소
    }
  };

  const handleClick = () => {
    open(
      { onComplete: handleComplete },
    );
  };

  return (
    <div>
      <label htmlFor="zone-code" />
      <input
        id="zone-code"
        placeholder="우편번호"
        disabled
        value={zonecode}
      />
      <button type="button" onClick={handleClick}>
        우편번호 찾기
      </button>
      <p>
        <label htmlFor="road-address" />
        <input
          id="road-address"
          placeholder="도로명주소"
          disabled
          value={roadAddress}
        />
        <label htmlFor="jibun-address" />
        <input
          id="jibun-address"
          placeholder="지번주소"
          disabled
          value={jibunAddress}
        />
      </p>
    </div>
  );
}

 

기존에 필드값들은 모두 disabled를 통해 사용하지 못하게 한 뒤 useState를 통해서 주소 선택을 완료하면 

각각의 값들을 채워주기 위해 state의 값을 input필드에 value값으로 주면 된다.

 

 

 

 

 

 

 

주소 입력을 완료하면 이런식으로 value가 주소로 세팅이 되는 것을 볼 수 있다.  

 

팝업말고 Embed 방법으로 구현하기

import React, { useState } from 'react';
import { useDaumPostcodePopup } from 'react-daum-postcode';

export default function Postcode() {
  const open = useDaumPostcodePopup();

  const [zonecode, setZonecode] = useState('');
  const [roadAddress, setLoadAddress] = useState('');
  const [jibunAddress, setJibunAddress] = useState('');

  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})` : '';

      setZonecode(data.zonecode);
      setLoadAddress(fullAddress);
      setJibunAddress(data.jibunAddress);
    }
  };

  const handleClick = () => {
    open(
      { onComplete: handleComplete },
    );
  };

  return (
    <div>
      <label htmlFor="zone-code" />
      <input
        id="zone-code"
        placeholder="우편번호"
        disabled
        value={zonecode}
      />
      <button type="button" onClick={handleClick}>
        우편번호 찾기
      </button>
      <p>
        <label htmlFor="road-address" />
        <input
          id="road-address"
          placeholder="도로명주소"
          disabled
          value={roadAddress}
        />
        <label htmlFor="jibun-address" />
        <input
          id="jibun-address"
          placeholder="지번주소"
          disabled
          value={jibunAddress}
        />
      </p>
    </div>
  );
}