개발 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등을 사용하시면 됩니다.