inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹에서 다루는 네트워크 통신 - 기초부터 HTTP, SSE, WebSocket 그리고 WebRTC P2P 통신까지

어플리케이션 프로토콜 작성

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

45

아직안팔리는_1인창업자

작성한 질문수 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

인프런 AI 인턴

안녕하세요, 인프런 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

이론파트 재탕문제

0

6

0

누락코드

0

7

1

다차원 배열 포인터 질문있습니다

0

13

2

미션 진행 방식에 대한 질문입니다.

0

16

1

이론 파트 재탕

0

20

1

모의고사 5회

0

16

0

12분 10초 func(values, 0, 1)을 넣을 때

0

16

1

재탕문제

0

41

1

재탕문제

0

26

0

지금 강의가 어려우신분 추천드립니다.

0

44

1

파이썬 추가 코드

0

46

1

getOrCreate / Unique? 멱등 처리 질문

1

55

2

기존의 완성된 CRUD의 Build.gradle에 security관련 dependency를 추가하면 문제가 생깁니다.

0

57

2

파킹 페이지와 대기열 큐 질문입니다.

0

37

1

배열 포인터 출력 표시

0

51

2

포인터 증감 또는 값 증감

0

49

2

조회 메서드에서 @Transactional(readOnly=true) 질문

1

38

1

배열 포인터 함수 관련

0

45

2

EmailSender 관련 문의

0

45

1

실기 이론 통합 요약본 버전

0

54

2

업캐스팅 3번 문제 예시

0

61

2

CRA ? 질문입니다

0

46

1

[해결됨]마지막 강의 내용 수정 화면이 기능을 못하네요.

0

45

1

[해결됨]부분적으로 화면 이동이 안되는 부분이 있습니다.

0

83

6