JSON to Java 클래스 생성기

JSON에서 Java POJO 클래스 생성

예시 시도
루트 클래스 이름:

JSON 입력

Java 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
Java 클래스가 여기에 표시됩니다…

JSON to Java 클래스 변환이란?

JSON to Java 클래스 변환은 원시 JSON 객체를 받아 private 필드, getter, setter가 포함된 POJO(Plain Old Java Object) 정의를 생성합니다. Java에는 내장된 JSON 타입 시스템이 없기 때문에, 모든 JSON API 응답, 설정 파일, 메시지 페이로드는 타입 안전한 방식으로 다루기 전에 대응하는 클래스가 필요합니다. Jackson과 Gson 같은 라이브러리는 리플렉션을 통해 JSON 키를 Java 필드에 매핑하지만, 클래스 정의가 먼저 존재해야 합니다.

JSON 역직렬화를 위한 표준 Java POJO는 각 JSON 키에 대한 private 필드, 인수 없는 생성자, 그리고 필드당 getter/setter 쌍을 선언합니다. 중첩된 JSON 객체는 별도의 클래스가 됩니다. 배열은 java.util.List 임포트와 함께 List<T> 필드가 됩니다. 원시 JSON 타입은 Java 기본 타입(int, double, boolean) 또는 제네릭 내부에서 사용될 때는 래퍼 타입(Integer, Double, Boolean)에 매핑됩니다. null 값은 일반적으로 Object 또는 nullable 참조 타입에 매핑됩니다.

이러한 클래스 정의를 수동으로 작성하는 것은 반복적인 작업입니다. 각 JSON 키를 읽고, 값에서 Java 타입을 판별하고, camelCase JSON에서 camelCase Java 필드로 명명 규칙을 변환하고, 중첩 객체에 대한 PascalCase 클래스 이름을 만들고, getter/setter 보일러플레이트를 추가해야 합니다. 15개 필드와 3개의 중첩 객체가 있는 JSON 객체라면 4개의 클래스, 30개 이상의 메서드를 작성하고 일관성을 유지해야 합니다. 변환기는 이 작업을 수 밀리초 안에 처리합니다.

JSON to Java 변환기를 사용하는 이유

Java POJO를 JSON에서 수동으로 생성하려면 각 필드를 직접 확인하고, 샘플 값에서 타입을 추론하고, getter/setter 쌍을 작성하고, 중첩 객체마다 이 과정을 반복해야 합니다. API 계약이 변경되면 모든 것을 수동으로 업데이트해야 합니다. 변환기는 이러한 기계적인 작업을 제거합니다.

즉시 POJO 생성
JSON을 붙여넣으면 1초 이내에 완전한 Java 클래스 정의를 얻습니다. 중첩 객체, 리스트, 기본 타입이 자동으로 감지되어 매핑됩니다.
🔒
개인정보 보호 우선 처리
변환은 JavaScript를 사용하여 전적으로 브라우저에서 실행됩니다. JSON 데이터가 기기 밖으로 나가지 않습니다. API 키, 토큰, 운영 데이터가 비공개로 유지됩니다.
📝
정확한 타입 추론
생성된 모든 필드에는 JSON 값에서 추론된 적절한 Java 타입이 사용됩니다: String, int, double, boolean, List<T>, 또는 null에 대한 Object. 래퍼 타입은 제네릭 내부에서 사용됩니다.
📦
설치 또는 가입 불필요
페이지를 열고 JSON을 붙여넣으면 됩니다. JDK, Maven 의존성, 계정이 필요 없습니다. 브라우저가 있는 모든 기기에서 사용 가능합니다.

JSON to Java 활용 사례

Spring Boot API 개발
API JSON 샘플에서 요청 및 응답 DTO를 생성합니다. 예상 페이로드 구조를 붙여넣으면 Spring 컨트롤러의 @RequestBody 및 @ResponseBody 어노테이션에 바로 사용할 수 있는 Java 클래스를 얻습니다.
Android 앱 개발
Retrofit 또는 Volley 네트워크 응답을 위한 모델 클래스를 생성합니다. 백엔드 API가 반환하는 JSON을 붙여넣으면 Gson 또는 Moshi 변환기와 호환되는 POJO를 얻습니다.
마이크로서비스 연동
Kafka, RabbitMQ, 또는 gRPC JSON 페이로드를 위한 타입이 지정된 메시지 클래스를 정의합니다. 샘플 메시지를 붙여넣어 서비스 간 예상 계약을 문서화하는 POJO를 생성합니다.
레거시 시스템 마이그레이션
타입이 지정된 클라이언트에서 REST 엔드포인트를 래핑할 때 JSON API 응답을 Java 클래스로 변환합니다. 느슨한 타입의 Map<String, Object> 패턴에서 적절한 도메인 모델로 마이그레이션할 때 유용합니다.
QA 및 테스트 자동화
API 응답 샘플에서 타입이 지정된 테스트 픽스처를 생성합니다. QA 엔지니어는 실제 JSON 응답을 붙여넣어 AssertJ 어설션이 포함된 JUnit 또는 TestNG 테스트 스위트에서 사용할 POJO 정의를 만들 수 있습니다.
Java OOP 패턴 학습
학생들은 어떤 JSON 구조든 붙여넣어 Java가 클래스, 필드, getter, setter, 중첩 타입으로 어떻게 표현하는지 확인할 수 있습니다. 생성된 결과물은 추상적인 개념을 구체적으로 보여줍니다.

JSON to Java 타입 매핑

모든 JSON 값은 특정 Java 타입에 매핑됩니다. 아래 표는 변환기가 각 JSON 타입을 Java 동등 타입으로 어떻게 변환하는지 보여줍니다. 대안(Alternative) 열은 List<T> 같은 제네릭 컨텍스트에서 사용되는 래퍼 타입이나 Records 같은 최신 Java 기능을 보여줍니다.

JSON 타입예시Java 타입대안
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

Java JSON 어노테이션 참조

Jackson 또는 Gson으로 JSON을 역직렬화할 때, 어노테이션은 JSON 키가 Java 필드에 어떻게 매핑되는지, 알 수 없는 필드를 어떻게 처리하는지, null 값을 어떻게 다루는지를 제어합니다. 이 참조는 생성된 POJO로 작업할 때 가장 자주 접하는 어노테이션을 다룹니다.

어노테이션용도라이브러리
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO vs Record vs Lombok

Java에는 JSON 데이터를 담기 위한 타입이 지정된 구조를 정의하는 세 가지 일반적인 방법이 있습니다. 각각 다른 프로젝트 스타일과 Java 버전에 적합합니다. POJO는 가장 넓은 호환성을 가진 전통적인 패턴입니다. Record는 불변 데이터의 보일러플레이트를 줄입니다. Lombok은 어노테이션을 통해 컴파일 시점에 getter, setter, 생성자를 생성합니다.

POJO
전통적인 Java 패턴. Java 8 이상에서 동작합니다. private 필드와 getter/setter 메서드를 직접 정의합니다. 가변성과 커스텀 로직에 대한 완전한 제어가 가능합니다. 모든 JSON 라이브러리(Jackson, Gson, Moshi)와 호환됩니다. Spring Boot, Android, 엔터프라이즈 코드베이스의 표준 선택입니다.
Record (Java 16+)
Java 16부터 내장(14에서 preview). 간결한 문법: record User(int id, String name)은 생성자, 접근자, equals, hashCode, toString을 생성합니다. 인스턴스는 불변입니다. Jackson은 버전 2.12부터 record를 지원합니다. setter가 필요 없는 값 객체와 DTO에 가장 적합합니다.
Lombok @Data
서드파티 컴파일 시점 어노테이션 프로세서. @Data는 getter, setter, equals, hashCode, toString을 생성합니다. @Builder는 빌더 패턴을 추가합니다. 가변성을 유지하면서 record 수준에 가까운 보일러플레이트 감소를 제공합니다. 빌드 도구(Maven/Gradle)에 Lombok 추가와 IDE 플러그인이 필요합니다.

코드 예제

이 예제들은 역직렬화를 위해 Jackson과 함께 생성된 Java POJO를 사용하는 방법, JavaScript와 Python에서 프로그래밍 방식으로 Java 클래스를 생성하는 방법, 그리고 일괄 생성을 위한 jsonschema2pojo CLI 도구 사용법을 보여줍니다.

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

자주 묻는 질문

POJO와 Java Bean의 차이는 무엇인가요?
POJO(Plain Old Java Object)는 프레임워크 의존성이 없는 단순한 Java 클래스입니다. Java Bean은 특정 규칙을 따르는 POJO입니다: 인수 없는 생성자, public getter/setter가 있는 private 필드, Serializable 구현. JSON 매핑에서 대부분의 라이브러리는 Bean 규칙(getter/setter)을 요구하지만 Serializable은 요구하지 않습니다. 이 도구가 생성하는 클래스는 Bean getter/setter 패턴을 따릅니다.
생성된 POJO와 함께 어떤 JSON 라이브러리를 사용해야 하나요?
Jackson(com.fasterxml.jackson)은 가장 널리 사용되는 Java JSON 라이브러리이며 Spring Boot의 기본값입니다. Gson(com.google.gson)은 Android 프로젝트에서 널리 사용되며 더 단순한 API를 제공합니다. Moshi는 Square에서 만든 최신 대안으로 Kotlin 상호 운용성을 위해 설계되었습니다. 세 라이브러리 모두 getter와 setter가 있는 표준 POJO와 함께 동작합니다.
변환기는 중첩된 JSON 객체를 어떻게 처리하나요?
중첩된 각 객체는 별도의 Java 클래스가 됩니다. "address"라는 JSON 필드에 "street"와 "city" 키가 포함된 객체가 있으면, 변환기는 해당 필드와 타입을 가진 Address 클래스를 생성하고 부모 필드의 타입을 Address로 지정합니다. 깊게 중첩된 구조는 여러 클래스 정의를 생성합니다.
JSON 필드가 null이면 어떻게 되나요?
null 필드는 Object로 타입이 지정됩니다. 변환기가 null 값만으로는 의도한 타입을 추론할 수 없기 때문입니다. 실제로는 API 계약을 파악한 후 Object를 예상 타입(String, Integer 등)으로 교체해야 합니다. Jackson을 사용하는 경우 null 값은 오류 없이 기본적으로 참조 타입 필드에 할당됩니다.
JSON에 POJO 대신 Java Record를 사용해야 하나요?
Record는 setter가 필요 없는 불변 데이터 전송 객체에 적합합니다. Jackson은 버전 2.12부터 record를 지원하며, Gson도 이후 버전에서 지원을 추가했습니다. 프로젝트가 Java 16 이상에서 실행되고 API 응답을 읽기 전용 데이터로 처리한다면, record는 보일러플레이트를 줄여줍니다. 가변성이 필요하거나 Java 8/11을 대상으로 한다면 POJO를 사용하세요.
유효한 Java 식별자가 아닌 JSON 키는 어떻게 처리하나요?
"first-name"이나 "2nd_place" 같은 JSON 키는 유효한 Java 필드 이름이 아닙니다. Jackson에서는 @JsonProperty("first-name"), Gson에서는 @SerializedName("first-name")을 사용하여 JSON 키를 firstName 같은 유효한 Java 필드 이름에 매핑하세요. 변환기는 키 이름을 자동으로 camelCase Java 필드로 변환합니다.
JSON 샘플 대신 JSON Schema에서 Java 클래스를 생성할 수 있나요?
이 도구는 JSON 데이터 샘플에서 클래스를 생성합니다. JSON Schema 입력이 필요하다면 jsonschema2pojo 프로젝트를 사용하세요(CLI 도구, Maven 플러그인, Gradle 플러그인으로 제공됩니다). JSON Schema 파일을 읽어 검증 제약 조건, 기본값, 스키마 설명의 문서가 포함된 어노테이션이 달린 Java 클래스를 생성합니다.