강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김민석님의 프로필 이미지
김민석

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V1: 엔티티 직접 노출

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

작성

·

53

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
현재 최신 버전인 SpringBoot4 + Hibernate7 을 사용해서 강의를 듣고 있습니다.
이 버전에서는 (Hibernate 모듈 등록 X + 프록시 직접 초기화 X] 상태에서 API 응답으로 엔티티를 곧바로 반환하게 되면, 강의 내용처럼 오류(예외)가 나지 않고, Jackson이 json을 만드는 과정에서 getter 등을 호출해서 프록시 객체들을 자동으로 초기화(로딩)시키는 것처럼 보이네요. 응답 결과에서도 모두 출력되고요
(물론, @JsonIgnore 없으면 무한루프는 발생)

그래서 강의 내용처럼 오류가 나도록 하는 방법을 한참 찾다가 현재 버전에서 Hibernate 모듈을 등록하는 방법을 발견해서 공유해봅니다. (메뉴얼에도 없길래)

[등록 방법]
1. 라이브러리 등록
implementation 'tools.jackson.datatype:jackson-datatype-hibernate7'

2. 빈 등록
@Bean
public Hibernate7Module hibernate7Module() {
Hibernate7Module module = new Hibernate7Module();
// module.configure(Hibernate7Module.Feature.FORCE_LAZY_LOADING, true);
return module;
}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 김민석님!

SpringBoot4와 Hibernate7의 조합에서 발생하는 Jackson과의 통합 문제에 대해 말씀 주셨군요. 최신 버전에서는 Hibernate 모듈 등록이 없어도 엔티티가 정상적으로 JSON으로 변환되는 상태를 경험하셨다고 하셨습니다. 이는 아마도 Hibernate의 자동 초기화 기능으로 인해, 초기화된 상태로 JSON 변환이 진행된 경우일 수 있습니다.

그러나 여러 상황에서 엔티티가 프록시로 남아있는 경우, Jackson이 해당 프록시 객체를 직렬화하려고 할 때 예외가 발생할 수도 있습니다. 이를 방지하기 위해 jackson-datatype-hibernate 모듈을 사용하여 Jackson이 Hibernate 객체를 올바르게 처리할 수 있도록 환경을 구성하는 방법을 공유해주셨네요.

현재 여러분이 말씀하신 의존성은 다음과 같이 설정하여 사용할 수 있습니다:

implementation 'tools.jackson.datatype:jackson-datatype-hibernate7'

이 설정은 Jackson이 Hibernate 지연 로딩된 프록시 객체를 처리할 수 있도록 돕습니다. 그러나 실무에서는 엔티티를 직접 API 응답으로 노출하는 대신, DTO(Data Transfer Object) 패턴을 사용하여 안전성과 유지 보수성을 높이는 것이 권장됩니다.

이전에 유사한 주제에 대해 논의된 게시물을 몇 가지 발견했습니다:

  1. java.lang.NoClassDefFoundError: javax/persistence/Transient 에러

    • 이 게시물에서는 Hibernate5와 Jackson 호환 문제를 다루고 있으며, 스프링 부트 최신 버전에서 해결 방법에 대해 안내하고 있습니다.
  2. 2가지 질문 추가로 드립니다

    • 여기에서는 엔티티와 스레드 안전성 문제, 그리고 Lazy 로딩 문제를 해결하기 위한 방법론이 논의되었습니다.

김민석님이 이미 프로젝트에서 해결 방법을 찾으셨다는 점을 높이 평가하며, 여러분이 제안하신 모듈 등록 방식이 같은 상황에 놓인 다른 학습자에게도 큰 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김민석님의 프로필 이미지
김민석

작성한 질문수

질문하기