언어 및 도구들 공부/Java

Retrofit 라이브러리 사용 규격?

Dr.Mlem 2024. 12. 16. 15:33
Q1.

Retrofit 라이브러리를 통해서 통신을 주고 받으려면, 통신을 받아올 주소에 맵핑하는 어노테이션과 그에 해당하는 메서드는 @GET("/grade") Call<List<Grade>> getGrades(); 꼴로 작성되어야만 하는거야?

 

 

 

A1.

ChatGPT의 말:

 

Retrofit에서 통신을 설정할 때, 반드시 주어진 형식으로만 작성되어야 하는 것은 아닙니다. 하지만 Retrofit이 제공하는 매핑 어노테이션과 메서드 시그니처는 특정한 규칙을 따라야 통신 요청이 성공적으로 이루어집니다. 질문에 주어진 예는 @GET 요청의 일반적인 형태를 보여주지만, 상황에 따라 변형하거나 다른 방식으로 사용할 수도 있습니다. 자세히 살펴볼게요.


1. 어노테이션

  • @GET은 HTTP GET 요청을 수행하기 위한 어노테이션입니다.
  • 요청 타입에 따라 다른 어노테이션을 사용할 수 있습니다:
    • @POST: 데이터를 전송 (보통 서버에 리소스를 생성).
    • @PUT: 데이터를 업데이트.
    • @DELETE: 리소스 삭제.
    • @PATCH: 일부 리소스 수정.
    • @HEAD 또는 @OPTIONS: 해당 HTTP 메서드 요청.
    예:
@POST("/submit")
Call<ResponseBody> submitForm(@Body FormData formData);

2. 메서드 시그니처

Call<T>를 반환 타입으로 사용하는 것이 일반적이지만, 다른 반환 타입도 사용할 수 있습니다:

  • Call<T>: 동기/비동기 요청 모두 지원.
  • Deferred<T>: Kotlin Coroutines와 함께 사용할 때 사용.
  • Observable<T> 또는 Single<T>: RxJava 사용 시.
  • Response<T>: HTTP 응답 전체를 포함한 추가 정보를 받을 때.

예:

@GET("/grade")
Observable<List<Grade>> getGradesRx();

3. URL 매핑

주어진 경로(/grade)는 반드시 하드코딩된 문자열일 필요는 없습니다. 동적 URL 매핑도 가능합니다:

  • 경로 매개변수: @Path 사용
@GET("/grade/{studentId}")
Call<Grade> getGradeById(@Path("studentId") String id);
  • 쿼리 매개변수: @Query 사용
@GET("/grades")
Call<List<Grade>> getGradesByClass(@Query("classId") String classId);
  • 전체 URL을 동적으로 지정: @Url 사용
@GET
Call<Grade> getGradeWithDynamicUrl(@Url String url);

4. @GET 방식에 대한 변형

주어진 코드는 기본적인 구조지만 필요에 따라 다음과 같이 확장 가능합니다:

  • JSON 객체의 특정 필드만 가져오고 싶다면 DTO 클래스 수정.
  • 요청 헤더를 포함해야 한다면 @Header 또는 @Headers 사용.
@GET("/grades")
Call<List<Grade>> getGradesWithHeaders(@Header("Authorization") String token);
  • 요청의 캐시를 설정하려면 인터셉터나 Retrofit 클라이언트의 설정 조정.

5. 꼭 "꼴"이 같아야 하나?

꼭 @GET("/grade")와 Call<List<Grade>> getGrades();의 형태일 필요는 없습니다. 상황에 맞게 URL 매핑, 반환 타입, 동적 값 처리 등이 추가될 수 있습니다. 중요한 것은 Retrofit의 어노테이션과 시그니처 규칙을 준수하는 것입니다.


질문이 있다면 추가적으로 예제나 세부 사항도 알려줄 수 있습니다! 😊