토이 프로젝트 배우게 된 것들 & 오류 해결🐰

[ feign client ] 사용 시, 응답값 형식 오류

j_estory 2022. 12. 29. 20:45

지도를 그리기 위해서는 위, 경도 값이 필요하여 카카오 지도 API를 사용하게 되었다.

앞선 포스팅에서 어떠한 클라이언트 툴을 사용할지 고민하던 중에 feign 의 장점이 크다고 생각하여 feign-client를 적용하였다.

 

내가 사용한 카카오 지도 API의 응답 값은 아래와 같았다.

ex)

{
  "meta": {
    "total_count": 4,
    "pageable_count": 4,
    "is_end": true
  },
  "documents": [
    {
      "address_name": "전북 익산시 부송동 100",
      "y": "35.97664845766847",
      "x": "126.99597295767953",
      "address_type": "REGION_ADDR",
      "address": {
        "address_name": "전북 익산시 부송동 100",
        "region_1depth_name": "전북",
        "region_2depth_name": "익산시",
        "region_3depth_name": "부송동",
        "region_3depth_h_name": "삼성동",
        "h_code": "4514069000",
        "b_code": "4514013400",
        "mountain_yn": "N",
        "main_address_no": "100",
        "sub_address_no": "",
        "x": "126.99597295767953",
        "y": "35.97664845766847"
      },
      "road_address": {
        "address_name": "전북 익산시 망산길 11-17",
        "region_1depth_name": "전북",
        "region_2depth_name": "익산시",
        "region_3depth_name": "부송동",
        "road_name": "망산길",
        "underground_yn": "N",
        "main_building_no": "11",
        "sub_building_no": "17",
        "building_name": "",
        "zone_no": "54547",
        "y": "35.976749396987046",
        "x": "126.99599512792346"
      }
    },
    ...
  ]
}

여기서 내가 필요한 값은 

documents 배열 객체 안에 x, y, address_name, address_type 이정도 이다!

 

그래서 응답값에 대한 객체를 모두 생성하지 않고 Map형식으로 받아와 내가 필요한 값들만 추출하여 객체로 만드려고 했다.

 

// 카카오 API에서 응답값을 Map형태로 받아온다.
Map result = kakaoFeignClient.searchLocation(query);

// 필요한 값은 docuemnts key 값에 있으므로 아래와 같이 꺼내온다.
ArrayList<Map> list = result.get("documents"); // 이 때 발생 하는 빨간 줄 .. !!

인텔리제이에서 제공해주는 solution은 아래와 같았다.

  1. Object 형식으로 응답 값 형식을 바꿔라. 
  2. ArrayList 형식으로 cast 해라.

처음에는 위 두개의 솔루션이 모두 이해가 가지 않았다.

하지만 차근차근 생각해보니 당연한 것이였다.

 

처음에 나는 Map 형식으로 응답값을 받아왔는데 Map의 제네릭 객체를 명시적으로 선언해주지 않았다.

그러니, 당연히 최상위 객체로 판단하여 Object로 응답값을 받으라고 하는 것이 였다. 

 

그래서 나는 2번째 해결법을 선택했고 아래와 같이 수정해주었다.

ArrayList<Map> list = (ArrayList<Map>) result.get("documents");

// 이렇게 받아온 후, ArrayList<Map> 에서 Map에 대한 제네릭을 객체를 명시적으로 선언해주지 않으니, 
// 좀 전 상황과 비슷하게 object로 인식하였고 내가 필요한 응답 값들은 모두 String 형식이 되어 아래와 같이 선언해주었다.

ArrayList<Map<String, String>> list = (ArrayList<Map<String, String>>) result.get("documents");