inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

85

김민석

작성한 질문수 2

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;
}

java spring spring-boot jpa

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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 로딩 문제를 해결하기 위한 방법론이 논의되었습니다.

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

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

강의 관련 외 질문입니다.

0

64

2

BeanCreationException

0

86

3

Update 후 UpdateMemberResponse 매핑할 때

0

46

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

96

2

페이징 + 검색조건 관련해서 질문드립니다.

0

70

1

Query Dsl Q파일 질문입니다.

0

81

1

루트 쿼리라는것은

0

58

1

메서드를 분리하는 기준

0

61

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

108

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

83

2

fetch join과 영속화와 OSIV의 관계

0

83

2

Distinct 사용 전 결과에 대한 의문

0

112

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

55

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

77

2

dto 필드 속 엔티티 여부

0

58

1

뷰템플릿 사용 시

0

76

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

85

1

DTO 대신 Form 사용은 안되나요?

0

133

1

OSIV ON 상태일 때

0

94

1

fetch join VS fetch join 페이징 궁금증

0

179

2

양방향 연관관계 알아보는 법?

0

103

1

16강 17강 간단 정리 이게 맞을까요 ?

0

163

2

데이터 초기화 시 CASCADE 옵션 궁금증

0

87

2