Spring에서의 Gson을 사용한 Json처리

보통은 Spring에서 Json을 처리할 때에 Jackson을 사용하는것 같습니다.

Spring과 관련하여 검색을 하다보면 심심찮게 Jackson을 사용하여 Json을 만드는것을 볼 수 있었습니다.

또한 제 경우에는 대학교 수업중에도 언급이 됬었습니다만...

어쩌다보니 포스팅은 Gson을 이용한 Json처리를 먼저 포스팅하게 되었습니다.

 

제 경우에는 Spring에서 유튜브API를 사용하는 방법/소스들을 찾아보던 중에 Gson이라는 객체를 이용하던 소스를 보게되었고, 해당 코드를 이해하기 위해서 Gson에 대하여 찾아보게 되었었고,

실제 프로젝트 상에서도 Gson객체를 생성하는데에 있어서 Gson을 활용하게 되었습니다.

 

참고로, 안타깝게도 해당 소스는 youtubeAPI상에서 deprecated되어있었고, 편리하고 유용하게 API를 사용하기 위해 JAVA단에서 youtubeAPI를 사용하는 방법을 여러 방면으로 열심히 찾아봤었는데..  JavaScript상에서 사용하는 방법 말고는 구할수가 없었습니다.

직접 HttpConnection을 생성하여 하나하나 API를 호출하고.. 그랬었네요...

 

어쨋든, Gson에 대해서 알아보도록 하겠습니다.

Gson은 Json파싱 라이브러리중 하나로, 객체에서 Json 혹은 Json에서 객체로의 변환기능을 제공해줍니다.

스프링에서는 Maven을 통해서 pom.xml에서 간편하게 원격 레포지토리에서 다운받아 사용하실 수 있습니다.

Gson gson = new Gson();

String jsonString = gson.toJson(AAA);

AAA aaa = gson.fromJson(JsonString, AAA.class);

 

와 같은 형식으로 사용하게 되며,

toJson 메서드는 해당 객체를 JsonString으로,

fromJson 메서드는 Json을 해당 타입의 객체로 변환시켜주는 메서드입니다.

부끄러운 코드이지만, 위의 방법은 Java에서 기본으로 제공해주는 Json API를 사용했던, 과거 소스의 일부분입니다.

Java 기본 제공 JsonAPI는 JsonArray와 JsonObject를 조합하여 사용하는 방식으로,

단순한 Json을 생성하는데에는 좋을수있겠으나 위와같이 많은 필드에 대해서 처리를 해야할경우,

혹은 JsonArray안에 JsonArray가 담겨있거나 하는 경우에는 코드상으로 굉장이 지저분하게 되어버렸습니다.

Gson을 사용할경우 아래와 같은 코드가 사용됩니다.

위 코드에서 toJson의 인자로 사용된 categoryItems라는 객체를 생성시키는 부분을 제외하면 3줄의 코드가 남게됩니다.

Gson gson = new Gson();

String jsonString = gson.toJson(categoryItems);

return jsonString;

기존의 JsonAPI를 사용했을때와는 코드의 길이상 확연한 차이가 존재함을 알 수 있습니다.

그렇다면, 어떻게, 무엇으로 Gson이 객체를 Json으로, Json을 객체로 변환할까요?

아래와 같습니다.

우선 Json으로 변경될 클래스를 살펴봐야 합니다.

NoteVO클래스는 위의 Gson예시에서 List에 담겨졌던 해당 객체의 클래스입니다.

이 클래스를 Gson을 통해서 Json으로 변형하게 되면 아래와 같은 결과를 가져오게 됩니다.

이를 통해 알수있는 사실로는.

 

1) Gson에서는 객체를 Json으로 변환시킬 수 있다.

2) 객체의 타입(클래스)의 필드명이 Json의 데이터의 key 역할을 하게 된다.\

3) 객체가 인스턴스로써 가지고있던 해당 필드의 데이터들이 Json의 value역할을 하게 된다.

4) @SerializedName어노테이션을 사용하게되면 해당 필드가 Json으로 변경될 때,

    key의 이름을 필드명이 아닌 임의이름으로 지정시킬 수 있다.

그런데, 클래스 파일에는 userEmail이라는 필드가 존재하지만, Json에서는 해당 필드가 존재하지 않는것을 확인 할 수 있습니다.

이부분에 대해서는 mybatis의 관련 mapper.xml을 살펴보게 되면 애초에 데이터를 읽어올 때에 userEmail이라는 데이터를 읽어오지 않았음을 확인 할 수 있습니다.

이를 통해 알 수 있는 사실로는,

5) 데이터가 담겨져있지 않은 필드에 대해서는 Json변환을 수행하지 않는다.

를 알 수 있습니다.

 

이외에도 참고사항으로는 아래와 같습니다.

- public뿐만아니라 private접근자의 필드들도 변환이 가능해집니다.

- transient 구분자를 사용하면 직렬화/역질렬화 처리에서 제외된다.

- 직렬화시 null값의 필드는 자동제외되며, 역질렬화시에는치하는 필드가 없다면 null이 할당된다.