본문 바로가기

개발중/Java Persistence API (JPA)

(27)
🟡 Criteria이란 ? 🟣 Criteria이란 ? Criteria 는 JPQL 을 생성하는 빌더 클래스다. 'Criteria' 은 영어 단어로는 '기준' 이라는 뜻을 가지고 있다. 🟣 Criteria 의 장점 문자가 아닌 query,select(m).shere(...) 처럼 프로그래밍 코드로 JPQL 을 사용할 수 있다. 컴파일 시점에 오류를 발견할 수 있다. IDE 를 사용하면 코드 자동 완성을 지원한다. 동적 쿼리를 작성하기 편하다. 예를 들어 JPQL 에서 select m frim Membeee m 처럼 오타가 있다고 가정해보자. 그래도 컴파일은 성공하고 애플리케이션을 서버에 배포할 수 있다. 문제는 해당 쿼리가 실행되는 런타임 시점에 오류가 발생한다는 점이다. 이것이 문자기반 쿼리의 단점이다. 반면에 Criteria는 ..
🟡 QueryDSL이란 ? 🟡 QueryDSL이란 ? QueryDSL 은 Criteria 처럼 JPQL 빌더 역할을 한다. 🟢 QueryDSL 의 장점 코드 기반이면서 단순하고 사용하기가 쉽다. 그리고 작성한 코드도 JPQL 과 거의 비슷해서 한눈에 들어온다. QueryDSL 과 Criteria 를 비교하면 Criteria 는 너무 복잡하다. QueryDSL 은 JPA 표준은 아니고 오픈소스 프로젝트다. 이것은 JPA 뿐만 아니라 JDO, 몽고DB, Java Collection, Lucene, Hiberate Search 도 거의 같은 문법으로 지원한다. 현재 스프링 데이터 프로젝트가 지원할 정도로 많이 기대되는 프로젝트이다. 대부분 Criteria 보다 QueryDSL 을 더 선호한다. 🟢 QueryDSL 로 작성한 코드 // ..
🟡 JPQL 이란 ? 🟡 JPQL 이란 ? JPQL 은 엔티티 객체를 조회하는 객체지향 쿼리이다. 문법은 SQL 과 비슷하고 ANSI 표준 SQL 이 지원하는 기능을 유사하게 지원한다. JPQL 은 SQL 을 추상화 해서 특정 DB 에 의존하지 않는다. 그리고 DB 방언만 변경하면 JPQL을 수정하지 않아도 자연스럽게 데이터 베이스를 변경할 수 있다. 예를 들어 SQL 함수라도 DB 마다 사용문법이 다른 것이 있는데, JPQL 이 제공하는 표준화된 함수를 사용하면 선택한 방언에 따라 해당 DB 에 맞춘 적절한 SQL 함수가 실행된다. JPQL 은 SQL 보다 간결하다. 🟣 JPQL 특징 JPQL 은 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리 한다. JPQL 은 SQL..
객체 지향 쿼리 소개 🟢 객체 지향 쿼리 소개 EntityManager.find() 메소드를 사용하면 식별자로 엔티티 하나를 조회할 수 있다. 이렇게 조회한 엔티티에 객체 그래프 탐색을 사용하면 연관된 엔티티를 찾을 수 있다. 식별자로 조회 EntityManager 객체 그래프 탐색 a.getA() 이 기능만으로 애플리케이션을 개발하기 어렵다. 예를들어 나이가 30살 이상인 회원을 모두 검색하고 싶다면 좀 더 현실적이고 복잡한 검색 방법이 필요하다, 그렇다고 모든 회원 엔티티를 메모리에 올려두고 애플리케이션에서 30살 이상인 회원을 검색하는 것은 현실성이 없다. 결국 DB 에 있으므로 SQL 로 필요한 내용을 최대한 걸러서 조회해야 한다. 하지만 ORM 을 사용하면 DB 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 검색도..
Java 객체/ 기본값 타입의 특징 Java 객체/ 기본값 타입의 특징 엔티티 타입( Entity Type ) 의 특징 식별자가 있다. @id 엔티티 타입은 식별자가 있고, 식별자로 구분 할 수 있다. 생명 주기가 있다. 생성하고, 영속화 하고, 소멸하는 생명 주기가 있다. em.persist( entity ) 로 영속화 한다. em.remove( entity ) 로 제거한다. 공유 할 수 있다. 참조 값을 공유할 수 있다. 이것을 공유 참조라고 한다. 예를 들어 회원 엔티티가 있다면 다른 엔티티에서 얼마든지 회원 엔티티를 참조할 수 있다. 값 타입 ( Value Type ) 의 특징 식별자가 없다. 생명 주기를 엔티티에 의존한다. 스스로 생명주기를 가지지 않고 엔티티에 의존한다. 의존하는 엔티티를 제거하면 같이 제거 된다. 공유하지 않는..
JPA - 값 타입 컬렉션 값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 아래 두 개의 어노테이션을 사용하면 된다. @ElementCollection @CollectionTable ✅ Member 더보기 package jpabook.model.entity; import javax.persistence.*; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @Entity public class Member { @Id @GeneratedValue private Long id; @Embedded private Address homeAddress; @ElementCollection @CollectionTabl..
JPA - 즉시 로딩과 지연 로딩 즉시 로딩과 지연 로딩 프록시 객체는 주로 연관된 엔티티를 지연 로딩 할 때 사용한다. Member member = em.find( Member.class, "binsoo" ) - 객체 그래프 탐색 Team ream = member.getTeam() - 팀 엔티티 사용 team.getName() 회원 엔티티를 조회할 때 연관된 팀 엔티티도 함께 DB 에서 조회하는 것이 좋을까 ? 아니면 회원 엔티티만 조회해두고 팀 엔티티는 실제 사용하는 시점에 DB 에서 조회하는 것이 좋을까 ? 즉시 로딩 - EAGER LOADING 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다. 하이버네이트는 가능하면 SQL 조인을 사용해서 한 번에 조회한다. 설정 방법 @ManyToOne( fetch = FetchType.EAG..
JPA / 프록시 알아보기 프록시 ? 객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 DB 에 저장되어 있으므로 연관된 객체를 마음껏 탐색 하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 DB에서 조회하는 것이 아니라 실제 사용하는 시점에 DB를 조회할 수 있다. 하지만 자주 함께 사용하는 객체들을 조인을 사용해서 함께 지원하는 것이 효과적이다. ✅ 프록시 객체? 지연로딩 기능을 사용하려면 실제 엔티티 객체 대신에 DB 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 한다. ✅ 프록시 기초 JPA 에서 식별자로 엔티티 하나를 조회할 때는 EntityManager.find() 를 사용한다. 이 메소드는 영속성 컨텍스트에 엔..