API 호출 데이터 필터링

henry·2024년 10월 9일

소스 코드

API 데이터를 요청하고 응답받은 데이터를 필터링해서 필요한 필드만 전달해주는 소스 코드입니다.

let foodNm = req.query.foodNm;

const apiUrl = `http://api.data.go.kr/openapi/tn_pubr_public_nutri_process_info_api?serviceKey=
				${process.env.SERVICE_KEY_PROCESSED_FOOD}&pageNo=1&numOfRows=100&type=json&
                foodNm=${encodeURIComponent(foodNm)}`;

 const fieldsToExclude = [
 	'foodOriginCd',
    'dataCd'
    ...
    중략
    ...
]

foodData = foodData.map((item) => {
	const filteredItem = Object.fromEntries(
    	Object.entries(item).filter(([key]) => !fieldsToExclude.includes(key)),
    );
	return filteredItem;
});

return res.status(StatusCodes.OK).json(foodData);

응답받은 데이터

{
  "response": {
    "header": {
      "resultCode": "00",
      "resultMsg": "NORMAL_SERVICE",
      "type": "json"
    },
    "body": {
      "items": [
        {
          "foodCd": "P101-101000100-0018",
          "foodNm": "강냉이",
          "dataCd": "P",
          "typeNm": "가공식품",
          "foodOriginCd": "1",
          "foodOriginNm": "가공식품",
          "foodLv3Cd": "01",
          "foodLv3Nm": "과자류·빵류 또는 떡류",
          "foodLv4Cd": "01101",
          "foodLv4Nm": "강냉이/팝콘",
          "foodLv5Cd": "0100000",
          "foodLv5Nm": "해당없음",
          "foodLv6Cd": "010000001",
          "foodLv6Nm": "과자",
          "foodLv7Cd": "00",
          "foodLv7Nm": "해당없음",
          "nutConSrtrQua": "100g",
          "enerc": "409",
          "water": "0.6",
          "prot": "7.16",
          "fatce": "3.25",
          "ash": "1.09",
          "chocdf": "87.9",
          "sugar": "13.52",
          "fibtg": "0.4",
          "ca": "2",
          "fe": "1.55",
          "p": "228",
          "k": "258",
          "nat": "51",
          "vitaRae": "0",
          "retol": "0",
          "cartb": "0",
          "thia": "0",
          "ribf": "0.389",
          "nia": "1.99",
          "vitc": "0",
          "vitd": "0",
          "chole": "0",
          "fasat": "0.66",
          "fatrn": "0.02",
          "srcCd": "1",
          "srcNm": "농촌진흥청(국가표준식품성분표)",
          "servSize": "20g",
          "foodSize": "-",
          "itemMnftrRptNo": "",
          "mfrNm": "해당없음",
          "imptNm": "해당없음",
          "distNm": "해당없음",
          "imptYn": "N",
          "cooCd": "",
          "cooNm": "해당없음",
          "dataProdCd": "1",
          "dataProdNm": "분석",
          "crtYmd": "2016-12-31",
          "crtrYmd": "2024-09-25",
          "insttCode": "1471000"
        }
      ],
      "totalCount": "4",
      "numOfRows": "1",
      "pageNo": "1"
    }
  }
}

Object.entries() 개념

Object.entries(item)는 객체인 item의 모든 키-값 쌍을 배열로 변환합니다.
예를 들어, 객체가 { name: "apple", color: "red" }일 때, Object.entries(item)는
[["name", "apple"], ["color", "red"]]와 같은 배열을 반환합니다.

예시)

(객체)
{ name: "apple", color: "red" }

(배열)
[["name", "apple"], ["color", "red"]]


예시 소스 코드 해석

1. map() 메서드로 배열 순회 시작

foodData.map()이 호출되면서 배열의 각 요소를 하나씩 처리합니다. 여기서 각 요소는 item이라는 이름으로 함수에 전달됩니다.


2. 객체를 키-값 쌍 배열로 변환

"items": [
	{
    	"foodCd": "P101-101000100-0018",
        "foodNm": "강냉이",
        ...
        중략
        ...
        "insttCode": "1471000"
    }
],

Object.entries(item)가 실행되어 item 객체가 키-값 쌍의 배열로 변환됩니다.

[
  ["foodCd", "P101-101000100-0018"],
  ["foodNm", "강냉이"],
  // 중략
  ["insttCode", "1471000"]
]

3. 필터링 조건 적용 (filter())

변환된 키-값 쌍 배열에 대해 filter() 메서드가 실행됩니다.
filter()는 각 키-값 쌍을 순회하며, 현재 key가 fieldsToExclude 배열에 포함되지 않는지 확인합니다.
예를 들어, fieldsToExclude가 ["insttCode"]라면, "insttCode" 키는 제외되고 나머지 키-값 쌍만 남깁니다.

[["foodCd", "P101-101000100-0018"], ["foodNm", "강냉이"]]

4. 다시 객체로 변환 (Object.fromEntries())

필터링된 키-값 쌍 배열을 다시 객체 형태로 변환합니다. 이제 item은 다음과 같이 변경됩니다:

{ foodCd: "P101-101000100-0018", foodNm: "강냉이" }

5. 변환된 객체를 새로운 배열에 추가

변환된 객체(filteredItem)가 map() 메서드에 의해 새로운 배열에 추가됩니다.
첫 번째 요소 처리가 끝난 후 새로운 배열에는 다음과 같은 객체가 포함됩니다.

[{ foodCd: "P101-101000100-0018", foodNm: "강냉이" }]

6. 최종 결과 배열 반환

모든 요소의 처리가 끝나면 map() 메서드는 필터링된 객체들을 포함하는 새로운 배열을 반환합니다.

[
  { foodCd: "P101-101000100-0018", foodNm: "강냉이" },
]

로직에 의해 필터링한 필드를 제외한 데이터입니다.

0개의 댓글