[TIL/JPA] 기본개념 : 페치 조인(fetch join)
·
TIL/JPA
1. 페치 조인(fetch join)이란?SQL 조인 종류가 아니다.JPQL에서 성능 최적화를 위해 제공하는 기능이다.연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다.join fetch 명령어 사용한다.[LEFT [OUTER] | INNER ] JOIN FETCH 조인 경로2. 엔티티 페치 조인SQL로 한 번에 회원을 조회하면서 연관된 팀도 함께 조회하고싶다면 어떻게 해야할까?SQL을 보면 회원 뿐만 아니라 팀도 함께 SELECT 한다.JPQL은 select m from Member m join fetch m.teamSQL은 SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID지연 로딩할 때와 같이 쿼리문이 나간다.  위..
[TIL/JPA] 기본개념 : 경로 표현식
·
TIL/JPA
경로 표현식은 . 을 찍어서 객체 그래프를 탐색하는 것이다.select m.username -> 상태 필드(로 객체 그래프를 탐색했다)from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드where t.name = '팀A' 위의 쿼리문으로 개념을 확인할 때 Member, Team, Orders 엔티티의 연관관계는 아래와 같이 설정되어 있다고 생각하자@Entity@Table(name = "MEMBERS")public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne..
[TIL/JPA] 기본개념 : JPQL(Java Persistence Query Language)
·
TIL/JPA
1. JPQL의 소개JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.JPQL은 결국 SQL 변환된다.2. 벌크 연산벌크 연산은 여러 개의 데이터를 조회하거나 수정, 삭제할 때 사용하는 것이다.JPQL에 대한 학습 내용을 작성하기 전에 객체 모델과 DB 모델 그리고 실제 코드로 엔티티를 구현한 것을 먼저 적어보았다. @Entitypublic class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne @Joi..
[TIL/JPA] 기본개념 : JPA의 다양한 쿼리 방법 소개
·
TIL/JPA
1. 다양한 쿼리 방법의 간단한 소개JPA는 다양한 쿼리 방법을 지원한다.결국 SQL이 실행되어야 하고 실무에서는 복잡한 쿼리를 사용해서 데이터를 뽑아와야한다.JPQL이라는 표준 문법이 있고 JPA Criteria, QueryDSL(Java 코드로 짜서 JPQL을 빌드해주는 제네레이터 클래스의 모음), 네이티브 SQL(JPQL이 아닌 데이터베이스에 종속적인 쿼리를 사용해야 할 때 사용)가 있다.1) JPQL 소개JPQL은 가장 단순한 조회 방법이며(ex. EntityManager.find() ) 객체 그래프 탐색(a.getB().getC())이다.만약에 나이가 18살 이상인 회원을 모두 검색하고 싶다고 하자 이런 상황에서는 1개만 조회할 것이 아니라 WHERE 문을 사용해서 조건을 걸어야 하는 상황이 발..
[TIL/JPA] 기본개념 : 값 타입
·
TIL/JPA
1. 기본값 타입1) JPA의 데이터 타입 분류> 엔티티 타입- @Entity로 정의하는 객체- 데이터가 변해도 식별자로 지속해서 추적 가능하다.ex) 회원 엔티티의 키, 나이의 값을 변경해도 식별자로 인식 가능하여 추적이 가능하다. > 값 타입- int, Integer, String처럼 단순히 값으로 사용하는 Java 기본 타입이나 객체- 식별자가 없고 값만 있으므로 변경시 추적이 불가능하다.ex) 숫자 100을 500으로 변경하면 완전히 다른 값으로 대체 2) 값 타입 분류기본값 타입자바 기본 타입(int, double)래퍼 클래스(Integer, Long)String임베디드 타입(embedded type, 복합 값 타입)JPA에서 정의를 해서 사용해야 한다. (ex. X, Y에 대한 좌표가 있으면 ..
[TIL/JPA] 기본개념 : 영속성전이(CASCADE), 고아 객체
·
TIL/JPA
1. 영속성 전이 : CASCADE영속성 전이(CASCADE)는 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용하는 것이다.ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 위의 그림을 코드로 만들고 실행시켜보겠다.아래와 같이 Parent와 Child 엔티티를 만들고 연관관계를 맺어주었다.@Entitypublic class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List childList = new ArrayList(); public void addChild(Child..
[TIL/JPA] 기본개념 : 프록시와 연관관계 관리[즉시(EAGER)로딩, 지연(LAZY)로딩]
·
TIL/JPA
1. 프록시어느 경우에 Member만 가져오고, 어느 경우에는 Member와 Team 같이 가져와야한다.Member만 가져와야 하는데 Team도 같이 가져오는 경우에는 낭비이다.이런 경우를 해결하기 위해서는 지연 로딩과 즉시 로딩을 사용해서 해결을 하는데, 해당 개념을 공부하기 위해서는 프록시에 대해서 먼저 알아봐야한다! JPA에서는 find() 메서드가 아닌 getReference() 메서드를 제공하고 있다.em.find() 메서드는 데이터베이스를 통해서 실제 엔티티 객체를 조회를 하지만,em.getReference() 메서드는 참조를 가져오는 메서드이며, 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회. 즉, 쿼리를 날리지 않고 조회를 하는 메서드이다. 아래 코드를 보고 어떻게 동작하는지 ..
[TIL/JPA] 기본개념 : 고급 매핑(상속관계 매핑, @MappedSuperclass)
·
TIL/JPA
1. 상속관계 매핑객체는 상속관계가 있지만, 관계형 데이터베이스는 상속 관계가 없다.비슷한 걸로 슈퍼타입과 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.상속관계 매핑은 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 3가지 방법(DB 설계 방법)1) 조인 전략2) 단일 테이블 전략 : 논리 모델을 한 테이블로 합치는 것3) 구현 클래스마다 테이블 전략 : 테이블을 각각 만들어서 알아서 공통되는 컬럼을 가지고 있는 것* JPA 기본 전략은 단일 테이블 전략이다. 주요 어노테이션@Inheritance(strategy = InheritanceType.XXX)JOINED : 조인 전략SINGLE_TABLE : 단일 테이블 전..
[TIL/JPA] 기본 개념 : 다양한 연관관계 매핑
·
TIL/JPA
1. 연관관계 매핑시 고려사항 3가지1) 다중성다대일: @ManyToOne일대다: @OneToMany일대일: @OneToOne다대다: @ManyToMany- 다중성은 대칭성이 있다.- 다대다는 실무에서 사용하면 안된다. 2) 단방향, 양방향- 테이블> 외래키 하나로 양쪽 조인 가능하다. 그래서 방향이라는 개념이 없다. - 객체> 참조용 필드가 있는 쪽으로만 참조 가능> 한쪽만 참조하면 단방향이고, 양쪽이 서로 참조하면 양방향사실 객체 입장에서는 양방향이라는 것이 없음. 각 객체가 한쪽 방향으로 향해있으며, 단방향이 2개가 있는 것 3) 연관관계의 주인- 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음- 객체 양방향 관계는 A -> B, B -> A 처럼 참조가 2군데가 있음- 객체 양방향 관계는 참..