QueryDSL

JPA

1 QueryDSL 소개

  • JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
  • JPA 크리테리아에 비해서 편리하고 실용적임
  • 쿼리를 문자가 아닌 코드로 작성해도, 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발 할 수 있는 프로젝트가 바로 QueryDSL 이다.
  • 오픈소스

객체지향 쿼리 언어

JPA

1 JPQL 소개

JPQL(Java Persistence Query Language) : 엔티티 객체를 조회하는 객체지향 쿼리.

  • JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.
  • JPQL은 객체지향 쿼리 언어다. 테이블X 엔티티O
  • JPQL은 결국 SQL로 변환된다.

값 타입

JPA
  • 기본값 타입basic value type
    • 자바 기본 타입(예: int, double)
    • 래퍼 클래스(예: Integer)
    • String
  • 임베디드 타입embedded type(복합 값 타입)
  • 컬렉션 값 타입collection value type

복합 값 타입

복합값 정의 : @Embeddable 어노테이션으로 정의

프록시와 연관관계 관리

JPA
  • 프록시 : 연관된 객체를 실제 사용하는 시점에 데이터베이스에서 조회 하는 기술
  • 지연로딩: 연관된 객체를 실제 사용하는 시점에 불러 오는것
  • 즉시로딩 : 연관된 객체를 조인을 통하여 함께 불러오는것
  • 영속성 전이 : 연관된 객체를 함께 저장하거나 삭제
  • 고아 객체 : 부모객체가 삭제시 홀로 남겨지는 객체

8.1 프록시

엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다.

JPA는 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 한다.

지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라 한다.

고급 매핑

JPA
  • 상속 관계 매핑: 객체의 상속 관계를 데이터베이스에 어떻게 매핑하는지 다룬다.
  • @MappedSuperclass: 등록일, 수정일 같이 여러 엔티티에서 공통으로 사용하는 매핑 정보만 상속받고 싶으면 이 기능을 사용하면 된다.
  • 복합 키와 식별 관계 매핑: 데이터베이스의 식별자가 하나 이상일 때 매핑하는 방법을 다룬다. 그리고 데이터베이스 설계에서 이야기하는 식별 관계와 비식별 관계에 대해서도 다룬다.
  • 조인 테이블: 테이블은 외래 키 하나로 연관관계를 맺을 수 있지만 연관관계를 관리하는 연결 테이블을 두는 방법도 있다. 여기서는 이 연결 테이블을 매핑하는 방법을 다룬다.
  • 엔티티 하나에 여러 테이블 매핑하기: 보통 엔티티 하나에 테이블 하나를 매핑하지만 엔티티 하나에 여러 테이블을 매핑하는 방법도 있다. 여기서는 이 매핑 방법을 다룬다.

엔티티의 연관관계 매핑시 고려할거 정리

JPA

고려할건 크게 3가지다.

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

다중성 : 두 엔티티의 연관관계를 나타냄 (예: 일대다,다대일,일대일,다대다) 다중성을 판단하기 힘들땐 반대방향을 생각하면 됨 (일대다의 반대는 다대일)

  • 다대일(@ManyToOne)
  • 일대다(@OneToMany)
  • 일대일(@OneToOne)
  • 다대다(@ManyToMany)

연관관계 기초

JPA
  • 객체의 참조와 테이블의 외래 키를 매핑하는 것이 이 장의 목표다.*

핵심 키워드

  • 방향(Direction): [단방향, 양방향]이 있다. 한 쪽만 참조하는 것을 단방향 관계라 하고, 양쪽 모두 서로 참조하는 것을 양방향 관계라 한다. 방향은 객체관계에만 존재하고 테이블 관계는 항상 양방향이다.
  • 다중성(Multiplicty): [다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)] 다중성이 있다.
  • 연관관계의 주인(Owner): 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다.

엔티티 매핑

JPA
  • 객체와 테이블 매핑 : @Entity, @Table
  • 기본 키 매핑 : @Id
  • 필드와 컬럼 매핑 : @Column
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

@Entity(클래스) : 테이블과 매핑할 클래스, JPA가 관리함

@Table(클래스) : 엔티티와 매핑할 테이블 (생략시 엔티티명으로 적용)

  • uniqueConstraints(DDL) : DDL생성시 유니크 제약조건 만듬.

@Column(필드) : 칼럼을 매핑한다.

영속성 관리

JPA

개요

  • EntityManagerFactory : EntityManager를 만드는 공장. 애플리케이션에서 persistens.xml의 persistens-unit갯수 만큼만 있어야함
  • EntityManager : 요청이 올때마다 생성 해도 됨.(커넥션풀에서 커넥션 한개씩 이라고 생각해도 될듯)

persistencecontext4

  • persistence context(영속성 컨텍스트) : ‘엔티티를 영구 저장하는 환경’

특징

  • 영속 상태인 엔티티는 식별자 값이 반드시 있어야 한다. (식별자 값이없으면 예외 발생)
  • 트랜잭션 커밋 하는 순간 DB 반영힘 이를 플러시(flush)라 함

JPA 소개 JPA 시작

JPA

1. JPA 소개

하이버네이트 오픈소스 ORM 프레임워크가 나온 후 자바빈이 버려지고 하이버네이트, 이클립스링크등의 ORM 프레임워크로 자바 ORM 표준을 정한것이 JPA 이다.

JPA(Java Persistent API) : 관계형 데이터베이스에 접근하기 위한 표준 ORM 기술을 제공하며, 기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술이다. JPA는 JSR 220에서 정의된 EJB 3.0 스펙의 일부로 정의가 되어 있지만, JPA는 EJB 컨테이너에 의존하지 않으며 EJB, 웹 모듈 및 Java SE 클라이언트에서 모두 사용이 가능하다. 또한, JPA는 사용자가 원하는 퍼시스턴스 프로바이더 구현체를 선택해서 사용할 수 있다.

ORM(Object Relational Mapping) : 관계형 데이터베이스를 객체에 매핑.

왜 JPA를 사용해야 하는가?

  1. 생산성 : 지루하고 반복적인 CRUD 코드를 직접 작성하지 않아도 된다.
  2. 유지보수 : 엔티티에 필드를 하나만 추가해줘도 등록, 수정, 조회 자동으로 매핑 된다.
  3. 패러다임의 불일치 해결 : 관계형 DB로 객체지향적인 코딩이 가능해 진다.
  4. 성능 : 한번 조회한건 캐시를 사용함으로 똑같은걸 2번 조회 하지 않는다.(1차캐시)
  5. 데이터 접근 추상화와 벤더 독립성 : 방언을 통해 자유자제로 다른 DB로 변경이 가능 하다.
  6. 표준 : 자바 진영의 ORM 표준이다.