REST API란 쉽게 말해서 자원의 이름으로 자원의 상태를 주고받을 수 있는 API이다.
JSON 이나 XML 을 사용해서 데이터(자원)를 주고받는 것이 일반적이다.
개발원에서는 객체를 JSON형식으로 변환하거나 JSON을 다시 파싱할 때 Jackson 라이브러리를 사용했었는데, 회사에서는 GSON을 사용해보라고 했다.
그냥 익숙한 Jackson objectMapper를 사용하고 싶었지만, 어쩔 수 없이 GSON도 공부할겸...
두 개를 비교해서 정리했다.
Jackson은 JSON뿐만 아니라 XML도 지원하는 라이브러리이다.
스프링을 배우기 전에는 JAVA객체를 JSON으로 변환할 때 직렬화(serializing) 하고 마샬링을 해줘야 했는데, Jackson ObjectMapper를 사용하면 객체를 한 방에 JSON화 할 수 있어서 엄청 편했다.
우선 Jackson에서 직렬화 하는 방법이다.
ObjectMapper mapper = new ObjectMapper();
// string으로 직렬화
String jsonResult = mapper.writeValueAsString(boardVO); // boardVO => json으로 바꾸고싶은 java객체
// json 파일로 저장
mapper.writeValue(new File("src/resources/result.json"), boardVO);
// byte 배열로 저장
byte[] jsonBytes = mapper.writeValueAsBytes(boardVO);
이렇게 ObjectMapper객체를 만들고 writeValueAsString() 하게 되면, ( )안에 있는 JAVA객체를 JSON 형식의 스트링 문자열로 변환해준다. string 외에도 파일이나 바이트 배열로 저장할 수 있다.
다음은 JSON형식의 데이터를 JAVA로 변환하는 역직렬화 방법이다.
ObjectMapper mapper = new ObjectMapper();
// JSON 파일에서 읽기
BoardVO boardVO = mapper.readValue(new File("src/resources/data.json"), boardVO.class);
// String 으로 읽기
BoardVO boardVO = mapper.readValue("{\"id\":\"a001\", \"name\":홍길동}", boardVO.class);
이처럼 readValue()로 JSON형식의 데이터를 읽을 수 있다.
boardVO 대신에 저장할 Java 객체를 넣어주면 된다.
List나 Map 형식으로 변환하고 싶으면 아래처럼 TypeReference를 사용하면 된다.
// List 형식
String jsonArray =
"[{ \"id\" : \"a001\", \"name\" : \"홍길동\" }, { \"id\" : \"b001\", \"name\" : \"지눈쓰\" }]";
List<BoardVO> listBoard = objectMapper.readValue(jsonArray, new TypeReference<List<BoardVO>>(){});
// Map 형식
String json = "{ \"id\" : \"a001\", \"name\" : \"홍길동\" }";
Map<String, Object> map
= objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
Jackson은 고용량의 JSON데이터를 처리할 때 GSON보다 성능이 좋다고 한다.
GSON은 구글에서 만들었으며, 이름에서도 알 수 있듯이 딱 JSON형식만 처리할 수 있는것 같다.
가벼운 JSON 데이터를 처리할 때 성능이 좋다고 한다.
GSON에서 Java객체를 문자열로 직렬화 하는 방법이다.
String jsonResult = new Gson().toJson(boardVO);
이렇게 Gson객체를 만들고 toJson( )하면 간단하게 JAVA객체를 JSON형식의 문자열로 변환할 수 있다.
다음은 역직렬화이다.
String jsonInput = "json 형식의 string 데이터";
BoardVO boardVO = new Gson().fromJson(jsonInput, boardVO.class);
똑같이 Gson객체 만들고 fromJson( )에 JSON 형식의 문자열 데이터만 넣어주면 된다.
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
// Json 객체생성 (key, value 추가)
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("id", "a001");
jsonObject.addProperty("name", "홍길동");
// JsonObject를 Json 문자열로 변환(직렬화)
String jsonStr = gson.toJson(jsonObject);
// 생성된 Json 문자열 출력
System.out.println(jsonStr); // {"id":"a001","name":홍길동}
}
}
JsonObject 객체를 생성후 프로퍼티를 추가하고 이를 문자열로 직렬화했다.
import com.google.gson.Gson;
public class JsonToObject {
public static void main(String[] args) {
// Json 문자열
String jsonStr = "{\"id\":a001,\"name\":\"홍길동\"}";
// Gson 객체 생성
Gson gson = new Gson();
// Json 문자열 -> VO 객체
BoardVO boardVO = gson.fromJson(jsonStr, BoardVO.class);
}
}
VO가 아니라 Map 형식도 똑같이 하면 된다.
공부해보니까 Jackson이나 GSON이나 사용법은 비슷비슷한거같다.
걍 더 편한거 쓰면 될듯