[Java] JSON & Gson 완벽 정복: 개념부터 실전 활용까지
안녕하세요! 이번 포스팅에서는 현대 웹 개발과 애플리케이션 개발에서 빼놓을 수 없는 데이터 형식인 JSON과, Java 환경에서 이를 편리하게 다룰 수 있도록 도와주는 라이브러리 Gson에 대해 알아보겠습니다.
1. JSON이란 무엇일까요?
JSON(JavaScript Object Notation)은 이름에서 알 수 있듯이 본래 JavaScript에서 객체를 표현하기 위해 사용되던 문법에서 시작되었습니다. 하지만 현재는 특정 언어에 종속되지 않고, 다양한 프로그래밍 환경에서 데이터를 교환하기 위한 표준 데이터 형식으로 널리 사용되고 있습니다.
마치 서로 다른 언어를 사용하는 사람들이 소통하기 위해 공용어(Lingua Franca)를 사용하듯, 서로 다른 시스템이나 애플리케이션 간에 데이터를 주고받을 때 JSON이라는 표준화된 형식을 사용하는 것입니다. 특히 웹 API(Application Programming Interface)에서 서버와 클라이언트가 데이터를 주고받을 때 가장 흔하게 사용되는 형식 중 하나입니다.
간단한 JSON 예시를 살펴보겠습니다.
{
"name": "홍길동",
"age": 30,
"isStudent": false,
"courses": ["Java", "Web Development"],
"address": {
"street": "세종대로",
"city": "서울"
}
}
위 예시는 이름이 "홍길동"이고, 나이가 30세이며, 학생이 아니고, 수강하는 과목이 "Java", "Web Development"이며, 주소 정보까지 포함하는 하나의 데이터를 표현합니다. 직관적으로 어떤 데이터인지 파악하기 쉽죠?
2. JSON의 기본 문법
JSON은 몇 가지 간단한 규칙만 알면 쉽게 이해하고 사용할 수 있습니다.
- 객체 (Object): 중괄호
{}
로 감싸 표현합니다. 위 예시 전체가 하나의 객체입니다. - 배열 (Array): 대괄호
[]
로 감싸 표현합니다. 위 예시의courses
값이 배열입니다. - 키-값 쌍 (Key-Value Pair): 객체 내부는
키: 값
형태의 쌍으로 데이터를 표현합니다. 키는 반드시 문자열(큰따옴표 사용)이어야 하고, 값은 문자열, 숫자, 불리언(true/false), 배열, 다른 객체, 또는null
이 될 수 있습니다. 콜론:
으로 키와 값을 구분합니다. - 쉼표 구분 (Comma Separation): 객체 내의 여러 키-값 쌍이나 배열 내의 여러 값들은 쉼표
,
로 구분합니다.
3. JSON을 사용하는 이유
JSON이 널리 사용되는 데에는 몇 가지 중요한 장점이 있습니다.
- 가독성 (Readability): 사람이 읽고 이해하기 쉬운 텍스트 기반 형식입니다. 위 예시처럼 데이터 구조를 한눈에 파악하기 용이합니다.
- 경량성 (Lightweight): 비슷한 역할을 하는 다른 데이터 형식(예: XML)에 비해 문법 구조가 단순하고 불필요한 태그가 없어 데이터의 크기가 작습니다. 이는 네트워크 전송 효율성을 높여줍니다.
- 언어 독립성 (Language Independence): 특정 프로그래밍 언어에 종속되지 않습니다. JSON 형식만 지키면 Java, Python, JavaScript, C#, Ruby 등 거의 모든 언어에서 데이터를 생성하고 해석할 수 있습니다.
- 쉬운 사용성 (Ease of Use): 대부분의 프로그래밍 언어에서 JSON 데이터를 파싱(parsing)하고 생성(generating)하는 라이브러리를 풍부하게 지원하여 개발자가 편리하게 사용할 수 있습니다.
4. Java에서 JSON 다루기: org.json
라이브러리
Java에서는 기본적으로 JSON 처리 기능을 내장하고 있지 않지만, 다양한 외부 라이브러리를 사용하여 JSON 데이터를 다룰 수 있습니다. 그중 대표적인 라이브러리 중 하나가 org.json
입니다. (물론 Maven이나 Gradle 같은 빌드 도구를 통해 의존성을 추가해야 합니다.)
4.1. 문자열로부터 JSONObject 생성:
import org.json.JSONObject;
import org.json.JSONException;
public class JsonExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"홍길동\", \"age\": 30}"; // JSON 표준에 맞게 큰따옴표 사용 권장
try {
JSONObject jsonObj = new JSONObject(jsonString);
System.out.println(jsonObj); // 출력: {"name":"홍길동","age":30}
// 특정 값 가져오기
String name = jsonObj.getString("name");
int age = jsonObj.getInt("age");
System.out.println("이름: " + name + ", 나이: " + age); // 출력: 이름: 홍길동, 나이: 30
} catch (JSONException e) {
System.err.println("JSON 파싱 오류: " + e.getMessage());
}
}
}
문자열을 JSONObject
로 변환할 때는 JSON 문법 오류가 발생할 수 있으므로 try-catch
블록으로 예외 처리를 해주는 것이 중요합니다. getString()
, getInt()
, getJSONObject()
, getJSONArray()
등의 메소드를 사용하여 원하는 데이터에 접근할 수 있습니다.
4.2. put
메소드를 이용한 JSONObject 생성:
import org.json.JSONObject;
public class JsonExample2 {
public static void main(String[] args) {
JSONObject jsonObj = new JSONObject();
jsonObj.put("name", "임꺽정");
jsonObj.put("age", 35);
jsonObj.put("city", "평양");
System.out.println(jsonObj.toString()); // 출력: {"city":"평양","name":"임꺽정","age":35}
}
}
put
메소드를 사용하면 프로그래밍 방식으로 안전하게 JSON 객체를 구성할 수 있습니다.
5. Gson 소개: 더 편리한 JSON 처리
org.json
라이브러리도 유용하지만, Java 객체와 JSON 문자열 간의 변환을 더욱 매끄럽고 편리하게 처리하고 싶을 때 Gson 라이브러리가 빛을 발합니다. Gson은 Google에서 개발한 Java 라이브러리로, Java 객체를 JSON으로 변환(직렬화, Serialization)하거나 JSON 문자열을 Java 객체로 변환(역직렬화, Deserialization)하는 작업을 매우 쉽게 만들어 줍니다.
핵심 장점은 Java 객체(POJO - Plain Old Java Object)와 JSON 데이터 간의 자동 매핑입니다.
6. Gson 사용법
Gson을 사용하려면 먼저 프로젝트에 Gson 라이브러리를 추가해야 합니다. (Maven/Gradle 등 사용)
6.1. 라이브러리 추가 (예시: Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 최신 버전 확인 권장 -->
</dependency>
6.2. JSON 문자열 → Java 객체
먼저 JSON 구조에 맞는 Java 클래스(POJO)를 정의합니다.
// User.java
public class User {
private String name;
private int age;
private String email;
// 기본 생성자, Getter/Setter 등이 필요할 수 있습니다 (Gson은 종종 필요 없음).
@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", age=" + age + ", email='" + email + '\'' + '}';
}
}
이제 Gson을 사용하여 JSON 문자열을 User
객체로 변환합니다.
import com.google.gson.Gson;
public class GsonDeserialization {
public static void main(String[] args) {
String jsonString = "{\"name\":\"장보고\",\"age\":40,\"email\":\"jb@example.com\"}";
Gson gson = new Gson();
User user = gson.fromJson(jsonString, User.class); // 한 줄로 변환 완료!
System.out.println(user); // 출력: User{name='장보고', age=40, email='jb@example.com'}
// System.out.println(user.getName()); // Getter가 있다면 이렇게 접근 가능
}
}
gson.fromJson(jsonString, TargetClass.class)
메소드를 사용하면 JSON의 키와 Java 클래스의 필드 이름이 일치하는 경우 자동으로 값이 매핑됩니다.
6.3. Java 객체 → JSON 문자열
반대로 Java 객체를 JSON 문자열로 변환하는 것도 간단합니다.
// User 객체 생성 (Setter나 생성자 활용)
User user = new User();
// user.setName("이순신"); user.setAge(45); user.setEmail("lss@example.com");
// (위 User 클래스에 Setter나 값을 설정할 생성자가 있다고 가정)
// 임시로 값 설정 (필드 접근 가능 시)
// user.name = "이순신"; user.age = 45; user.email = "lss@example.com";
// 값을 가진 User 객체가 있다고 가정
User userToConvert = new User(); // 실제로는 데이터가 채워진 객체여야 함
// ... userToConvert 객체에 데이터 설정 ...
Gson gson = new Gson();
String jsonOutput = gson.toJson(userToConvert); // 한 줄로 변환 완료!
System.out.println(jsonOutput); // 출력: {"name":"이순신","age":45,"email":"lss@example.com"} (값이 설정되었다면)
gson.toJson(javaObject)
메소드를 사용하면 객체의 필드 정보를 기반으로 JSON 문자열을 생성해 줍니다.
6.4. 중첩된 객체 처리
Gson은 Java 객체 내부에 다른 객체가 포함된 경우(중첩 구조)에도 자동으로 처리해 줍니다.
// Address.java
public class Address {
private String city;
private String zipCode;
// ...
}
// Person.java
public class Person {
private String name;
private Address address; // 다른 객체를 필드로 가짐
// ...
}
// ... Gson 사용 코드 ...
Person person = new Person(); // 데이터 설정
// ...
String nestedJson = gson.toJson(person);
System.out.println(nestedJson); // 출력: {"name":"...", "address":{"city":"...", "zipCode":"..."}}
Java 클래스 구조만 잘 정의되어 있다면, Gson이 알아서 중첩된 JSON 구조로 변환하거나 그 반대의 작업을 수행합니다.
마무리
JSON은 현대 개발 환경에서 데이터를 표현하고 교환하는 데 필수적인 형식이 되었습니다. Java 개발자에게 Gson 라이브러리는 이러한 JSON 데이터를 Java 객체와 쉽고 효율적으로 변환할 수 있게 해주는 강력한 도구입니다. 복잡한 JSON 구조도 간단한 메소드 호출만으로 처리할 수 있어 개발 생산성을 크게 향상시킬 수 있습니다.
JSON과 Gson을 잘 이해하고 활용하여 더 효율적이고 깔끔한 Java 애플리케이션을 개발해 보세요!