내일배움캠프 TIL 16일차 - readTree

정광훈(단기심화_9기)·2026년 9월 21일

TIL (Today I Learned)

목록 보기
125/129
post-thumbnail

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"          "안녕"
  • 뿌리(root): 최상위 JSON 객체 하나
  • 가지(branch): 필드로 갈라지는 부분
  • 잎(leaf): 더 이상 안 나눠지는 실제 값

실제 나무처럼 하나에서 여러 갈래로 뻗어나가는 모양이라 "트리"라고 부른다.

값 꺼내는 법

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가 더 유연하다.

직렬화(보낼 때)와 역직렬화(받을 때) 구분

  • 보낼 때 (직렬화): 객체 → JSON 문자열 → writeValueAsString(객체)
  • 받을 때 (역직렬화): JSON(바이트/문자열) → 객체/트리 → 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, ...)처럼 필드명 문자열을 키로 넣어야 한다.

profile
내배캠 Unity_9기 / 게임 서버 단기 심화_9기

0개의 댓글