참고 영상 - 자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 타입
값 타입
임베디드 타입
컬렉션 값 타입
새로운 값 타입을 정의 가능
주로 기본 값 타입을 모아서 복합 값 타입라고도 합니다.
값 타입 공유 참조
임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 Side effect 발생
임베디드 타입으로 사용중인 객체 타입안의 상태를 변경하면 해당 객체 타입을 사용하는 모든 엔티티들이 동일한 값을 사용하게 됩니다.
객체타입, 배열은 Heap영역에 들어가기 때문에 해당 타입들은
사용에 주의가 필요합니다.
영속성 컨텍스트에 존재하는 영속 객체들 또한 Heap에 존재하는 값이며
영속 객체가 포함하는 값 타입 또한 Heap안에 존재합니다.
Copy method나 불변 객체로 사용하기를 권장합니다.
(Integer, String가 대표적인 불변 객체)
값 타입은 동일성 비교(==)가 아니라 동등성 비교(equals)를 해야합니다.
Hash function을 사용하는 것도 고려하여 hashcode()도 함께
재정의하기를 권장합니다.
값 타입(VO)는 hashcode() 재정의도 값들을 기준으로 해야함
값 타입과 동일하게 불변으로 다루는 것을 권장합니다.
값 타입 컬렉션 룰
팁
엔티티 객체를 조회하는 객체 지향 쿼리
공통점 : JPQL Builder
📗 Criteria : JPQL Builder
JPQL은 결국 문자열, 동적 쿼리를 생성하기 피곤하다.
하지만 복잡해서 실무에서 사용안함
대안으로 QueryDSL을 많이 사용
📗 QueryDSL : JPQL Builder
그냥 QueryDSL을 사용하자
장점
Typed Query, Query
Typed Query : 반환 타입이 명확할 때 사용
Query : 반환 타입이 명확하지 않을 때 사용
결과 조회 API
2개 이상 : getReusltList()
1개 : getSingleResult()
간단한 예제
builder형식을 제공하여 편하게 사용 가능
엔티티 프로젝션: select m From Member m
엔티티 프로젝션: select m.team From Member m
임베디드 타입 프로젝션: select m.address From Member m
스칼라 타입 프로젝션: select m.username, m.age From Member m
new keyword
qlString에 new package.class(args..) 형식으로 추가됩니다.
그리고 조회 컬럼의 타입과 순서에 맞는 생성자가 사용됩니다.
Fetch Join은 Join절에 연관된 데이터 모두 조회절에 포함시킵니다.
N + 1의 문제가 발생하였을 때 Fetch Join을 사용하면 문제를 해결 할 수 있습니다.
Distinct
.. From Team t Join Member m On t.id = m.team_id ..
실제 DB의 SQL 조회 결과에서는 Team이 2개가 나옵니다.
이러한 부분이 실제 JPA에 적용이 되어서
하나의 Team Instance에 N개의 Member를 참조하는 것이 아니라
Member의 개수만큼 Team이 생성됩니다.
이럴 때 Distinct keyword를 사용하면 됩니다.
JPQL의 Distinct
정리
JPA 표준 스펙에서는 Where, Having절에서만 서브 쿼리 사용 가능하지만
Hibernate 구현체를 사용하면 Select절에서도 사용이 가능합니다.
마지막으로 From절에서의 서브 쿼리가 불가능합니다.
대신 Join으로 풀어야 합니다.
문자: 'Hello', 'She''s'
숫자: 10L(Long), 10D(Double), 10F(Float)
Boolean: TRUE, FALSE
ENUM: 패키지명을 포함한 클래스 이름, com.hello.IAmEnum
엔티티 타입: TYPE(m) = Member, 상속 관계에서 사용 가능
기타
SQL과 문법이 비슷
EXISTS, IN, AND, LIKE..
.(점)을 찍어 객체 그래프를 탐색하는 것
select m.username -> 상태 필드
from Member m
join m.team t -> 단일 값 연관 필드
join m.orders o. > 컬렉션 값 연관 필드
where t.name = '팀A'
1. 상태 필드:
2. 연관 필드: 연관관계를 위한 필드
단일 값 연관 필드:
컬렉션 값 연관 필드:
👍 실무에서는 명시적 조인을 사용하자