일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 내일배움카드
- Spring
- Java
- 오블완
- 오픈챌린지
- OPENPATH
- 국비지원취업
- 국비지원
- 백엔드 부트캠프
- 부트캠프
- UXUIPrimary
- 객체지향
- 국비지원교육
- 패스트캠퍼스
- 디자인교육
- 티스토리챌린지
- 디자인챌린지
- 환급챌린지
- Be
- UXUI챌린지
- 내일배움캠프
- 디자인강의
- mysql
- 백엔드개발자
- 백준
- KDT
- 오픈패스
- UXUI기초정복
- 백엔드
- baekjoon
- Today
- Total
군만두의 IT 공부 일지
[Java] JSON 라이브러리 사용 방법 및 성능 비교 본문
목차
📅진행기간: 2024년 2월 5일 ~ 2024년 9월 20일
⭐요약
- 토이 프로젝트1을 준비하면서, JSON 라이브러리에 대해서 정리하면 도움이 될 것 같다고 생각함.
- Json-simple, Jackson, Gson에 대해서 각각의 특징, 사용 방법, 차이점 등을 정리함.
⭐ JSON 라이브러리란?
JSON은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷임. 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용함. 따라서 효율적이고 안정적인 라이브러리를 선택하는 것이 중요함.
JSON 라이브러리는 JSON 데이터를 다루기 위한 도구로, 주로 데이터 직렬화(serialization)와 역직렬화(deserialization)를 수행함. 이를 통해 객체와 JSON 데이터 간의 변환 작업을 쉽게 할 수 있음. 주로 사용되는 JSON 라이브러리로는 json-simple, Jackson, Gson 등이 있음.
- 직렬화: 객체나 데이터 구조를 일련의 바이트나 문자열로 변환하는 과정. 변환된 데이터는 파일에 저장하거나 네트워크를 통해 전송될 수 있음. 예시로는 객체를 JSON 형식의 문자열로 변환하는 것이 있음.
- 역직렬화: 직렬화된 데이터를 원래의 객체나 데이터 구조로 변환하는 과정. 저장된 파일이나 전송된 데이터를 읽어와서 프로그램이나 시스템이 이해할 수 있는 형태로 변환하는 작업을 말함. 예시로는 JSON 형식의 문자열을 객체로 변환하는 것이 있음.
1. Json-simple
json-simple은 JSON 데이터를 파싱하고 생성하기 위한 간단하고 가벼운 자바 라이브러리임.
1) 특징
- 간단한 API를 제공하여 초보자도 쉽게 사용할 수 있음.
- 자바 표준 라이브러리에 포함되어 있지 않은 경우에도 사용할 수 있음.
- 라이브러리 자체가 가벼워서 메모리 사용량이 적음.
2) 사용 방법
1. 의존성 추가(pom.xml)
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
2. JSON 파싱 및 생성(java)
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
// JSON 문자열 파싱
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(jsonString);
// JSON 객체 생성
JSONObject jsonObj = new JSONObject();
jsonObj.put("key", "value");
3) 성능
- 간단한 작업에는 적합함.
- 대규모 JSON 데이터나 복잡한 구조의 데이터를 처리할 때는 성능이 부족할 수 있음.
2. Jackson
Jackson은 빠르고 유연한 JSON 데이터 처리를 위한 자바 라이브러리임.
1) 특징
- 빠른 처리 속도와 메모리 효율적인 구현을 제공함.
- 다양한 기능과 커스터마이징 옵션을 제공하여 유연성이 뛰어남.
- 데이터 바인딩, 트리 모델, 그리고 저수준 API를 모두 지원함.
2) 사용 방법
1. 의존성 추가(pom.xml)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.5</version>
</dependency>
2. JSON 파싱 및 생성(java)
import com.fasterxml.jackson.databind.ObjectMapper;
// JSON 문자열 파싱
ObjectMapper objectMapper = new ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonString, MyClass.class);
// JSON 객체 생성
MyClass myObject = new MyClass();
String jsonString = objectMapper.writeValueAsString(myObject);
3) 성능
- 대규모 JSON 데이터를 처리할 때 우수한 성능을 보여줌.
- 복잡한 구조의 데이터도 효율적으로 처리할 수 있어서 대규모 프로젝트에 적합함.
3. Gson
Gson은 Google에서 개발한 JSON 데이터 처리를 위한 자바 라이브러리임.
1) 특징
- 직관적인 API를 제공하여 사용하기 쉬움.
- 객체와 JSON 데이터 간의 변환을 자동으로 처리해주는 기능을 제공함.
- JSON 데이터의 유효성을 검사하는 기능도 제공함.
2) 사용 방법
1. 의존성 추가(pom.xml)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.8</version>
</dependency>
2. JSON 파싱 및 생성(java)
import com.google.gson.Gson;
// JSON 문자열 파싱
Gson gson = new Gson();
MyClass myObject = gson.fromJson(jsonString, MyClass.class);
// JSON 객체 생성
MyClass myObject = new MyClass();
String jsonString = gson.toJson(myObject);
3) 성능
- 사용이 간편하고 속도가 빠르지만, Jackson에 비해 약간 느릴 수 있음.
- 대부분의 상황에서 충분한 성능을 보여주므로 대다수의 프로젝트에 적합함.
⭐성능 비교(작은 파일)
- 큰 파일: Jackson > JSON-SIMPLE > Gson
- 작은 파일: JSON-SIMPLE > Gson > Jackson
큰 파일을 테스트하기에는 어려워서 IntelliJ에서 Java Maven 프로젝트를 생성해 작은 파일의 성능을 테스트했음.
먼저, 위에서 설명한 대로 pom.xml 파일에 의존성을 추가함. 그리고 MyClass 클래스를 생성함.
public class MyClass {
private String name;
private int age;
public MyClass() {
}
public MyClass(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "MyClass{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
테스트를 위해 Main 클래스에서 아래 코드들을 추가해서 라이브러리별 직렬화와 역직렬화 시간을 확인함.
1) Json-simple
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class Main {
public static void main(String[] args) {
long startTime, endTime;
MyClass obj = new MyClass("John", 30);
// 직렬화 시간 측정
startTime = System.nanoTime();
JSONObject json = new JSONObject();
json.put("name", obj.getName());
json.put("age", obj.getAge());
String jsonString = json.toJSONString();
endTime = System.nanoTime();
System.out.println("Json-simple Serialization Time: " + (endTime - startTime) / 1000000 + " milliseconds");
// 역직렬화 시간 측정
startTime = System.nanoTime();
try {
JSONParser parser = new JSONParser();
JSONObject jsonObject = (JSONObject) parser.parse(jsonString);
String name = (String) jsonObject.get("name");
long age = (Long) jsonObject.get("age");
MyClass newObj = new MyClass(name, (int) age);
System.out.println("Json-simple Deserialization Time: " + (System.nanoTime() - startTime) / 1000000 + " milliseconds");
} catch (ParseException e) {
e.printStackTrace();
}
}
}
2) Jackson
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
public class Main {
public static void main(String[] args) {
long startTime, endTime;
MyClass obj = new MyClass("John", 30);
// 직렬화 시간 측정
startTime = System.nanoTime();
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonString = objectMapper.writeValueAsString(obj);
endTime = System.nanoTime();
System.out.println("Jackson Serialization Time: " + (endTime - startTime) / 1000000 + " milliseconds");
// 역직렬화 시간 측정
startTime = System.nanoTime();
MyClass newObj = objectMapper.readValue(jsonString, MyClass.class);
System.out.println("Jackson Deserialization Time: " + (System.nanoTime() - startTime) / 1000000 + " milliseconds");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3) Gson
import com.google.gson.Gson;
import java.io.*;
public class Main {
public static void main(String[] args) {
long startTime, endTime;
MyClass obj = new MyClass("John", 30);
// 직렬화 시간 측정
startTime = System.nanoTime();
Gson gson = new Gson();
String jsonString = gson.toJson(obj);
endTime = System.nanoTime();
System.out.println("Gson Serialization Time: " + (endTime - startTime) / 1000000 + " milliseconds");
// 역직렬화 시간 측정
startTime = System.nanoTime();
MyClass newObj = gson.fromJson(jsonString, MyClass.class);
System.out.println("Gson Deserialization Time: " + (System.nanoTime() - startTime) / 1000000 + " milliseconds");
}
}
각 라이브러리를 사용하여 작은 파일을 직렬화하고 역직렬화하는 시간을 측정하여 각 라이브러리의 성능을 비교할 수 있음. 작은 파일의 경우, 아래와 같이 Json-simple과 Gson이 각각 직렬화와 역직렬화에서 우수한 성능을 보인 것을 확인함.
- Json-simple: 직렬화에 0.001초, 역직렬화에 0.003초 소요
- Jackson: 직렬화에 0.221초, 역직렬화에 0.023초 소요
- Gson: 직렬화에 0.041초, 역직렬화에 0.001초 소요
각 JSON 라이브러리에는 장단점이 있으며, 프로젝트의 요구사항과 개발 환경에 따라 선택해야 함. 간단한 작업이나 초보자에게는 Json-simple이 적합하며, 대규모 프로젝트나 고성능을 요구하는 경우에는 Jackson을 사용하는 것이 좋음. Gson은 사용이 간편하고 대부분의 상황에서 충분한 성능을 보여주므로 중소 규모의 프로젝트에 적합함.
⭐후기
- JSON 라이브러리에 대해 이해할 수 있었음. 프로젝트에서 어떤 라이브러리를 선택해야 할지에 대한 판단 기준을 세울 수 있음.
- 작은 파일을 통한 성능 비교를 직접 해보면서 라이브러리의 특성을 명확히 이해하고 최적의 선택 방법을 알게 됨. 이 글이 다른 개발자들에게도 도움이 되길 바람.
⭐참고자료
1) MDN Web Docs, "JSON으로 작업하기", https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/JSON
2) DYKO, "[Java] Json을 Java 객체로 변환하는 방법(Gson, Jackson, JSON-SIMPLE)", 2023년 5월 27일, https://velog.io/@dyko/json-parser-libraries
이 글은 패스트캠퍼스의 백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.
'개발일지 > 패스트캠퍼스' 카테고리의 다른 글
[Spring] ObjectMapper를 활용한 직렬화, 역직렬화 (0) | 2024.04.15 |
---|---|
REST API란? (0) | 2024.04.12 |
[Java] 패스트캠퍼스 백엔드 개발 부트캠프 8기 토이 프로젝트 1 DAY5 (0) | 2024.04.05 |
[Java] 패스트캠퍼스 백엔드 개발 부트캠프 8기 토이 프로젝트 1 DAY4 (0) | 2024.04.04 |
[Java] 패스트캠퍼스 백엔드 개발 부트캠프 8기 토이 프로젝트 1 DAY3 (0) | 2024.04.04 |