
readTree()로 JSON을 트리로 파싱하기Redis Pub/Sub로 메시지를 주고받으면서 JsonNode, readTree()를 다시 정리해봤다.
JsonNode payload = objectMapper.readTree(message.getBody());
message.getBody() → Redis 메시지의 본문을 바이트 배열(byte[])로 꺼냄objectMapper.readTree(...) → 그 바이트(JSON 텍스트)를 파싱해서 트리 구조의 객체(JsonNode)로 변환JSON은 객체 안에 또 다른 객체/배열이 중첩될 수 있는 구조다.
JsonNode (root)
/ \
sender content
"akakak" "안녕"
실제 나무처럼 하나에서 여러 갈래로 뻗어나가는 모양이라 "트리"라고 부른다.
String sender = payload.get("sender").asText(); // "akakak"
String content = payload.get("content").asText(); // "안녕"
.get("필드명")으로 자식 노드를 찾고, .asText()/.asLong() 등으로 원하는 타입으로 변환한다.
JsonNode vs 특정 DTO 클래스| 방식 | 언제 쓰나 |
|---|---|
readValue(json, Dto.class) | 필드가 고정되어 있고, 특정 클래스로 딱 맞춰 받고 싶을 때 |
readTree(json) → JsonNode | 여러 종류의 메시지가 섞여 오거나, 필요한 필드만 유연하게 꺼내 쓰고 싶을 때 |
WebSocket처럼 type 필드로 여러 메시지 종류를 구분해야 하는 상황에서는 JsonNode가 더 유연하다.
writeValueAsString(객체)readValue(...) 또는 readTree(...)Map으로 즉석 JSON 만들기새 DTO 클래스를 안 만들고 그 자리에서 바로 JSON 구조를 만들고 싶을 때는 Map을 쓴다.
Map<String, Object> payload = Map.of(
"worldId", worldId,
"message", message
);
String json = objectMapper.writeValueAsString(payload);
주의할 점: Map.of(worldId, message)처럼 값 자체를 키 자리에 넣으면 JSON 필드명이 "worldId"가 아니라 worldId의 실제 값(예: "7")이 되어버린다.
반드시 Map.of("worldId", worldId, ...)처럼 필드명 문자열을 키로 넣어야 한다.