
Spring Boot에서 객체를 JSON으로 변환할 때, Jackson이라는 라이브러리를 많이 쓴다.
이 라이브러리는 Java 객체를 JSON으로 변환(직렬화)하거나 JSON을 Java 객체로 변환(역직렬화)하는 역할을 한다.
이때, Jackson이 제공하는 여러 어노테이션을 사용하면 JSON 데이터를 더 쉽게 다룰 수 있음.
"NULL 값은 JSON에서 빼줘!"
기본적으로 Java 객체의 필드는 모두 JSON으로 변환됨.
하지만 NULL 값을 가진 필드도 포함되면 보기 지저분할 수 있어서 클래스 선언부분 위에 @JsonInclude(JsonInclude.Include.NON_NULL)를 사용하면 NULL인 필드는 JSON에서 제외하여 깔끔하게 값을 반환할수 있음.
(예시)
@JsonInclude(JsonInclude.Include.NON_NULL) // 혹은 @JsonInclude(Include.NON_NULL)을 사용해도 됨.
public class UserResponseDto {
private String name;
private String address; // null일 경우 JSON에서 제외
}
→ {"name": "Alice"} (address가 null이면 JSON에서 아예 빠져서 출력됨)
"JSON에서 보이는 필드 이름을 변경하고 싶어!"
Java에서는 변수명을 camelCase로 많이 쓰지만, 프론트엔드에서는 snake_case를 선호하는 경우가 있다.
@JsonProperty("user_name")을 사용하면 Java 객체의 userName 필드를 JSON에서 user_name으로 변환할 수 있다.
(예시)
public class UserDto {
@JsonProperty("user_name")
private String userName;
}
→ {"user_name": "Alice"}
"모든 필드의 네이밍 컨벤션을 한 번에 바꾸고 싶어!"
@JsonProperty를 필드마다 넣는 건 상당히 귀찮다.
따라서 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)을 사용하면 클래스 내 모든 필드를 한 번에 snake_case로 변환 가능.
(예시)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Student {
private String myName;
private String myAge;
}
→ {"my_name": "Alice", "my_age": "20"}
"출력시 JSON 필드 순서를 정하고 싶어!"
기본적으로 JSON은 필드 순서를 보장하지 않지만, 특정 순서대로 정렬하고 싶을 때 사용
(예시)
@JsonPropertyOrder({"userId", "userName"})
public class UserDto {
private String userName;
private Integer userId;
}
→ {"userId": 1, "userName": "Alice"}
"JSON에서 특정 필드를 숨기고 싶어!"
@JsonIgnore를 사용하면 JSON 응답에서 특정 필드를 제외할 수 있어.
(예시)
public class UserDto {
private String name;
@JsonIgnore
private String password; // JSON에서 제외됨
}
→ {"name": "Alice"} (password 필드는 보이지 않음)
"날짜 포맷을 변경하고 싶어!"
Java의 LocalDateTime을 JSON으로 변환하면 이상한 포맷이 나올 수 있음.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")를 사용하면 원하는 포맷으로 변환 가능.
(예시)
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime eventDate;
}
→ {"eventDate": "2025-03-05 15:30:00"}
"자주 쓰는 JSON 어노테이션을 하나로 만들어서 사용하고 싶어!"
여러 어노테이션을 조합해서 새로운 커스텀 어노테이션을 만들 때 사용.
(예시)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder
public @interface CustomJson {
}
"Enum을 JSON에서 보기 좋게 변환하고 싶어!"
기본적으로 Java의 Enum 값은 JSON에서 "ENUM_NAME" 형태로 반환돼.
@JsonValue, @JsonCreator 등을 사용하면 변환 방식을 조정할 수 있어.
(예시 - 특정 값만 반환)
public enum Status {
@JsonValue
SUCCESS("Success"),
FAILURE("Failure");
private String value;
Status(String value) {
this.value = value;
}
}
→ {"status": "Success"}
| 어노테이션 | 역할 |
|---|---|
@JsonInclude | NULL 값 제외 가능 |
@JsonProperty | 필드명을 JSON에서 변경 |
@JsonNaming | 모든 필드의 네이밍 컨벤션 변경 |
@JsonPropertyOrder | JSON 필드 순서 지정 |
@JsonIgnore | 특정 필드를 JSON에서 제외 |
@JsonFormat | 날짜 형식을 변환 |
@JacksonAnnotationsInside | 여러 어노테이션을 조합한 커스텀 어노테이션 생성 |
@JsonValue | Enum을 JSON에서 특정 값으로 변환 |
@JsonCreator | JSON 데이터를 특정 Enum 값으로 변환 |