언어 및 도구들 공부/Java

@Query, @Header, @SerializedName

Dr.Mlem 2024. 10. 1. 13:01

(Java 32단원 KakaoSearchService.java)
Q1.
KakaoSearchService에서, @Query 어노테이션은 쿼리스트링 파라미터를 전송하기 위해서 사용된것이 맞지?


GitHub Copilot
네, 맞습니다. @Query 어노테이션은 Retrofit에서 쿼리 스트링 파라미터를 전송하기 위해 사용됩니다.

예를 들어, searchImage 메서드에서 @Query("query") String query는 HTTP GET 요청의 쿼리 스트링에 query 파라미터를 추가합니다. 이 경우, searchImage("example")를 호출하면 /v2/search/image?query=example와 같은 요청이 전송됩니다.

다음은 해당 부분의 코드입니다:

@GET("/v2/search/image")
Call<KakaoImage> searchImage(@Query("query") String query);

이 코드는 query 파라미터를 쿼리 스트링으로 전송하여 카카오 이미지 검색 API를 호출합니다.


Q2.
그러면 @Header은 헤더 정보를 보내기 위해서 사용된건가?

네, 맞습니다. @Headers 어노테이션은 Retrofit에서 HTTP 요청의 헤더 정보를 설정하기 위해 사용됩니다.

예를 들어, 현재 코드에서 @Headers 어노테이션은 카카오 API 호출 시 필요한 인증 헤더를 설정하고 있습니다:

이 코드는 Authorization 헤더에 KakaoAK 4f458534182ade5a3c0b84cb914014ca 값을 설정하여 요청을 보냅니다. 이 헤더는 카카오 API 서버에서 요청을 인증하는 데 사용됩니다.

따라서, @Headers 어노테이션은 HTTP 요청에 필요한 헤더 정보를 추가하는 데 사용됩니다. 이 경우, API 키를 포함한 인증 정보를 헤더에 추가하여 요청을 보냅니다.



Q3.
그러면 KakaoImage 파일에서, @SerializedName은 불러오려는 Json의 키 이름과 Java에서 쓰일 필드 이름이 다르기에, 그게 같은 내용이라고 선언해주는 것이라고 이해하면 될까?


GitHub Copilot
네, 정확합니다. @SerializedName 어노테이션은 JSON의 키 이름과 Java 클래스의 필드 이름이 다를 때, 두 이름을 매핑해주는 역할을 합니다. 이를 통해 JSON 데이터를 Java 객체로 변환할 때 올바르게 매핑될 수 있도록 합니다.

예를 들어, KakaoImage 클래스에서 @SerializedName("documents")는 JSON 응답에서 "documents"라는 키를 Java 클래스의 documents 필드에 매핑합니다. 마찬가지로, @SerializedName("thumbnail_url")는 JSON 응답에서 "thumbnail_url"이라는 키를 Java 클래스의 thumbnailUrl 필드에 매핑합니다.

다음은 KakaoImage 클래스의 예시입니다:

import lombok.Data;
import com.google.gson.annotations.SerializedName;
import java.util.List;

@Data
public class KakaoImage {
    @SerializedName("documents")
    private List<Document> documents;

    @SerializedName("meta")
    private Meta meta;

    @Data
    public class Document {
        @SerializedName("collection")
        private String collection;

        @SerializedName("thumbnail_url")
        private String thumbnailUrl;

        @SerializedName("image_url")
        private String imageUrl;

        @SerializedName("width")
        private int width;

        @SerializedName("height")
        private int height;
    }

    @Data
    public class Meta {
        @SerializedName("total_count")
        private int totalCount;

        @SerializedName("pageable_count")
        private int pageableCount;

        @SerializedName("is_end")
        private boolean isEnd;
    }
}

이 예시에서 @SerializedName 어노테이션은 JSON 응답의 키 이름과 Java 필드 이름을 매핑하여, JSON 데이터를 Java 객체로 변환할 때 올바르게 매핑되도록 합니다. 이를 통해 JSON 응답을 쉽게 처리할 수 있습니다.

'언어 및 도구들 공부 > Java' 카테고리의 다른 글

@Field, @FormUrlEncoded, Retrofit 라이브러리  (1) 2024.10.01
CRUD  (0) 2024.10.01
Retrofit 라이브러리  (0) 2024.09.30
Java lombok 라이브러리  (0) 2024.09.30
Stream 3  (0) 2024.09.28