inflearn logo
강의

講義

知識共有

Webで扱うネットワーク通信 - 基礎からHTTP、SSE、WebSocketそしてWebRTC P2P通信まで

アプリケーションプロトコルの作成

버전 관련하여 문의드립니다

56

strayer

投稿した質問数 4

0

강의 예제는 Spring Boot 3.5.7 기준인데, 현재 프로젝트를 Spring Boot 4.1.0으로 생성해서 따라가고 있습니다.

Jackson 3부터 패키지가 com.fasterxml.jackson.*에서 tools.jackson.*으로 변경되고, JsonDeserializer도 ValueDeserializer로 변경된 것으로 확인했습니다.

그래서 우선 아래와 같이 수정해서 진행하고 있습니다.

import tools.jackson.core.JacksonException;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ValueDeserializer;

public class JsonStringDeserializer extends ValueDeserializer<String> {

    @Override
    public String deserialize(
            JsonParser jsonParser,
            DeserializationContext deserializationContext
    ) throws JacksonException {

        JsonNode node = deserializationContext.readTree(jsonParser);

        return node.toString();
    }
}

Spring Boot 4.1.0으로 계속 진행하면서 이런 식으로 변경된 API에 맞춰 수정해도 괜찮을까요?

아니면 이후에도 버전 차이로 수정해야 할 부분이 많이 발생할 수 있어서, 강의에서는 Spring Boot 3.5.x로 맞추는 것을 권장하시는지 궁금합니다.

( 가능하다면 Spring Boot 4 / Jackson 3 기준의 해당 예제 코드도 안내 부탁드려도 될까요? )

java spring-boot

回答 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

아직안팔리는_1인창업자님, 결론부터 말씀드리면 강의를 그대로 따라가실 목적이라면 Spring Boot 3.5.x로 맞추시는 것을 권장드립니다.

Spring Boot 4와 Jackson 3에서는 다음과 같이 API 변경 범위가 있습니다.

  • com.fasterxml.jackson.* 패키지에서 tools.jackson.* 패키지로 변경
  • JsonDeserializer 대신 ValueDeserializer 사용
  • Jackson의 일부 메서드와 확장 클래스 사용 방식 변경
  • Spring Boot에서 제공하는 Jackson 관련 추상 클래스와 설정 방식의 차이 가능성
  • 강의 예제의 의존성, import, 직렬화·역직렬화 설정 코드 수정 필요

따라서 현재 작성하신 것처럼 단순히 import와 부모 클래스만 변경해서 해결되는 부분도 있지만, 이후 예제에서 Jackson 설정이나 커스텀 직렬화·역직렬화를 다루면 추가 수정이 발생할 수 있습니다.

강의의 예제 코드가 다음과 같다고 가정하면 Spring Boot 3.x에서는 JsonDeserializer를 사용합니다.

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class JsonStringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(
            JsonParser jsonParser,
            DeserializationContext deserializationContext
    ) throws IOException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);

        return node.toString();
    }
}

Spring Boot 3에서는 커스텀 역직렬화기를 @JsonComponent로 등록할 수도 있습니다.

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

@JsonComponent
public class JsonStringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(
            JsonParser jsonParser,
            DeserializationContext deserializationContext
    ) throws IOException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);

        return node.toString();
    }
}

Spring Boot 4와 Jackson 3 기준으로는 질문하신 것처럼 다음과 같이 변경하는 방향으로 이해하시면 됩니다.

import org.springframework.boot.jackson.JsonComponent;
import tools.jackson.core.JacksonException;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ValueDeserializer;

@JsonComponent
public class JsonStringDeserializer extends ValueDeserializer<String> {

    @Override
    public String deserialize(
            JsonParser jsonParser,
            DeserializationContext deserializationContext
    ) throws JacksonException {
        JsonNode node = deserializationContext.readTree(jsonParser);

        return node.toString();
    }
}

다만 node.toString()의 결과가 의도한 값인지 확인하셔야 합니다.

예를 들어 입력 JSON이 다음과 같다면,

"hello"

node.toString()은 JSON 형식인 다음 값을 반환할 수 있습니다.

"hello"

따옴표를 제외한 문자열 값인 hello가 필요하다면 Jackson 3의 JsonNode에서 제공하는 문자열 추출 메서드에 맞춰 변경해야 합니다.

즉, 해당 역직렬화기가 JSON 원문을 문자열로 보존하기 위한 목적이라면 toString()이 적절할 수 있지만, JSON 문자열의 실제 값만 얻으려는 목적이라면 문자열 전용 메서드를 사용해야 합니다.

Spring Boot 공식 문서에서도 커스텀 직렬화·역직렬화기는 JsonSerializer, JsonDeserializer 또는 @JsonComponent를 이용해 등록할 수 있다고 설명하고 있습니다. 또한 @JsonComponent가 붙은 빈은 Jackson에 자동 등록됩니다.

따라서 선택 기준은 다음과 같습니다.

  • 강의 내용을 빠르게 따라가는 것이 목적이라면 Spring Boot 3.5.x 권장
  • Spring Boot 4와 Jackson 3을 학습하는 것이 목적이라면 현재 방식으로 진행 가능
  • 다만 이후 예제마다 변경된 API와 import를 직접 확인해야 함
  • 에러가 발생했을 때 강의의 Spring Boot 3 코드와 현재 Jackson 3 코드를 비교해야 함

특히 네트워크 통신 자체인 HTTP, SSE, WebSocket, WebRTC의 개념은 Spring Boot 버전이 바뀌어도 크게 달라지지 않습니다.

반면 DTO 변환, Jackson 설정, 커스텀 직렬화·역직렬화, 메시지 변환기 설정 부분은 버전 차이의 영향을 받을 수 있습니다.

따라서 강의 실습을 안정적으로 완료하려면 Spring Boot 3.5.x를 사용하시고, Spring Boot 4와 Jackson 3은 별도의 마이그레이션 학습 대상으로 접근하시는 것을 추천드립니다.

참고 문서:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.json.jackson.custom-serializers-and-deserializers

JpaPagingItemReader는 좋은게 없는거야..??

0

13

1

입문 강의 듣고 바로 들어도 괜찮을까요?

0

16

1

리프레시토큰

0

22

1

DB 연결 후 회원가입 시 생성되는 id 번호 질문

0

32

1

선생님 안녕하세요.

0

46

0

https 도메인

0

40

1

로그인 확인

0

62

3

ttl 산정 기준

0

42

1

정처기 2026-3 실기 문의

0

91

2

정처기 실기 3회 컴싸 사용 여부

0

58

1

자바 킴쌤 클래스 기초part2.pdf파일은 어디서 받을 수 있나요?

0

38

1

오타 제보 드립니다.

0

62

2

모의고사 1 회 2번문제 중

0

75

2

26-2 이론문제 재탕

1

57

1

26-2년도 코드문제

0

38

0

26-2 코드문제

0

46

1

15분 48초 질문

0

63

2

26-1년도 이론문제 재탕

0

70

1

26-1년도 코드문제 재탕

0

50

0

이론재탕만 눈치챘어도

0

80

1

25-3년도 이론문제 재탕

0

60

1

25-3년도 코드문제 재탕

0

46

0

출력값 문의

0

59

2

강의 관련 질문드립니다.

1

67

2