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는 JPA에게 알게해서 사용 할 수 있게 저장을 해서 설정을 해줌.
1:N 관계에서 N이 외래키를 가지고있음
생성을 할때에는 1을 먼저 만들어야함 -> 특정할수 없기 때문
팀플을 할때는 어떤 방식으로 만드는것은 상관없지만 모두가 같은 방식을 써야함
연관관계에 N+1까지 대단합니다