티스토리 뷰
회사 업무를 진행하다가 최근에 다루기 어려웠던 문제가 있어서 적어둔다.
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를 처음 받아보는 경우에 참고하면 좋을 것 같다.
'공부흔적 > 자바' 카테고리의 다른 글
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 |