-
지연로딩 으로 인한 null값 조회 [Jpa Proxy객체 조회 이슈]자바 2024. 12. 3. 19:32728x90
Jpa를 이용해서 엔티티간의 연관관계를 설정할 경우 '지연로딩' 을 조심해야 한다.
연관관계가 모두 지연로딩일 때 멤버 존재 유무를 조회하기 위해 특정 멤버를 조회했을 경우,그 멤버에 해당하는 연관관계 데이터들은
모두 하이버 네이트 프록시 객체로 생성된다.
이후 프록시 객체를 직접 조회할 경우, 프록시 객체를 반환하기 때문에 안에 있는 데이터는 모두 null값이 조회가 된다..
오늘 포인트 기능을 구현하는데 해당 이슈가 발생했다.
동료분이 특정 포인트에 대한 포인트 원장을 조회하는 과정에서 포인트 객체가 프록시 객체로 생성되었다.
객체가 생성된 이후 실제로 포인트를 사용하기 위해 조회를 진행했지만 계속 Null값은 가진 프록시 객체만 생성되고 있었다.
해당 이슈로 인해 정상적으로 비즈니스 로직은 실행이 되질 않았다.
원인은 위에서 정리한 프록시 패턴이 문제였다. 해결하기 위해 원장을 조회할 때 패치 조인을 진행하여 프록시객체에 정상적으로 데이터가 넣어진 상태를 유지하도록 수정하엿다.
이부분은 서로 하이버네이트에서 생성해주는 프록시 객체에 대한 지식이 없는 상태로 개발을 진행해서 발생한 원인같다.
이번 계기로 프록시 객체에 대한 개념을 살짝이나마 맛봤다. 시간이 나면 추가적으로 공부를 진행해야 할 것 같다.
@Test void name() { Team team = Team.builder() .name("TeamA") .build(); Member member = Member.builder() .name("MemberA") .team(team) .build(); entityManager.persist(team); entityManager.persist(member); entityManager.flush(); entityManager.clear(); Optional<Member> memberOpt = memberRepository.findById(1L); Optional<Team> teamOpt = teamRepository.findById(1L); Assertions.assertThat(memberOpt.get().getTeam()).isEqualTo(teamOpt.get()); }
728x90'자바' 카테고리의 다른 글