JPA(Java Persistence API)

1. JPA Database Dialect

JPA는 특정 데이터베이스에 종속되지 않으며 각각 데이터베이스가 제공하는 SQL 문법과 함수는 차이가 있습니다.

가변문자에서 Mysql은 VARCHAR으로 선언되고 Oracle은 VARCHAR2 으로 사용되면서 문법적 차이가 존재합니다. 그리고 문자열을 자르는 함수같은 경우는 SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()로 사용됩니다. 페이징 처리 같은 경우는 MySQL LIMIT을 사용하고 Oracle은 ROWNUM을 사용합니다.
JPA Database Dialect는 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능이라고 할 수 있습니다.

1
2
3
H2: org.hibernate.dialect.H2Dialect
Oracle 10g: org.hibernate.dialect.Oracle10gDialect
MySQL: org.hibernate.dialect.MySQL5InnoDBDialect

다음과 같이 hibernate.dialect속성을 지정하여 사용할 수 있습니다. Hibernate는 약 40개 이상의 Dialect를 지원합니다.

2. JPA 구동방식

Persistance(영속성)가 Maven(META-INF/persistance.xml), Gradle(application.properties,application.yml) 설정 정보를 조회한후 해당 설정정보로 EntityManagerFactory를 생성하여 EntityManagerFactory가 EntityManager를 생성하게 됩니다.

주의 사항

  1. EntitiyManagerFactory:
    하나만 생성하여 어플리케이션 전체에 공유되는 방식을 사용합니다.

  2. EntityManager:
    쓰레드간에 공유를 하지 못합니다. 따라서, EntitiyManager를 선언하고 추후에 따로 해지시켜주는 방식으로 구동되어야합니다.

  3. JPA는 모든 데이터 변경은 트랜잭션안에서 실행됩니다. 따라서, 모든 데이터변경시에 트랜잭션이 실행되어 commit과 rollback과정을 처리합니다.

3. @Entity, @Id

@Entity: Entity어노테이션은 JPA가 관리하는 객체로 선언해줍니다.
@Id: Id어노테이션은 데이터베이스 PK와 매핑됩니다.

1
2
3
4
5
6
@Entity
public class Member{
@Id
private Long id;
private String memberName;
}

4. JPQL(Java Persistence Query Language)

JPA를 사용하면 엔티티 객체를 중심으로 개발이 진행되고 만약에 검색쿼리를 진행한다고 할대, 테이블이 아닌 엔티티객체를 대상으로 검색을 진행하게 됩니다. 하지만, 모든DB데이터를 객체로 변환해서 검색하는것은 불가능합니다. 따라서, 필요한 데이터만 가져오기위해 검색조건이 포함된 SQL이 필요로 되어지는데 이때 JPQL을 사용하게 됩니다.

JPQL은 SQL을 추상화하여 JPQL이라는 객체지향 쿼리언어를 제공하는것을 말합니다. SQL문법과도 매우 유사하며 SELECT,FROM,WHERE,GROUP BY, HAVING, JOIN과 같은 문법도 지원을 해줍니다.

SQL VS JPQL

JPQL은 엔티티 객체를 대상으로 쿼리문을 날리고, SQL은 데이터베이스 테이블 대상으로 쿼리를 날립니다.

정리

테이블이 아닌 객체를 대상으로 검색하는 객체지향쿼리를 일컫는말이고 SQL을 추상화하였기때문에 특정 SQL에 의존하지 않는다는 장점을 가지고 있습니다. JPQL은 객체지향 SQL이라고 말할 수 있습니다.