연관관계를 한번에 Join Fetch를 하는 방법이 여러가지가 있는데, 가장 손 안쓰고 간단하게 연관관계 객체를 가져올 수 있는 방법이 바로 Entity Graph이다.

이런식으로 자동 생성된 쿼리에 @EntityGraph 어노테이션으로 같이 가져올 연관 Entity명을 명시해주면 fetch join해서 가져오게 된다.

@EntityGraph(attributePaths = {"userEntity", "groupEntity"}, type = EntityGraph.EntityGraphType.LOAD)
    Optional<GroupPostEntity> findById(Long aLong);

EntityGraph를 이용해 연관관계를 가져올 때 attributePaths의 객체는 무조건 join해서 가져와지게 된다.

하지만 그 외의 해당 객체랑 연관되어있는 다른 객체들에 대해서 추가 처리를 해줄 수 있는데

그게 바로 위의 type 부분이고, 그를 통해 선택적으로 핸들링해줄 수 있다.

LOAD: attributePath에 정의한 멤버는 바로 가져오고 나머지 멤버 변수는 각자의 FetchType을 존중해 불러온다.

FETCH: attributePath에 정의한 멤버는 바로 가져오고 나머지 멤버 변수는 FetchType을 무조건 LAZY로 불러온다.

그럼 이렇게 가져오는 경우 연관해서 가져오는 객체의 연관 fetch type은 어떻게 핸들링 되는걸까?

SubEntityGraph

attributePaths에 연관되는 객체를 넣어주면 그 객체에 대해서 위에서 정의한 fetchType으로 적용이 되서 가져와진다고 한다.

즉 userEntity.Adress 로 attributePath를 넣어주면 adress에 대해서 해당 fetch type으로 적용된,,, 다고 한다

근데 사실 이게 사실인지 모르겠다.