Skip to content

JSON jsend 규칙으로 데이터 모델 구성해보기

sieunju edited this page Feb 11, 2022 · 2 revisions

요약 (Summary)

  • 서버에서 주는 데이터 모델이 규격화 되어 있다면 그에 맞게 클라이언트 데이터 모델도 규격화 합니다.

배경 (Background)

  • 서버에서 주는 json 모델이 JSend 방식이라면 아래와 같은 구조에서 데이터 모델을 구성시 불필요한 데이터 모델을 만드는 경우가 있습니다.
{
	status: true,
	data : {
		payload: object or list,
		meta: object	
	}
}
open class BaseResponse(val status: Boolean)

data class SampleResponse(
	val data : SampleEntity
): BaseResponse()

data class SampleEntity(
val id: Int
)
  • 위 같이 SampleResponse 이라는 불필요한 클래스 들이 생성을 해야 하기때문에 생산성과 클래스 낭비가 됩니다.

학습한 내용 정리

  • 제네릭을 적절하게 사용해서 ‘SampleResponse’ 의 낭비를 최소화 합니다.

코드 예시 (Example)

package com.til.model.base

/**
 * Description : 일반 Data 형태의 JSend Format
 * 모든 데이터 Response 는 해당 데이터 모델을 기반으로 구성해야 한다.
 *
 * status: true,
 * [data]: {
 * }
 * Created by juhongmin on 2022/01/11
 */
@Serializable
data class JSendBaseResponse<T : Any>(
    val data: T? = null,
    val isSuccess: Boolean = true
)

@Serializable
data class JSendWithMeta<T : Any, M : MetaEntity>(
    @SerialName("payload")
    val data: T? = null,
    @SerialName("meta")
    val meta: M? = null
)

package com.til.data.network

JSendBaseResponse<JSendWithMeta<JSendTestEntity, CustomMetaEntity>>

마치며

  • 어찌됐던 JSendBaseResponse 에서는 ‘data’ 와 서버 응답 상태인 ‘status’ 만을 받는데 성공을 한다면 HTTP 통신하는 중간에 data 만 전달할수 있는 방법이 있지않을까 라는 생각이 들었습니다. 좀더 디테일하게 들어가면 RepositoryImpl 에서 인터페이스 하나하나 데이터를 변환해서 풀어낼수 있겠지만. 그 방법 보다는 다른 방법이 있을거 같다는 생각이 들었습니다.
Clone this wiki locally