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

김용기님의 프로필 이미지

작성한 질문수

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

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

Lazy 강제 초기화 오류

작성

·

58

0

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

[질문 내용]

Lazy 강제 초기화 시, order.getMember().getName() 는

@GetMapping("/api/v1/orders")
public List<Order> listV1() {
  List<Order> orders = orderRepository.findAll(new OrderSearch());

  for (Order order : orders) {
    order.getMember().getName();
    ...
  }

  return orders;
}

다음과 같은 결과를 기대합니다.

{
  "id": 1,
  "member":{
    "name": "memberA",
  },
  ...
}

하지만 order.getMember() 까지만 초기화 되어, 다음과 같은 결과가 나옵니다.

{
  "id": 1,
  "member":{
    "id": 1,
    "name": "memberA",
    "address":{
      "city": "주소",
      "street": "거리",
      "zipcode": "우편번호"
    }
  },
  ...
}

Intelij 에서도 'Member. getName()'의 결과가 무시되었습니다 라고 에러가 뜨는데 그 이유가 궁금합니다.

답변 2

0

안녕하세요. 김용기님, 공식 서포터즈 코즈위버입니다.

인텔리제이 메시지의 경우 이 코드로 조회한 값을 아무곳에서도 사용하지 않기에 출력되는 것으로 보입니다.

...
    order.getMember().getName();
...

 

JSON 결과는 List<Member> 에 대한 내용전체가 출력되게 됩니다.

만약 결과값을 변경하시고 싶은 경우 List<String> names 등을 생성하시고 이 names 를 반환하도록 코드를 변경하셔야 합니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 김용기님.

질문해주신 내용과 관련하여 비슷한 문제를 다룬 기존 답변들을 찾았습니다. 우선 강제 초기화와 관련된 내용은 아래 링크를 참고하시기 바랍니다:

  1. GetMapping(“/api/v1/members”) 부분이 이해가가지 않습니다.
  • 핵심 요약: 지연 로딩(Lazy Loading) 문제로 인해 HttpMessageNotWritableException 오류가 발생할 수 있으며, 페치 전략을 EAGER로 변경하거나 JPQL을 사용하여 이를 해결할 수 있습니다.
  1. 강제 지연 로딩 초기화에 관한 질문입니다.
  • 핵심 요약: Lazy 초기화 설정과 강제 초기화의 차이, 그리고 Hibernate5Module을 통한 JSON 변환 시 Lazy Loading 초기화 문제에 대해 다루고 있습니다.
  1. Repository 질문입니다.
  • 핵심 요약: Lazy 초기화 시 프록시 객체와 실제 엔티티로 강제 초기화하는 방식에 대한 설명이 있으며, Spring과 JPA에서의 동작 방식을 이해하는 데 도움이 됩니다.

추가적으로, Intellij 에러 메시지 'Member.getName()'의 결과가 무시되었습니다와 관련해서는 프록시 초기화가 필요할 때 정확하게 초기화 코드가 실행되지 않아서 발생할 수 있습니다. 이를 확인하고 해결하기 위해 아래 사항을 체크해보세요:
- 코드가 정확하게 초기화를 수행하고 있는지(가능하면 브레이크포인트를 통해 디버깅).
- Hibernate5Module이 제대로 설정되어 있는지 확인.
- 영속성 컨텍스트가 열려 있는 상태에서(보통 트랜잭션 내) 초기화 코드를 실행하고 있는지 확인.

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