작성
·
178
0
안녕하세요. 강의를 따라
@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이 아닌 정상값이 조회가 됩니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.