Fetch Join이란? 쉽게 말해 한방 쿼리! JPQL에서는 Fetch Join이라는 쿼리 명령어를 지원해준다. Fetch Join은 찾고자 하는 대상과 연관된 엔티티와 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. 기본적으로는 여러 개의 엔티티를 한꺼번에 조회했을 때 발생할 수 있는 N+1 문제를 해결하는데 큰 역할을 한다. FETCH JOIN 쿼리와 실제 SQL 쿼리 비교 String query = "SELECT m FROM MEMBER m JOIN FETCH m.team"; // SELECT m FROM MEMBER m LEFT [INNER/OUTER] JOIN FETCH m.team JPQL의 FETCH JOIN은 위와 같은 형태로 선언한다. 더 자세한 형태는 주석처리 된 부분에 표시되어있다..
영속성 전이, CASCADE 영속성 전이는 연관관계를 맵핑하는 것과 전혀 관련 없음. 엔티티를 영속화 할 때, 관련된 엔티티도 함께 영속화되는 편리함만 제공함. CASCADE 옵션 붙은 쪽이 연관된 다른 엔티티를 관리한다. CASCADE는 영속성이 전이된다는 말이다. 무슨 말이냐면, 특정 엔티티가 다른 엔티티와 관련이 있을 때, 특정 엔티티를 영속화하면 관련된 다른 엔티티도 영속화되는 것을 '영속성 전이'라고 한다. 이것은 연관관계와 즉시 로딩, 지연 로딩과 전혀 관계가 없다. 부모와 자식 클래스가 있다고 가정해보자. 예를 들어 부모 엔티티를 영속화하면, 자식 엔티티도 바로 영속화하고 싶을 때 쓸 수 있다. 또, 자식 엔티티를 영속화할 때 부모 엔티티도 바로 영속화 할 때 사용할 수 있다. 영속성 전이의..
MappedSuperClass → 엔티티가 아니다. MappedSuperClass는 앞선 상속 관계는 약간 다른 개념으로 사용이 된다. 앞선 게시글에서 이야기 했던 슈퍼 타입 - 서브 타입 모델의 관계는 계층 구조를 표현하기 위함이었다면, MappedSuperClass는 공통으로 사용될 변수를 셋팅하는데 '귀차니즘'을 줄이는데 도움을 주는 클래스다. 예를 들어 어플리케이션 전체에서 로그 추적을 위해서 처음 기록된 시간, 마지막으로 수정된 시간들이 각각의 DB Table에 저장된다고 생각해보자. 그렇다면 기본적으로는 각 엔티티마다 그 변수를 가지도록 해주어야 한다. 그런데 이게 테이블이 적을 때는 문제가 없으나 테이블이 많으면 문제가 될 수 있다. 하나하나 손으로 작성을 해줘야하는데 누락되는 경우도 발생할..
상속관계 맵핑 관계형 데이터베이스에는 상속관계가 없음. 슈퍼타입 - 서브타입 관계 모델링 기법이 상속관계가 유사함 상속관계 맵핑은 객체의 상곡구조를 DB의 슈퍼타입 - 서브타입 관계에 맵핑하는 작업이 필요하다. 객체에는 상속관계가 있으나 RDBMS에는 상속관계가 없다. 그렇다면 객체의 상속관계를 RDBMS에는 어떻게 맵핑을 해야하는걸까? RDBMS에는 슈퍼타입 - 서브타입 관계 모델링이 있는데, 이 관계가 객체의 상속 관계 구조와 매우 유사하다. 따라서 객체의 상속 관계를 표현하기 위해서는 RDBMS의 슈퍼타입 - 서브타입 관계 모델링에 하나 하나 적용하는 방법이 필요하다. 슈퍼타입 - 서브타입 논리 모델의 구현 조인 전략 : 각 테이블을 하나씩 구현해서 맵핑 단일 테이블 전략 : 통합 테이블을 하나 만..
이번 포스팅에서는 다양한 연관관계 맵핑에 대해 공부한 내용을 복습/정리해보고자 한다. 연관관계 맵핑 시 고려해야 할 사항 다중성 단방향, 양방향 고려 연관관계의 주인 연관관계를 맵핑할 때 고려해야 할 사항은 기본적으로 위 세 가지라고 한다. 위 세 가지에 대해서 하나하나 풀어서 살펴보려고 한다. 다중성 다중성은 연관관계를 맺고자 하는 테이블이 어떤 관계를 가지고 있는지를 나타내는 것으로 이해하면 된다. 테이블과 연결시켜 주기 위해서는 필드에 어노테이션을 달아줘야하는데 @ManyToOne, @OneToMany, @ManyToMany, @OneToOne이 존재한다. 여기서 @ManyToMany 연관관계는 표현은 할 수 있으나 실무에서는 절대로 사용하지 않을 것이 권장된다고 한다. 단방향, 양방향 고려 단방향..