베이직 < 연관관계 >

김규현·2025년 4월 24일
0

25/04/24

1:1

1:N

N:1

N:M -> 1:N , N:1 에 중간 테이블을 준다.

fetch 전략

즉시 로딩 -> 엔티티를 조회할 때 연관된 엔티티도 함께 조회

  • 장점 : 한 번의 쿼리로 필요한 데이터를 모두 가져옴

  • 단점 : 불필요한 데이터까지 가져와 성능 저하가 발생 할 수 있음

지연 로딩 -> 연관된 엔티티를 실제로 사용할 때 조회

  • 장점 : 실제로 필요한 시점에 데이터를 가져와 메모리 사용을 최적화

  • 단점 : 연관된 데이터를 사용할 때 추가적인 쿼리가 발생

1000개의 데이터를 가져오기가 빠른가 ? 아니면 1000개의 객체를 만드는게 빠른가

1000개의 가져오기에는 네트워크 비용이발생 -> select 문 실행 자체는 빠르지만 네트워크 비용이 발생하는 부분이 느림 -> 따라서 최대한 한번에 할수 있게 해줘야함

즉시로딩을 하게되면 -> 나랑 연관된 모든 테이블의 데이터가 다올라오게됨

따라서 -> 지연로딩을 쓰게되는 경우가 많음

실습 도메인

예제 도메인 : 학생과 코스 의 연관관계
학생 : 여러 코스를 수강할 수 있음
코스 : 여러 학생이 수강할 수 있음
-> 연관관계 : 다대다(N:M) 관계를 일대다 - 다대일로 풀어 학생 - 수강정보 - 코스 의 구조를 갖음

학생 -> Enrollment 에서 OneToMany 를 사용 mappedBy 누가 주인인가를 알려줌

코스 -> Enrollment 에서 OneToMany 를 사용 mappedBy 만다름

Enrollment -> 학생과 코스를 ManyToOne을 사용 -> FetchType을 넣어주고 -> 컬럼명을 넣어줌

fetch join으로 확장해서 가져와달라고 지정해주는것. -> 코드는 똑같게 되지만 실행은 1번만된다

  • Entitygraph보다는 간단하게 조금 더 간단하게 사용 할 수 있음

Entitygraph는 JPA에게 알게해서 사용 할 수 있게 저장을 해서 설정을 해줌.

  • 선언 자체부터 어디가 중요한 부분인지 알게 한다

1:N 관계에서 N이 외래키를 가지고있음

생성을 할때에는 1을 먼저 만들어야함 -> 특정할수 없기 때문

팀플을 할때는 어떤 방식으로 만드는것은 상관없지만 모두가 같은 방식을 써야함

1개의 댓글

comment-user-thumbnail
2025년 4월 25일

연관관계에 N+1까지 대단합니다

답글 달기