백엔드 개발자
JPA 기본 정리 #4 본문
임베디드 타입 ( 값 타입 )
- 식별자가 없다.
- 한 엔티티안에 종속되어 라이프 사이클도 종속된다.
- 엔티티가 삭제되면 함께 삭제된다.
- CasCadeType.ALL && 고아객체로 설정한 것과 같다.
- 식별자가 없으므로 추적도 불가능 하다.
JPQL
- 객체지향 쿼리언어이다.
- SQL을 추상화한 언어이기 때문에 특정 데이터베이스에 종속되지 않는다.
- 문법은 sql 과 거의 유사하다.
JPQL 문법
- COALESCE : null 값인 경우 반환 값 지정
- ⇒ coalesce(m.name, ‘이름 없는 회원’)
- NULLIF : 조건에 맞으면 null 반환
- ⇒ NULLIF(m.name, ‘홍길동’) 이름이 홍길동이면 null 반환
- CONCAT : 문자열 더하기
- concat(’a’, ‘b’)
- SUBSTRING : 시작위치, 길이 지정하여 문자열 자르기
- substring(m.name, 2, 3)
- LOCATE : 찾는 문자열의 시작 위치 반환 (1부터 시작)
- locate(’de’, ‘abcedegf’)
경로 표현
- 상태 필드 : 경로 탐색의 끝. 단순히 값을 저장하는 필드.
- 연관 필드
Fetch Join
- 연관된 엔티티까지 모두 조회가 필요할 때, 앞에서 강조하였던 LAZY 전략은 여러번의 쿼리를 실행하게 되는 문제가 있고, 즉시 로딩은 너무 많은 join으로 인해 성능이 느려질 수 있다는 문제가 있다고 하는데 이때 사용할 수 있는 것이 페치 조인이다.
select m from Member m join fetch m.team
Member 의 연관 필드인 team을 항상 같이 조회할 필요가 있을 때 이렇게 fetch 조인을 통해 명시적으로 조인할 수 있다.
즉시 로딩과 같은 기능을 하지만 명시적으로 join을 한다는 점과 필요한 부분만 join할 수 있다는 점이 다르다.
Fetch Join 문제
- 페치 조인으로도 해결할 수 없는 부분이 있다.
- 일대다 연관관계 매핑인 경우 fetch join을 하게 되면 일에 대해 다 개수만큼 매치가 되면서 결과값이 배로 늘어나게 된다.
- 위의 이유로 페이징 처리를 할 수 없다.
- 이때 BatchSize 옵션을 사용하여 사이즈를 지정해주고 그 사이즈만큼 한 번에 관련 엔티티들을 모두 조회해 와서 성능최적화를 할 수 있다.
Named 쿼리
- 미리 쿼리를 정의해서 사용할 수 있다.
- 애플리케이션 로딩시점에 초기화 시킨다. 미리 파싱을 해놓는다.
- 쿼리문에 오류가 있다면 컴파일 시점에 발견할 수 있다.
벌크 연산
- 쿼리 한 번으로 여러 테이블의 로우를 변경하는 것을 말한다.
- 벌크 연산은 영속성 컨텍스트가 아닌 데이터베이스에 바로 접근하여 업데이트 한다.
- 그래서 데이터베이스만 변경이 되고 영속성 컨텍스트에서는 변경이 안되기 때문에 문제가 생길 수 있다.
- 두 개를 동기화 해주기 위해 영속성 컨텍스트에 값이 없는 상태이거나
- 벌크 연산을 한 후에는 영속성 컨텍스트 clear를 해주는 작업이 꼭 필요하다.
- 인프런 김영한님의 JPA 기본편을 듣고 정리한 내용입니다 -
'스프링 > JPA' 카테고리의 다른 글
JPA 기본 정리 #3 (0) | 2023.09.03 |
---|---|
JPA 기본 정리 #2 (0) | 2023.09.03 |
JPA 기본 정리 #1 (0) | 2023.08.31 |
Comments