개발/백엔드

[NodeJS][유용한 툴][라이브러리 소개] 택배 배송조회 API

ENFP Jake 2023. 2. 14. 09:59
728x90
반응형

# Delivery Tracker를 사용해서 택배 배송조회를 쉽게 만드는 방법

- 쇼핑몰과 같은 실물 제품을 파는 곳에라면 배송 조회 기능을 필요로 합니다. 특정 업체를 주로 이용한다면 그 배송업체의 배송조회 서비스를 이용하도록 안내해도 되지만, 사업 규모가 커지거나 사용자한테 원하는 UI나 UX로 해당 기능을 제공하고 싶다면, 배송조회 기능이 필요할 수 있습니다. 본 포스팅에서는 이런 경우에 도움이 될 수 있는 라이브러리를 소개하려고 합니다. 단 기본적인 NodeJS 백엔드에 대한 최소한의 지식이 있어야 사용하실 수 있습니다

 

 

# Delivery Tracker Github 저장소

https://github.com/shlee322/delivery-tracker

 

GitHub - shlee322/delivery-tracker: 🚚 Delivery and Shipping Tracking Service

🚚 Delivery and Shipping Tracking Service. Contribute to shlee322/delivery-tracker development by creating an account on GitHub.

github.com

※ 위 사이트에 방문하시면, 우측 상단의 Star를 눌러주세요. 개발자 분들께 큰 힘이 됩니다.

 

# 사용법

- 해당 라이브러리는 배송 조회 요청을 받아서 각 택배사 배송조회 API로부터 배송정보를 조회하여 결과를 전달 해주는 apiServer와 조회할 배송업체와 송장번호를 입력할 수 있는 client로 구성되어 있습니다. 만약 바로 배송 조회 사이트를 구현하고 싶으시면, 전체를 사용하시면 됩니다. 하지만 쇼핑몰을 개발하거나, 조회를 앱에서 하는 등의 경우, Client 쪽은 직접 구현하게 될 확률이 높을 것으로 보이기 때문에, apiServer쪽을 주로 사용하실 경우가 많을 것 같습니다

- Delivery Tracker의 apiServer가 npm 패키지로 되어 있는 것이 아니기 때문에, 필요한 코드를 발췌해서 적용하도록 하겠습니다. (아래의 코드는 apiServer의 예제 코드입니다)깃헙 저장소를 클론하거나, 다운 받아서 packages/apiserver/carriers를 찾습니다. 이 경로에 각 택배사별로 배송조회를 위한 기능들이 구현되어 있습니다. 모두 자신의 NodeJS 백엔드 프로젝트의 원하는 경로에 복사합니다. 그리고 아래와 같이 해당 경로의 파일을 읽어서 Object로 만들어 줍니다.

  fs.readdirSync(path.join(__dirname, 'carriers')).forEach(name => {
    // eslint-disable-next-line no-console
    console.log(`load carrier ${name}`);
    // eslint-disable-next-line global-require, import/no-dynamic-require
    CARRIERS[name] = require(`./carriers/${name}`);
  });

  const CARRIERS_INFOS = Object.keys(CARRIERS).map(id => ({ id, ...CARRIERS[id].info }));

- 위에서 만든 Object를 아래와 같이 배송업체 목록 조회 / 배송업체 조회 / 배송업체 및 배송조회와 같이 구현해서 사용하시면 될 것 같습니다.

~~~
  app.get('/carriers', (req, res) => {
    res.json(CARRIERS_INFOS);
  });

  app.get('/carriers/:carrierId', (req, res) => {
    if (!(req.params.carrierId in CARRIERS)) {
      res.status(404).json({
        message: res.__('not supported carrier'),
      });
      return;
    }

    res.json({
      id: req.params.carrierId,
      ...CARRIERS[req.params.carrierId].info,
    });
  });

  app.get('/carriers/:carrierId/tracks/:trackId', (req, res) => {
    const { carrierId, trackId } = req.params;

    if (!(carrierId in CARRIERS)) {
      res.status(404).json({
        message: res.__('not supported carrier'),
      });
      return;
    }

    CARRIERS[carrierId]
      .getTrack(trackId)
      .then(info =>
        res.status(200).json({
          ...info,
          carrier: {
            id: carrierId,
            ...CARRIERS[carrierId].info,
          },
        })
      )
      .catch(err =>
        res.status(typeof err.code === 'number' ? err.code : 500).json({
          message: err.message
            ? err.message
            : res.__('error message'),
        })
      );
  });
~~~

- 위의 방법으로 구현하는 경우 문제는 소스코드만 가져온 것이기 때문에, 배송 업체가 추가되는 등의 라이브러리가 업데이트 될 경우, 수동으로 반영해주어야 한다는 점은 꼭 참고해주시기 바랍니다.


 

728x90
반응형

'개발 > 백엔드' 카테고리의 다른 글

[Backend][Nextjs] next-auth  (0) 2022.03.05
[Backend] Oracle Cloud - Free Tier 사용방법 # 1  (0) 2022.03.02