168 lines
4.8 KiB
Markdown
168 lines
4.8 KiB
Markdown
# **Jackson 어노테이션 정리 및 예제**
|
|
|
|
## **1. Jackson이란?**
|
|
**Jackson**은 **자바 객체를 JSON으로 변환하거나 JSON을 자바 객체로 변환하는 라이브러리**다.
|
|
Spring Boot에서도 기본적으로 사용되며, 속도가 빠르고 사용법이 간단하다.
|
|
|
|
**✅ Jackson의 주요 기능**
|
|
✔ **자바 객체 → JSON 변환 (`ObjectMapper.writeValue()`)**
|
|
✔ **JSON → 자바 객체 변환 (`ObjectMapper.readValue()`)**
|
|
✔ **JSON 포맷 커스터마이징 (필드 제외, 포맷 변경 등)**
|
|
|
|
---
|
|
|
|
## **2. Jackson 주요 어노테이션 정리**
|
|
|
|
### **📌 직렬화 (객체 → JSON) 관련 어노테이션**
|
|
| 어노테이션 | 설명 |
|
|
|------------|------|
|
|
| `@JsonProperty` | 필드의 JSON 속성명을 변경 |
|
|
| `@JsonIgnore` | 특정 필드를 JSON 변환에서 제외 |
|
|
| `@JsonIgnoreProperties` | 여러 필드를 JSON 변환에서 제외 |
|
|
| `@JsonInclude` | `null` 값 또는 기본값을 JSON에서 제외 |
|
|
| `@JsonGetter` | `getter` 메서드의 JSON 속성명을 변경 |
|
|
|
|
---
|
|
|
|
### **📌 역직렬화 (JSON → 객체) 관련 어노테이션**
|
|
| 어노테이션 | 설명 |
|
|
|------------|------|
|
|
| `@JsonCreator` | JSON 데이터를 객체로 변환할 때 생성자 지정 |
|
|
| `@JsonSetter` | `setter` 메서드의 JSON 속성명을 변경 |
|
|
| `@JsonAlias` | 여러 개의 JSON 키를 하나의 필드로 매핑 |
|
|
| `@JsonIgnoreProperties(ignoreUnknown = true)` | JSON에 없는 필드 무시 |
|
|
|
|
---
|
|
|
|
### **📌 날짜/시간 관련 어노테이션**
|
|
| 어노테이션 | 설명 |
|
|
|------------|------|
|
|
| `@JsonFormat` | 날짜/시간 포맷을 지정 |
|
|
| `@JsonDeserialize` | 커스텀 역직렬화 지정 |
|
|
| `@JsonSerialize` | 커스텀 직렬화 지정 |
|
|
|
|
---
|
|
|
|
### **📌 고급 기능 관련 어노테이션**
|
|
| 어노테이션 | 설명 |
|
|
|------------|------|
|
|
| `@JsonUnwrapped` | 중첩 객체의 필드를 부모 객체에 포함 |
|
|
| `@JsonTypeInfo` | 다형성(Polymorphism) 처리를 위한 타입 정보 추가 |
|
|
|
|
---
|
|
|
|
## **3. Jackson 어노테이션 예제**
|
|
|
|
### **✔ 1) `@JsonProperty` - JSON 속성명 변경**
|
|
```java
|
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
class User {
|
|
@JsonProperty("full_name")
|
|
private String name;
|
|
|
|
private int age;
|
|
|
|
public User(String name, int age) {
|
|
this.name = name;
|
|
this.age = age;
|
|
}
|
|
|
|
// Getter & Setter 생략
|
|
}
|
|
|
|
public class JacksonExample {
|
|
public static void main(String[] args) throws Exception {
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
User user = new User("홍길동", 30);
|
|
|
|
String json = objectMapper.writeValueAsString(user);
|
|
System.out.println(json); // 출력: {"full_name":"홍길동","age":30}
|
|
}
|
|
}
|
|
```
|
|
✅ **필드명이 `name`이지만, JSON에서는 `full_name`으로 출력됨!**
|
|
|
|
---
|
|
|
|
### **✔ 2) `@JsonIgnore` - 특정 필드 제외**
|
|
```java
|
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
|
|
class User {
|
|
private String name;
|
|
|
|
@JsonIgnore
|
|
private String password; // JSON에서 제외됨
|
|
|
|
public User(String name, String password) {
|
|
this.name = name;
|
|
this.password = password;
|
|
}
|
|
}
|
|
```
|
|
**🔹 변환 결과**
|
|
```json
|
|
{"name":"홍길동"}
|
|
```
|
|
✅ **`password` 필드는 JSON에서 제외됨!**
|
|
|
|
---
|
|
|
|
### **✔ 3) `@JsonInclude` - `null` 값 제외**
|
|
```java
|
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
|
|
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
|
class User {
|
|
private String name;
|
|
private String nickname; // null 값일 경우 JSON에서 제외됨
|
|
|
|
public User(String name, String nickname) {
|
|
this.name = name;
|
|
this.nickname = nickname;
|
|
}
|
|
}
|
|
```
|
|
**🔹 변환 결과 (`nickname`이 `null`일 때)**
|
|
```json
|
|
{"name":"홍길동"}
|
|
```
|
|
✅ **`nickname`이 `null`이면 JSON에서 제외됨!**
|
|
|
|
---
|
|
|
|
### **✔ 4) `@JsonAlias` - 여러 개의 키를 하나의 필드로 매핑**
|
|
```java
|
|
import com.fasterxml.jackson.annotation.JsonAlias;
|
|
|
|
class User {
|
|
@JsonAlias({"full_name", "user_name"})
|
|
private String name;
|
|
}
|
|
```
|
|
✅ **JSON의 `"full_name"` 또는 `"user_name"`이 모두 `name` 필드로 매핑됨!**
|
|
|
|
---
|
|
|
|
### **✔ 5) `@JsonFormat` - 날짜 포맷 변경**
|
|
```java
|
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
|
import java.util.Date;
|
|
|
|
class Event {
|
|
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
|
|
private Date eventDate;
|
|
}
|
|
```
|
|
✅ **날짜를 `"2025-03-06 14:30:00"` 형식으로 변환 가능!**
|
|
|
|
---
|
|
|
|
## **4. Jackson 정리**
|
|
✔ **Jackson은 JSON 변환을 위한 강력한 라이브러리**
|
|
✔ **어노테이션을 활용하면 JSON 변환을 세밀하게 제어 가능**
|
|
✔ **필드명 변경, 필드 제외, 날짜 포맷 지정 등 다양한 기능 지원**
|
|
|
|
✅ **Jackson을 사용하면 JSON 변환이 훨씬 쉽고 간결해짐!** |