강의

멘토링

로드맵

Inflearn brand logo image

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

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

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

간단한 주문 조회 V1: 엔티티를 직접 노출

hibernate5JakartaModule 의 이상한 결과에 대해 질문있습니다.

작성

·

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로 반환되는 경우가 발생할 수 있습니다.

지연 로딩은 데이터베이스 성능 최적화를 위해 사용되지만, 때로는 예상하지 못한 결과를 초래할 수도 있습니다. 아래는 이 문제와 관련된 몇 가지 원인과 해결책입니다:

  1. 지연 로딩이 작동하는 원리: Hibernate는 필요한 경우에만 연관된 엔티티를 데이터베이스에서 로드합니다. 따라서 프록시 객체는 초기화되지 않은 상태로 남아 있을 수 있으며, HTTP 응답 생성 시 JSON 직렬화를 위해 초기화되지 않은 필드가 null로 표시될 수 있습니다.

  2. 강제 초기화: hibernate5JakartaModule로 지연 로딩을 초기화하려면, “FORCE_LAZY_LOADING” 옵션을 활성화해야 합니다. 이 옵션이 활성화되어 있지 않으면 기본적으로 초기화되지 않은 연관 필드가 null로 나타납니다.

  3. 프록시 객체 초기화 확인: 두 번째 주문에서 orderItems가 보이는 이유는 그 지연 로딩이 이미 이전 시점에서 초기화되었기 때문일 수 있습니다. 예를 들어, 서비스 레이어에서 해당 엔티티의 데이터를 접근하게 되면 Hibernate는 필요한 데이터를 즉시 로드할 수 있습니다.

이 문제를 해결하려면, 필요한 시점에서 연관된 엔티티를 모든 상황에서 확실히 로드할 수 있도록 설정해야 합니다. 또는 초기화가 필요하지 않은 필드는 @JsonIgnore를 통해 명시적으로 직렬화에서 제외할 수 있습니다.

이 링크들은 유사한 문제에 대한 질문들이니 확인해보시면 도움되실 것입니다:
- orderItems 에 null이 들어가는 이유가 궁금합니다.
- 5:05초 경 orderItems 에 null이 아닌 정상값이 조회가 됩니다.

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

창신동 장첸님의 프로필 이미지
창신동 장첸

작성한 질문수

질문하기