반응형

오랜만에 포스팅인듯 하다


이번 포스팅에서는 개발하는데 한번쯤 고민했을 Json? String?에 대한 주제로 이야기를 풀어보고자 한다.


Json VS String



시작부터 너무 강렬하게 표시하지 않았나 싶긴하지만.... 그래도 이미 시작한김에 이어나가보자.


단말 개발자가 서버로부터 송신하는 데이터는 보통 Json형식과 XML 형식이 있다.



Json과 XML은 인터넷에서 누가누가 더 짱인지에 대한 많은 논의가 있지만 이번엔 넘어가자...



상세 내용기술에 앞서 Json에 대해 간략하게 알아보고 넘어가자.


Json이란 


JSON (JavaScript Object Notaion)은 경량의 DATA 교환형식으로 JavaScript에서 숫자와 배열등을 만드는 형식을 차용하여 이것을 다른 언어에서도 사용할 수 있도록 한 텍스트 형식이다. 

(출처 : 생활코딩)



설명이 무겁고 장황했지만 여러분이 아래에 한번쯤 봤었을 포멧을 Json 포멧이라고 한다.

{ "username": "홍길동", "email": "honggildong@tistory.com", "phone": "010-1234-5678" }



여기까지 따라왔다면, 여러분은 이번 포스팅의 내용중 80프로를 습득했다고해도 무방하다.


80이라는 숫자를 보면서 으쓱했다면 박수한번치고 이제 나머지 20프로를 습득해보자.



개발자들이 Json 포멧을 관리하면서 보통의 처리 방법으로 POJO를 선호한다. 쉽게 말해 Json 포멧과 동일 형식의 Data클래스를 생성하여 송신된 Json 데이터를 모델링하여 저장 / 관리하는 방식이다.


이 부분에선 나름 신경써줘야하는 부분들이 발생되는데, Activity, Fragment 간 Intent 또는 Bundle 방식으로 데이터를 넘겨줘야할때 해당 POJO 데이터 클래스가 Parceleable 또는 Serializable을 implements 하여 구현되어 있어야 클래스 전달이 용이하다.


설명이 길었던 것 같다. 쉽게 코드로 보자.


1. Parcelable 구현 POJO 클래스

import android.os.Parcel;
import android.os.Parcelable;

public class TestData implements Parcelable {

String username;
String email;
String phone;

protected TestData(Parcel in) {
username = in.readString();
email = in.readString();
phone = in.readString();
}

public static final Creator<TestData> CREATOR = new Creator<TestData>() {
@Override
public TestData createFromParcel(Parcel in) {
return new TestData(in);
}

@Override
public TestData[] newArray(int size) {
return new TestData[size];
}
};


@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(username);
dest.writeString(email);
dest.writeString(phone);
}
}


1. Serializable 구현 POJO 클래스

import java.io.Serializable;

public class TestData implements Serializable {

String username;
String email;
String phone;

public TestData(String username, String email, String phone) {
this.username = username;
this.email = email;
this.phone = phone;
}
}



보면서 느꼈겠지만, 이런 방식은 개발 단계가 늘어나고 신경써줘야할 포인트가 늘어날 수 있다.


따라서 본 포스팅에서는 POJO 클래스 전달과정에서 Parcelable  또는 Serializable 을 사용하지 않고, Google Gson을 이용한 데이터 컨버팅에 대해 작성한다.


Gson gson = new Gson();
/**
* Json을 String으로 변경합니다.
*/
String converStringToJson = gson.toJson(TestData);

/**
* 위에 변경한 String을 Json으로 다시 변경합니다.
*/
TestData convertJsonToString = gson.fromJson(converStringToJson, TestData.class);


위의 3줄 예제로 깔끔하게 정리해보았다.

Json을 String으로 변경할때는 "Gson.toJson"을 이용하고, String 형식으로 Json포멧이 저장되어 있는 경우, "Gson.fromJson"을 이용하여 String 형식의 Json 포멧을 Json형식으로 컨버팅 하여 사용한다.


해당 방식의 장점으로는 

Activity, Fragment간 POJO 클래스 전달 시 Parcelable / Serializable 방식이 아닌 String 방식의 데이터 전달을 진행하고, Gson 컨버터를 이용하여 송신부와 수신부에서 POJO클래스로 가공하여 사용하기에 간편한 구현이 가능하다.



이번 포스팅을 마무리하며....


단순히 Gson의 toJson과 fromJson을 설명하기에 내용이 무겁고 장황했다. 물론 확장성 및 개발 방향성으로 고려했을땐 위의 Parcelable이나 Serializable 방식으로 처리해야 맞다.


하지만 필자의 경우 ShortCut (일명 바로가기) 기능을 구현하는 과정에서 ShortCut 심어주는 Intent 처리 과정에서 Parcelable 방식이 오류가 나면서 많은 시간 고민하다가 위의 방식으로 해결하였다.


물론 Parcelable방식을 기존에 Parcelable을 implements하여 구현한 방식이 아닌 애노테이션 방식으로 구현하여 발생된 문제이긴하나.... 기존에 개발된 코드를 대대적으로 개선할거냐 위의 방식으로 해결할꺼냐의 선택에서 필자는 위의 방식을 택하여 급하게 마무리하였다.


본 포스팅을 접한 여러분도 개발방향성, 확장성을 잘 고려하여 올바른 선택을 하길 바란다.



애노테이션 방식의 Parcelable 처리가 궁금한 분들은 여기를 참조하길 바란다.

반응형

+ Recent posts