hibernate5JakartaModule 의 이상한 결과에 대해 질문있습니다.
257
작성한 질문수 115
안녕하세요. 강의를 따라
@JsonIgnore와 hibernate5JakartaModule 도 빈등록을 진행했습니다.
아래 POSTMAN결과를 보면 첫 주문은 연관된 필드( orderItems)가 null로 잘 출력되는 것을 확인할 수 있었습니다. 비록 지금은 null로 출력됐지만 강제지연로딩을 설정하면 주문상품 요소들이 추가로 보여집니다.
반면, 두 번째 주문은 주문상품들이 다 보여지고 있습니다.
첫 번째 주문처럼 결과가 보여줘야할 것 같은데 말이죠.
hibernate5JakartaModule 은 결과를 보장할 수 없는 것인지 궁금합니다.
[
{
"id": 1,
"member": null,
"orderItems": null,
"delivery": null,
"orderDate": "2025-02-21T07:23:38.479148",
"status": "ORDER",
"totalPrice": 50000
},
{
"id": 2,
"member": null,
"orderItems": [
{
"id": 3,
"item": null,
"orderPrice": 20000,
"count": 3,
"totalPrice": 60000
},
{
"id": 4,
"item": null,
"orderPrice": 40000,
"count": 4,
"totalPrice": 160000
}
],
"delivery": null,
"orderDate": "2025-02-21T07:23:38.663151",
"status": "ORDER",
"totalPrice": 220000
}
]
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 창신동 장첸님.
Hibernate의 hibernate5JakartaModule을 사용하면 Hibernate에서 관리하는 엔티티의 지연 로딩(Lazy Loading) 설정에 따라 프록시 객체들이 초기화되지 않거나, 연관된 엔티티들이 null로 반환되는 경우가 발생할 수 있습니다.
지연 로딩은 데이터베이스 성능 최적화를 위해 사용되지만, 때로는 예상하지 못한 결과를 초래할 수도 있습니다. 아래는 이 문제와 관련된 몇 가지 원인과 해결책입니다:
지연 로딩이 작동하는 원리: Hibernate는 필요한 경우에만 연관된 엔티티를 데이터베이스에서 로드합니다. 따라서 프록시 객체는 초기화되지 않은 상태로 남아 있을 수 있으며, HTTP 응답 생성 시 JSON 직렬화를 위해 초기화되지 않은 필드가 null로 표시될 수 있습니다.
강제 초기화:
hibernate5JakartaModule로 지연 로딩을 초기화하려면, “FORCE_LAZY_LOADING” 옵션을 활성화해야 합니다. 이 옵션이 활성화되어 있지 않으면 기본적으로 초기화되지 않은 연관 필드가 null로 나타납니다.프록시 객체 초기화 확인: 두 번째 주문에서
orderItems가 보이는 이유는 그 지연 로딩이 이미 이전 시점에서 초기화되었기 때문일 수 있습니다. 예를 들어, 서비스 레이어에서 해당 엔티티의 데이터를 접근하게 되면 Hibernate는 필요한 데이터를 즉시 로드할 수 있습니다.
이 문제를 해결하려면, 필요한 시점에서 연관된 엔티티를 모든 상황에서 확실히 로드할 수 있도록 설정해야 합니다. 또는 초기화가 필요하지 않은 필드는 @JsonIgnore를 통해 명시적으로 직렬화에서 제외할 수 있습니다.
이 링크들은 유사한 문제에 대한 질문들이니 확인해보시면 도움되실 것입니다:
- orderItems 에 null이 들어가는 이유가 궁금합니다.
- 5:05초 경 orderItems 에 null이 아닌 정상값이 조회가 됩니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
강의 관련 외 질문입니다.
0
77
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
1
96
1
BeanCreationException
0
95
3
Update 후 UpdateMemberResponse 매핑할 때
0
54
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
102
2
페이징 + 검색조건 관련해서 질문드립니다.
0
74
1
Query Dsl Q파일 질문입니다.
0
86
1
루트 쿼리라는것은
0
62
1
메서드를 분리하는 기준
0
70
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
115
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
91
2
fetch join과 영속화와 OSIV의 관계
0
90
2
Distinct 사용 전 결과에 대한 의문
0
117
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
61
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
79
2
dto 필드 속 엔티티 여부
0
62
1
뷰템플릿 사용 시
0
82
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
87
1
DTO 대신 Form 사용은 안되나요?
0
140
1
OSIV ON 상태일 때
0
99
1
fetch join VS fetch join 페이징 궁금증
0
189
2
양방향 연관관계 알아보는 법?
0
108
1
16강 17강 간단 정리 이게 맞을까요 ?
0
168
2





