1. 객체를 JSON형식으로 변환 (직렬화)
단계별 설명
- TokenBuffer buffer = new TokenBuffer(null);:
- TokenBuffer는 Jackson에서 제공하는 클래스입니다. JSON 내용을 메모리에 저장할 수 있는 버퍼 역할을 합니다. 이 버퍼는 일종의 중간 저장소로 사용됩니다.
- ObjectMapper objectMapper = new ObjectMapper();:
- Jackson의 핵심 클래스 중 하나인 ObjectMapper를 생성합니다. 이 객체는 Java 객체와 JSON 간의 변환 작업을 수행합니다.
- objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);:
- ObjectMapper의 직렬화 설정을 변경하여 null 값을 가진 속성은 JSON 출력에서 제외하도록 설정합니다. 즉, null인 필드는 JSON 결과에 포함되지 않습니다.
- objectMapper.writeValue(buffer, object);:
- 주어진 객체를 TokenBuffer에 JSON 형식으로 씁니다. 이 단계에서 객체의 JSON 표현이 메모리 내의 버퍼에 저장됩니다.
- JsonNode root = objectMapper.readTree(buffer.asParser());:
- TokenBuffer에서 JSON 데이터를 파싱하여 JsonNode 트리를 만듭니다. JsonNode는 Jackson의 JSON 트리 모델을 표현하는 클래스입니다.
- String jsonText = objectMapper.writeValueAsString(root);:
- JsonNode 트리를 JSON 문자열로 변환합니다. 이 단계에서 JSON 트리 구조가 문자열로 직렬화됩니다.
- jsonText = jsonText.replaceAll("null", "\"\"");:
- JSON 문자열 내의 "null" 값을 빈 문자열 ""로 대체합니다. 이로 인해 JSON 결과에서 null 값이 빈 문자열로 대체됩니다.
- return jsonText;:
- 최종적으로 변환된 JSON 문자열을 반환합니다
토큰버퍼를 사용한 이유
정리하면
원래 코드에서 TokenBuffer를 사용하는 구체적인 이유는 다음과 같을 수 있습니다:
- 성능 최적화: 대량의 JSON 데이터를 처리할 때 메모리 버퍼를 사용하여 효율성을 높일 수 있습니다.
- 복잡한 JSON 변환: JSON 데이터를 트리 구조로 변환한 후, 특정 노드를 수정하거나 추가하는 등의 복잡한 작업을 수행할 수 있습니다.
- 일관성 유지: 동일한 ObjectMapper 설정을 사용하여 여러 단계의 변환을 거쳐 JSON 데이터를 일관되게 유지할 수 있습니다.
이와 같은 이유로 TokenBuffer를 사용하여 객체를 메모리에 저장한 후, JSON 형식으로 변환하는 단계를 거치는 것입니다.
그러나 토큰버퍼 사용 안하고 할 수 있다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JsonUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
public static String marshallingJson(Object object) throws IOException {
// null 값은 직렬화에서 제외
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
// 객체를 JsonNode 트리로 변환
ObjectNode root = objectMapper.valueToTree(object);
// JSON 트리를 JSON 문자열로 변환
String jsonText = objectMapper.writeValueAsString(root);
// "null" 값을 빈 문자열로 변환
// 이미 null값은 직렬화에서 제외하는 메소드 했으니 없어도 될듯
//jsonText = jsonText.replaceAll("null", "\"\"");
return jsonText;
}
}
2. JSON을 객체로 변환 (역직렬화)
<T>는 제네릭 타입 매개변수 선언하는 이 부분은 메소드가 제네릭 타입 T를 사용할 것임을 컴파일러에게 알려주는 역활을 하고
그 옆에 제네릭 T는 메소드 반환타입을 말하는거다.
objectMapper.readValue(data, valueType)는 JSON 문자열을 valueType 클래스의 객체로 변환하는거다.
그리고 예를들어 Person객체로 반환한다했을때 기본생성자는 필수인듯하고,setter방식으로 객체필드에 값을 매칭하거나
생성자 방식으로는 이렇게도 할 수 있다.
public class Person {
private String name;
private int age;
// 필드를 받는 생성자에 @JsonCreator와 @JsonProperty 애노테이션 사용
@JsonCreator
public Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {
this.name = name;
this.age = age;
}
}
'플랫폼엘 정리or해석' 카테고리의 다른 글
커스텀 어노테이션 적용후,인터셉터에 적용하기 (0) | 2024.07.12 |
---|---|
실무 다른 동료 SQL문 분석 (0) | 2024.07.11 |
MySql의 암호화,복호화 (0) | 2024.07.04 |
XSS 공격 방지용 XssFilter (0) | 2024.06.25 |
JSP의 코드 해석 (0) | 2024.06.24 |