[JAVA] Gson 라이브러리로 JSon 이용하기
최근에 회사에서 프로젝트를 하면서 쓴 것은 아니고 프로토타입핑을 하는 도중에쓴것이 있어서 소개하려고한다. 목적은그랬다. 데이터양이엄청많았는데서버에서가져오기벅차니까결과를캐쉬하자는목적이었다. 그런데메모리에올려져있는캐쉬를사용하자니서버에부담도되고, 그 사용량 역시 만만치 않다는 결론에이르렀다.
그래서 생각한것이 파일에저장하는것 이었다. 문제는 딱 2가지였다.
1. 각각의쿼리에대해서어떻게저장되어있는파일을고유하게구별할것인가?
2. 효율적인파일구조는무엇일까?
1번에대한답은MD5 키변환을통해서해결하고자했다.
즉, 어떤사용자가 어떤데이터를 요청할때, (데이터는사용자에종속된다.) 서버에 특정쿼리를 전달하면 그때의시간 혹은 테이블명 사용자ID 등의 고유한 문자열을 MD5키로 뽑아서 파일로만들고, 나중에 사용자가 쿼리를 전달할때 서버가 아닌 파일에서 찾게 만들게 하는 설계였다.
2번에 대한 답은 여러가지가 있을 수가있었다. 자체적인 구조를 만들수도있고, 아니면 전형적인 XML의형태를가지고갈수도있었다. 하지만 개인적으로 XML의경우태그명이 명확한이름 짓기로인해서 길어질경우, 지나치게 데이터의양을 차지할것 같고, 무거운느낌이 들었다.
그래서 생각해낸것이 바로 JSON이었다.
원래 웹서비스의 전송포맷으로 많이사용하는데 이번에는 서버에데이터 저장용으로 써보는것은 어떨까? 하는생각을하게되었다. 물론 추후에 그 데이터를 외부 혹은 내부의 다른서비스에 네트워크를 통해서 전달해야한다면 바로 그 파일을 쓸 수도있지않을까 하는막연한기대감도있었다.
자바에서어떻게하면쉽게클래스에저장한데이터를 MD5이름을가진 JSon형식의파일로저장할수있을까? 그리고저장된파일에서어떻게하면쉽게클래스로옮겨올수있을까? 하는생각이들었다. 다들아시다시피프로토타입핑은간결해야하고, 프로젝트기간중에우리에게 JSon 파서를만들도록나둘프로젝트매니저나팀장은적어도대한민국엔존재하지않는다. 때문에 오픈소스 JSon 관련파서를찾기시작했고(자바용), 그래두역시구글님이만들어놓으신 Gson 이라는라이브러리를찾을 수 가있었다. Gson에서는다양한기능을제공하지만위에서정의한요구사항에부합하는기능을쓰는것은매우간단하다. 아래의코드를보자.
먼저데이터를 넣고뺴고 할때담을 그릇, 클래스를만들자. Person 이라는예제클래스를만들었다. 다음과같이간단하게사람의 여러가지 특징에 대해서 설명할 수 있는 변수들을 지정했다. 그리고 나서 JSon 파일을읽어오는 readJsonFile() 함수와 Person 객체에서 JSon파일로 데이터를 넣을수 있는 writeJsonFile을 작성하였다.readTextInFile()
함수는단순히지정한파일에서텍스트를읽어오는 역할을한다. 위의코드를보라. 미칠듯이간단하다. readJsonFile(
) 함수에서는 텍스트파일에서 읽어온 텍스트내용을 Gson 객체의 fromJson()
함수에어떤클래스의형식으로받을것인지를함께전달해주면된다. 그리고리턴값으로 Person 객체를 이용해서받으면된다. writeJsonFile()
함수를보면, 더간단하다. gson.toJson
에 Person객체를전달해주고 FileWriter의 write
함수에 전달해주기만 하면된다.
이제 main에서호출해준다.
사용후기를 말씀드리면, Gson 라이브러리가 제공하는 기능으로인해서 JSon 에대해서 쉽게 접근 할 수있어서좋은 것 같다. 그리고위에서소개한기능은 Gson 라이브러리의 기능 중 극히 일부분이기때문에네트워크와 맞물렸을 경우, 사용하기 편한 여러가지기능을 Gson에서제공하고있을 것같다. 필요하면해당사이트에가서찾아서쓰면좋을것같다. 가장마음에 드는 것은 JSon 구조자체가 깔끔하다는 것이다. XML처럼 특정태그명과포함관계를지정하기위해서애쓸필요가없다. 내가 정한 클래스의 구조 그대로 들어가기 때문에 좀 더 클래스 디자인에만 집중 할 수 있게 하는것도 하나의 장점이라는 생각이든다.