티스토리 뷰

공부흔적/자바

API 응답 Json 객체로 받기

주디 𝙹𝚞𝚍𝚢 2021. 9. 7. 21:48

 회사 업무를 진행하다가 최근에 다루기 어려웠던 문제가 있어서 적어둔다.

 API에 요청을 하고 그 응답을 받아서 응답에 따라 로직을 타는 부분이었는데, 응답이 제대로 안 받아지는 문제가 있었다.


Response

 우선 내가 받아야 하는 응답의 json구조는 아래와 같았다.

{
    "resultCode":"0000",
    "resultMessage":"Success",
    "totalCount":1
    "items":[
    	{
            "index":0,
            "name":"홍길동",
            "gender":"M"
    	}
    ]
}

 items는 없을 수도 있고, 여러 개로 구성될 수도 있었다.

 그럼 받는 방향에서 어떻게 객체를 구성해야 하는지 고민을 했다. 우선 내가 짠 구조는 아래와 같았다.

class ApiResponse<T> {

    private String resultCode;
    private String resultMessage;
    private int totalCount;
    private List<T> items;

}

class ItemBase { // 다른 클래스들도 이용할 수 있게 공용으로 빼놓음. (실제 코드는 이렇지 않았다. 이건 그냥 참고용.)

    private int index;

}

class Item extends ItemBase {

    private String name;
    private String gender;

}

 이렇게 짜고 돌렸는데, List<T>인 items가 LinkedHashMap으로 들어와서 당황했다. 클래스 구성은 저랬지만 실제 호출하는 부분에서는 List<Item>을 이용했는데, ApiResponse로 만들 때 리스트를 어떤 객체로 받을지 지정을 안 해서 Object가 최상위객체라 그렇게 바꾼 것 같다고 대리님이 말씀해주셨다. (이 부분은 정말.. 다시 생각해도 바보같다. ㅋㅋㅋㅋㅋㅋ 타입 지정을 해놔야 알아서 변환을 해줄텐데.)

 그래서 구조를 아래와 같이 바꾸었다.

class ApiResponse<T extends ItemBase> { // extends 타입 추가

    private String resultCode;
    private String resultMessage;
    private int totalCount;
    private List<T> items;
    
    public ApiResponse() { // 빈 생성자 추가
       super();
    }

}

class ItemBase {

    private int index;
    
    public ItemBase() { // 빈 생성자 추가
    }

}

class Item extends ItemBase {

    private String name;
    private String gender;
    
    public Item() { // 빈 생성자 추가
        super();
    }

}

 그러고나니 잘 돌아갈 줄 알았는데... 문제가 생겼다. 사실 응답에서 보내는 totalCount까지는 받지 않아도 되었던 것. 그래서 마지막으로 어노테이션을 추가해줬다.

@JsonIgnoreProperties(ignoreUnknown = true)
class ApiResponse<T extends ItemBase> { // extends 타입 추가

    private String resultCode;
    private String resultMessage;
    private List<T> items;
    
    public ApiResponse() { // 빈 생성자 추가
       super();
    }

}

@JsonIgnoreProperties(ignoreUnknown = true)
class ItemBase {

    private int index;
    
    public ItemBase() {
    }

}

@JsonIgnoreProperties(ignoreUnknown = true)
class Item extends ItemBase {

    private String name;
    private String gender;
    
    public Item() { // 빈 생성자 추가
        super();
    }

}

 이렇게 해주고 나서야 드디어 원하던대로 객체리스트로 받을 수 있었다.

 처음에 저 응답구조를 보고, List를 어떻게 받아야 하나 잘 몰랐었는데 한 번 해보고 나니 별로 그렇게 어렵지 않은 것 같다. 혹시 나처럼 api를 처음 받아보는 경우에 참고하면 좋을 것 같다.

300x250

'공부흔적 > 자바' 카테고리의 다른 글

dead code 원인 찾기  (0) 2022.01.18
자바의 GC(Garbage Collection)  (0) 2021.12.07
FileOutputStream의 close와 flush  (0) 2021.08.07
File.separator  (0) 2021.07.28
synchronized  (0) 2021.05.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함