본문 바로가기

안드로이드/코틀린

[AOS] Retrofit Response 동적 파라미터 Type으로 받기

반응형

서버 통신 응답 결과를 저장하는 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
            )
        )
    }
}

 

 

위 내용에대해 부족하거나 잘못된 부분을 말씀해주시면 수정하도록 하겠습니다.

반응형