군만두의 IT 공부 일지

[Java] JSON 라이브러리 사용 방법 및 성능 비교 본문

개발일지/패스트캠퍼스

[Java] JSON 라이브러리 사용 방법 및 성능 비교

mandus 2024. 4. 7. 21:06

목차

    📅진행기간: 2024년 2월 5일 ~ 2024년 9월 20일

    ⭐요약


    • 토이 프로젝트1을 준비하면서, JSON 라이브러리에 대해서 정리하면 도움이 될 것 같다고 생각함.
    • Json-simple, Jackson, Gson에 대해서 각각의 특징, 사용 방법, 차이점 등을 정리함.

    ⭐ JSON 라이브러리란?


    JSONJavascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷임. 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용함. 따라서 효율적이고 안정적인 라이브러리를 선택하는 것이 중요함.

    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();
            }
        }
    }

    ▲ Json-simple 실행 결과

    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();
            }
        }
    }

    ▲ Jackson 실행 결과

    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");
        }
    }

    ▲ Gson 실행 결과

     

    각 라이브러리를 사용하여 작은 파일을 직렬화하고 역직렬화하는 시간을 측정하여 각 라이브러리의 성능을 비교할 수 있음. 작은 파일의 경우, 아래와 같이 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

     

    이 글은 패스트캠퍼스백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.
    Comments