Jpa의 @ManyToMany 조인에서 구조상의 문제점

less than 1 minute read

이런 구조의 Account 엔티티가 있다면

Account { @@FetchType.EAGER List groups;

@@FetchType.EAGER List authorities; }

위의 groups에 3개 authorities에 2개의 데이터가 있다면 총 6개의 로우가 생성되서 출력이 되는 문제가 발생한다. 이것은 Hibernate에서 자동생성되는 다음과 같은 형태의 쿼리때문에 발생하는데 EAGER인 경우 쿼리를 묶어서 한번에 출력하려고 1개의 쿼리를 만들어내고

select * from account left outer join ~~~~

where id = :accountId

이것을 해결하려면

1 Set을 사용해서 중복이 제거되도록 하거나 이 경우 쿼리에서 데이터가 6개가 출력이 될 수도 있지만 중복을 자동으로 제거하게 된다. 이렇게 처리할 경우에는 ManyToMany 조인테이블에서 unique_index가 없어서 중복으로 들어가는게 가능한데 이렇게 데이터가 진짜로 중복으로 들어있는 경우가 발생하는것과 구분이 불가능하다. 2 ManyToMany가 두개이상 사용되는 경우 EAGER를 뺀다. EAGER를 빼면 getGroups(), getAuthorities()가 실행될 때 별도의 쿼리를 실행시켜서 데이터 중복문제가 해결된다.