버전 관련하여 문의드립니다
45
작성한 질문수 4
강의 예제는 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 기준의 해당 예제 코드도 안내 부탁드려도 될까요? )
답변 1
0
안녕하세요, 인프런 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은 별도의 마이그레이션 학습 대상으로 접근하시는 것을 추천드립니다.
참고 문서:
이론파트 재탕문제
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





