๐Ÿš€JSON ์ง๋ ฌํ™” & ์—ญ์ง๋ ฌํ™” ์‹œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ 5๊ฐ€์ง€

์ •๋ณ‘์›…ยท2025๋…„ 3์›” 10์ผ
0

back-end

๋ชฉ๋ก ๋ณด๊ธฐ
5/6

๐Ÿ“Œ 1. null ๊ฐ’์ด JSON์— ํฌํ•จ๋˜๋Š” ๋ฌธ์ œ

๐Ÿ’ฅ ์ด์Šˆ

๊ฐ์ฒด์˜ ํ•„๋“œ ๊ฐ’์ด null์ผ ๊ฒฝ์šฐ, JSON ์‘๋‹ต์—๋„ null ํ•„๋“œ๊ฐ€ ํฌํ•จ๋จ.
๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด API ์‘๋‹ต ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•จ.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Jackson์˜ @JsonInclude(JsonInclude.Include.NON_NULL)์„ ์‚ฌ์šฉํ•˜์—ฌ null ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ.

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;

class Person {
    public String name;

    @JsonInclude(JsonInclude.Include.NON_NULL) // null ๊ฐ’ ์ œ์™ธ
    public String nickname;

    public Person(String name, String nickname) {
        this.name = name;
        this.nickname = nickname;
    }
}

public class JsonNullExample {
    public static void main(String[] args) throws Exception {
        Person person = new Person("ํ™๊ธธ๋™", null);
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = objectMapper.writeValueAsString(person);
        System.out.println(jsonString); // {"name":"ํ™๊ธธ๋™"}
    }
}

๐Ÿ“Œ 2. JSON ํ•„๋“œ๋ช…๊ณผ Java ํ•„๋“œ๋ช…์ด ๋‹ค๋ฅผ ๋•Œ ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜

๐Ÿ’ฅ ์ด์Šˆ

JSON ํ‚ค ์ด๋ฆ„๊ณผ Java ๊ฐ์ฒด ํ•„๋“œ๋ช…์ด ๋‹ค๋ฅด๋ฉด ์—ญ์ง๋ ฌํ™” ์‹คํŒจ (MismatchedInputException ๋ฐœ์ƒ)

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

@JsonProperty("json_key")์„ ์‚ฌ์šฉํ•˜์—ฌ JSON ํ•„๋“œ๋ช…์„ Java ๊ฐ์ฒด์˜ ํ•„๋“œ๋ช…๊ณผ ๋งคํ•‘.

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ

import com.fasterxml.jackson.annotation.JsonProperty;

class User {
    @JsonProperty("user_name") // JSON ํ•„๋“œ๋ช…์„ Java ํ•„๋“œ์™€ ๋งคํ•‘
    public String name;

    public User() {} // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์š”
}

public class JsonPropertyExample {
    public static void main(String[] args) throws Exception {
        String jsonString = "{\"user_name\":\"ํ™๊ธธ๋™\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(jsonString, User.class);
        System.out.println(user.name); // ํ™๊ธธ๋™
    }
}

๐Ÿ“Œ 3. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์—†์Œ (์—ญ์ง๋ ฌํ™” ์‹คํŒจ)

๐Ÿ’ฅ ์ด์Šˆ

JSON์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ์—ญ์ง๋ ฌํ™”๊ฐ€ ์‹คํŒจํ•จ.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException ๋ฐœ์ƒ.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€.

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ

class Employee {
    public String name;
    public int age;

    // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์—†์œผ๋ฉด ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜ ๋ฐœ์ƒ!
    public Employee() {}

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

๐Ÿ“Œ 4. ๋‚ ์งœ(Date, LocalDate) ํฌ๋งท ๋ฌธ์ œ

๐Ÿ’ฅ ์ด์Šˆ

Date ๋˜๋Š” LocalDateTime์„ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์–ด๋ ค์šด timestamp(์ˆซ์ž)๋กœ ๋ณ€ํ™˜๋จ.
API์—์„œ ๋‚ ์งœ๋ฅผ yyyy-MM-dd ํ˜•์‹์œผ๋กœ ์‘๋‹ต๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ ๋ถˆํŽธํ•จ.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

@JsonFormat์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ ์งœ ํฌ๋งท์„ ์ง€์ •.

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;

class Order {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    public LocalDate orderDate;

    public Order(LocalDate orderDate) {
        this.orderDate = orderDate;
    }
}

๐Ÿ“Œ JSON ๋ณ€ํ™˜ ๊ฒฐ๊ณผ

{"orderDate": "2025-03-10"}

๐Ÿ“Œ 5. Lombok๊ณผ Jackson ์ถฉ๋Œ (@Data vs @Getter / @Setter)

๐Ÿ’ฅ ์ด์Šˆ

Lombok์˜ @Data ์–ด๋…ธํ…Œ์ด์…˜์€ equals()์™€ hashCode()๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ ์ง๋ ฌํ™” ์‹œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ.
JSON์— ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•  ํ•„๋“œ๊ฐ€ ์ง๋ ฌํ™”๋  ์ˆ˜๋„ ์žˆ์Œ.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

@Getter, @Setter๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ @JsonIgnoreProperties(ignoreUnknown = true) ์ถ”๊ฐ€.

๐Ÿ“ ์˜ˆ์ œ ์ฝ”๋“œ

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true) // JSON์— ์—†๋Š” ํ•„๋“œ๋Š” ๋ฌด์‹œ
class Product {
    private String name;
}

๐ŸŽฏ ๊ฒฐ๋ก 

  1. @JsonInclude(JsonInclude.Include.NON_NULL) โ†’ null ํ•„๋“œ ์ œ์™ธ
  2. @JsonProperty("json_key") โ†’ JSON ํ•„๋“œ๋ช…๊ณผ Java ํ•„๋“œ๋ช… ๋งž์ถค
  3. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ถ”๊ฐ€ โ†’ ์—ญ์ง๋ ฌํ™” ํ•„์ˆ˜
  4. @JsonFormat โ†’ ๋‚ ์งœ ํฌ๋งท ์ง€์ •
  5. @JsonIgnoreProperties(ignoreUnknown = true) โ†’ Lombok๊ณผ์˜ ์ถฉ๋Œ ๋ฐฉ์ง€

๐ŸŽฏ ์ด์Šˆ ๋ฐฉ์ง€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ (Markdown ํ˜•์‹)

์ด์Šˆํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
null ๊ฐ’ ํฌํ•จ ๋ฌธ์ œ@JsonInclude(JsonInclude.Include.NON_NULL)
JSON ํ•„๋“œ๋ช… ๋ถˆ์ผ์น˜@JsonProperty("json_key")
๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์—†์Œ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ถ”๊ฐ€
๋‚ ์งœ ํฌ๋งท ๋ฌธ์ œ@JsonFormat(pattern = "yyyy-MM-dd")
Lombok & Jackson ์ถฉ๋Œ@JsonIgnoreProperties(ignoreUnknown = true)
profile
์ธ์ƒ์€ IT ๋…ธ๊ฐ€๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€