JPA에서의 1대N 관계 데이터 뻥튀기 문제

song yuheon·2023년 10월 2일
0

JPA

목록 보기
4/9

1대N 관계에서의 데이터 뻥튀기 문제란?



1대N 또는 N대N 관계에서 조인을 수행하게 되면 주 엔터티가 중복해서 나타날 수 있다.
A가 여러 B를 가지고 있다고 가정하면 AB를 조인할 때 각 주문마다 A 정보가 반복해서 나올 것이다.
이 경우 결과 집합에는 같은 A 정보가 여러 번 중복되어 나타난다.
이것을 "데이터 뻥튀기" 문제라고 한다.


데이터 뻥튀기가 문제인 이유


  1. 데이터 전송량 증가
    중복된 데이터가 많을 경우 전송되는 데이터의 양이 증가하고 애플리케이션의 응답 시간도 증가한다

  2. 메모리 사용량 증가
    중복 데이터의 처리 및 저장으로 메모리 사용량 상승한다.

  3. 데이터 처리 비용 상승
    중복 데이터 처리로 인한 CPU 부하 증가한다.

  4. 데이터의 정확성 문제
    중복된 데이터의 수정 및 관리 문제로 데이터 불일치 가능성이 있다.

  5. 가독성 및 유지보수 문제
    코드 복잡성 증가로 인한 유지보수의 어렵다.


패치 조인과 DISTINCT를 이용한 해결 방법


패치 조인은 JPA에서 제공하는 기능으로 연관된 엔터티를 함께 조회하는 방법이다.
이를 통해 쿼리 한 번으로 필요한 모든 데이터를 가져올 수 있다.
그러나 패치 조인만으로는 데이터 뻥튀기 문제를 완전히 해결할 수 없다.
따라서 DISTINCT를 함께 사용하여 중복된 결과를 제거하는 것이 일반적이다.
DISTINCT는 중복된 결과를 데이터베이스 수준에서 제거하며 일대다 또는 다대다 조인에서 발생하는 데이터의 "뻥튀기" 문제를 해결하는데 효과적이다.


DISTINCT를 이용한 중복 제거의 과정


  1. 데이터베이스 수준
    데이터베이스에서 실행되는 SQL 쿼리에 DISTINCT 키워드가 포함되어 데이터베이스가 중복된 결과를 제거하게 된다.
  2. 애플리케이션 수준 (영속성 컨텍스트)
    JPA는 반환된 결과를 영속성 컨텍스트에 저장하기 전에 중복된 엔터티를 제거한다.
    이로 인해 개발자는 중복 없이 결과를 받게 된다.
  • => 패치 조인에서의 DISTINCT는 데이터베이스와 애플리케이션 두 수준에서 중복을 제거하게 된다.

profile
backend_Devloper

0개의 댓글