땀이 삐질삐질 나는 개발 일기

[레트로핏]Retrofit2 @Field 와 @Body 차이 Feat.DTO 본문

개발 Tip

[레트로핏]Retrofit2 @Field 와 @Body 차이 Feat.DTO

삐질 2019. 5. 17. 23:07

안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.

오늘은 Retrofit의 어노테이션들 중 @Field와 @Body  대해 알아보려고 합니다


@Field 


인자를 form-urlencoded 으로 보낼때 사용해요 .

여기서 form-urlencoded는 key=value&key=value 와 같은 형태로 데이터를 전달하는 것을 말합니다.

또한 레트로핏에서 @Field는  @FormUrlEncoded  이녀석과 같이 쓰입니다. 


@FormUrlEncoded
@POST("api/setAdUser")
Call<Result> setAdUserApi(@Field("params") String params);



@Body


서버에서는 유일한 매개 변수로 받고, 클라이언트에서 Java  Object를 통째로 직렬화 해서 보낼때 사용해요.

Java Object를 직렬화해서 보낼 수 있는것은, Retrofit이 Gson 컨버터와 함께 쓰이기 때문이에요.


@POST("api/setAdUser")
Call<Result> setAdUserApi(@Body JsonObject jsonObject);


DTO ( Data transfer object )


* 데이터를 담아두는 그릇 클래스 입니다. 유사하게 POJO, Entity, DTO 여러가지 용어들로 불리기도 하는데  정확히 이때는  DTO가 맞습니다.

* @Body 를 사용하면, 현재의 Member Instance가 직렬화 된 String값으로 서버에 전달이 됩니다.

*  DTO를 사용하면 귀찮게 JsonObject에 담고 KeyValue쌍으로 파싱을 할 필요 없으니 참고해두면 좋습니다.

public class Result {

@SerializedName("request")
private JsonObject request;
@SerializedName("response")
private JsonObject response;

public JsonObject getRequest() {
return request;
}

public void setRequest(JsonObject request) {
this.request = request;
}

public JsonObject getResponse() {
return response;
}

public void setResponse(JsonObject response) {
this.response = response;
}
}



* Call<Result> 의 Result는 제가 따로 정의한 DTO이니까 이 부분은 그대로 따라하시면 에러를 만날 수 있습니다. 

* 제네릭 DTO는 각자 상황에 맞춰서 CustomDto 또는 ResponseBody등을 사용하시면 됩니다.



Comments