본문 바로가기
TIL, WIL(일기)

230920 Retrofit데이터 클래스 정의

by 도슬 2023. 9. 20.

출처 : 

https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-image : 이미지 검색

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
    "meta": {
         "total_count": 422583,
         "pageable_count": 3854,
         "is_end": false
},
    "documents": [
        {
            "collection": "news",
            "thumbnail_url": "https://search2.kakaocdn.net/argon/130x130_85_c/36hQpoTrVZp",
            "image_url": "http://t1.daumcdn.net/news/201706/21/kedtv/20170621155930292vyyx.jpg",
            "width": 540,
            "height": 457,
            "display_sitename": "한국경제TV",
            "doc_url": "http://v.media.daum.net/v/20170621155930002",
            "datetime": "2017-06-21T15:59:30.000+09:00"
        },
        ...
]
}

예를 들어 요청에 의해 받아오는 데이터가 위와 같은 형식이라고 하자!

 

1. 데이터 구분을 해야하는데 3종류로 구분하면된다.

    ㄱ. { } : 오브젝트

    ㄴ. [ ] : 배열

    ㄷ. 변수

data class Kakao(
    val meta :Meta,
    val documents :ArrayList<Document>
)

2. Kakao란 이름은 의미없다 아무이름이나 지어주면된다.

3. 왼쪽에 있는 항목("meta" 는 오브젝트, "documents"는 배열)이다. 왜냐하면 뒤에 중괄호{}를 가지면 오브젝트, 대괄호[ ]를 가지면 배열 이기 때문이다.

4. 가장 왼쪽에 있는 오브젝트부터 차례대로 데이터 클래스를 만들어준다. 뒤에 있는 항목을 포함하기 때문이다.

5. val meta, val documents : 이 변수이름은 무조건 받아오는 데이터 형식의 이름과 똑같아야한다. 

6. 만약 documents -> document를 쓰면 데이터를 못받아온다.

7. documents는 위에서 보면 뒤에 대괄호[ ]를 가지고 있으므로 배열이다. 배열은 리스트형식으로 써준다.

8. 정리하면 변수명(meta, documents)는 무조건  서버 클라이언트의 이름과 같아야하고, 뒤에 타입(:Meta, :ArrayList<Document>)은 이름은 상관없는데 이왕이면 변수명 앞글자를 대문자로 써서 타입지정하는게 좋다.(헷갈리기때문에)

 

data class Meta(
    val total_count : Int,
    val pageable_count : Int,
    val is_end : Boolean
)

9.  "meta"(오브젝트)에 속하는 항목("total_count", "pageable_cont", "is_end" )은 변수이다. 왜냐하면 :뒤에 데이터값을 가지기 때문이다.

10. total_count : 422583 이므로 Int타입

11.  pageable_count : 3854 이므로 Int타입

12. is_end : false 이므로 Boolean타입으로 각각 지정해주면 된다.

 

data class Document(
    val collection : String,
    val thumbnail_url : String,
    val image_url : String,
    val width : Int,
    val height : Int,
    val display_sitename : String,
    val doc_url : String,
    val datetime : String
)

13. "documents"(오브젝트)에 속하는 항목 들도 모두 변수이다. 뒤에 데이터값을 가지기 때문이다.

14. 각 변수마다 가진데이터가 따옴표"" 내부에 있으면 String, 숫자면 Int 등등 서버클라이언트의 데이터를 보고 형식을 정해주면된다.

 

정리

1. 서버클라이언트의 데이터 예시를 보고 각 항목들을 3종류로 구분한다.( 오브젝트, 배열, 변수)

2. 가장 왼쪽 데이터부터 차례로 데이터 클래스를 구성한다. (가장 왼쪽에 있는 데이터가 뒤에있는 데이터를 포함하기 때문에)

3. 변수명은 서버클라이언트의 이름과 같아야한다.( 한글자라도 틀리면 데이터를 못받아온다.)

4. 오브젝트의 타입은 변수명을 따서 앞글자만 대문자로 짓는게 좋다. (헷갈리기때문에)

5. 배열의 타입은 List형식이고 타입이름 역시 변수명을 따서 앞글자만 대문자로 짓는게 좋다.

6. 변수의 타입은 각각 따옴표 내부에 있으면 String, 숫자만있으면 Int 등등 서버클라이언트의 데이터값을 보고 타입을 지정해주면된다.

7. 만약 서버클라이언트의 데이터 타입과 다르다면 역시 에러가생긴다. 

8. 변수 타입을 지정해줄때 왠만하면 서버클라이언트에 필수값인지 필수값이 아닌지 말해주는데 필수값이 아니라면 val datetiem : String? 이런 형식으로 뒤에 물음표를 써서 null값이 들어올 수 있다고 지정해주면 된다.

9. 문제는 서버클라이언트에서 필수값인지 아닌지 정확하게 말해주지 않는다. 필수값인데 null값이 들어올 경우가 생긴다. 그럼 로그 찍어보고 수정해서 null체크 해주면된다.

 

 

 

 

 

 

썸네일 출처

https://kr.freepik.com/free-photo/cute-ai-generated-cartoon-bunny_40572290.htm#query=%EA%B7%80%EC%97%AC%EC%9A%B4%20%EB%8F%99%EB%AC%BC&position=4&from_view=keyword&track=ais