반응형
서버 통신 응답 결과를 저장하는 DTO를 생성할땐 일반적으로 타입과 이름이 명시적입니다.
data class UserRes(
val email: String?,
val name: String?
)
하지만 어떤 타입인지 모르거나 필드명을 모를 경우엔 어떻게 해야할까요?
서버측에서 필드명과 값들을 String으로 통일시켜서 내려주면 String으로만 받아서 사용하면 되지만
운영하는 서비스가 앱 포함 여러가지일 경우, 개발 스타일등의 이유로 저처럼 다이나믹한 결과값을 대응해야 하는 경우가 있습니다.
예를들어 유저가 종류가 다양하여 직군 별로 테이블에서 필드명을 관리한다고 가정했을때
각 직군 별로 있는 일치하는 필드가 있고 그렇지 않은 필드들이 있을 수 있습니다.
그렇기 때문에 데이터를 응답받을땐 직군별 필드키와 필드 이름, 각 필드에 필요한 값들을 처리해야 합니다.
data class UserRes(
val data: Map<String,Any>?,// 데이터
val fieldList: MutableList<DataFieldRes>
)
data class DataFieldRes(
val name: String?,// 필드명
val fieldKey: String?// 필드키
)
fieldList에 담긴 필드키를 가지고 UserRes에 data키중에 일치하는 값이 필드명에 필요한 값입니다.
아래처럼 데이터가 내려올 경우 위의 DTO를 사용하시면 됩니다.
{
data : {
"name" : "우늬",
"job" : "개발자"
},
fieldList:[
0:{
"fieldKey": "name:,
"name" : "이름"
},
1:{
"fieldKey": "job:,
"name" : "직업"
}
]
}
결과적으로 말하면 타입이 불분명할 경우 'Any' 와 'Map' 을 사용해 알맞는 타입을 찾아 사용하시면 됩니다.
일반적으로 String타입으로 선언해서 받을경우 문제가 없지만 list타입으로 올수도 있는 경우는 Any로 받아 처리해야 합니다.
데이터 사용
FieldListData는 실제 유저정보를 뿌려줄때 사용하는 모델로 '이름:우늬'와 같은 데이터를 담고 있습니다.
val resultFiledList = mutableListOf<FieldListData>()
val response: UserRes()
response.fieldList.map{ field ->
val findFieldData = response.data.get(field.fieldKey)
findFieldData?.let{ data ->
// 실제 필드 값이 있는 경우만 처리하기 위해
val fieldValue = data.value // 실제 필드 값
resultFiledList.add(
FieldListData(
name = field.name,
value = fieldValue
)
)
}
}
위 내용에대해 부족하거나 잘못된 부분을 말씀해주시면 수정하도록 하겠습니다.
반응형
'안드로이드 > 코틀린' 카테고리의 다른 글
[AOS] Room 사용시 이미지 비트맵으로 저장하기 (0) | 2022.08.09 |
---|---|
[AOS] 서드파티 앱을 이용하여 이메일 전송하기 & 앱내 문의하기 기능 구현 (0) | 2022.06.29 |
[Kotlin] Filter 함수로 For문 대체하기 (0) | 2022.05.01 |
[AOS] Custom QR Reader 만들기 (0) | 2022.03.30 |
[AOS] Mopub Migration MAX ( 광고 SDK ) (0) | 2022.02.23 |