Post

JPA란





참고



What is JPA?

orm이란,

  • Object Reation Mapping의 준말로, 객체와 rdb 사이의 괴리감을 줄여준다.
  • 자바 코드로 rdb를 사용한다는 점에서 jdbc, mybatis 등과 같다.
  • 하지만 jdbc, mybatis 등은 sql 쿼리문 작성이 빠질 순 없었다.
    • jpa를 사용하면 개발자는 쿼리문 작성을 확 줄일 수 있다.
    • 줄여주는 거지 아예 빠지진 않는다.
  • orm은 rdb를 객체 사용하듯 편하게 사용하게 해주는 프레임 워크이다.

jpa란,

  • java persistence api의 준말로, 자바 표준 orm 인터페이스이다.
  • 표준 인터페이스로 구현체로는 hibernate 등이 있다.
  • jpa를 통해 자바 개발자는 rdb에서 값을 가져오는 것을 마치 컬렉션에서 값을 꺼내오듯 사용할 수 있다.
  • jpa 역시 jdbc를 사용하며, 그저 개발자가 귀찮을 일(커넥션 관리 등)을 보이지 않게 해준다.

spring-data-jps란,

  • jpa를 스프링에서 사용하기 쉽도록 한 번 더 감싼 프레임워크이다.
  • pure jpa보다 더 간단해 보이지만, 성능이나 사이드 이펙트 등을 고려해 제대로 공부하고 사용해야 한다.





Jpa init



JPA 설정

  • META-INF/persistence.xml에 JPA 설정 파일이 들어간다.
  • persistence-unit 태그는 DB 하나 당 하나의 설정이 들어간다.
    • persistence.xml에 persistence-unit이 두 개 이상이라면, DB도 두 개 이상 사용이 가능하다.
    • persistence-unit은 이름으로 구분한다.
  • properties 태그 안에 property들이 들어가며, JPA 설정 정보들이 들어간다.
    • javax.persistence로 시작한다면 JPA 표준 속성
    • hibernate로 시작한다면 hibernate 전용 속성
  • 만약 gradle을 사용한다면, class 태그 안에 엔티티 클래스들을 하나하나 다 명시해줘야 한다.
    • 이거 maven은 안 그러던데 왜지??



JPA 동작 방식

  • Persistence 객체로부터 EntityManagerFactory 객체를 받아온다.
    • Persistence.createEntityManagerFactory(persistenceUnitName);
    • Persistence 객체는 persistence.xml의 설정 정보를 바탕으로 EntityManagerFactory를 생성한다.
    • EntityManagerFactory는 웹 서버가 떠 있는 동안에 계속 살아 있으며, 웹 서버가 죽을 때 없어진다.
  • EntityManagerFactory는 EntityManager를 생성한다.
    • emf.createEntityManager();
    • EntityManger는 한 트랜잭션 당 하나를 생성해서 사용하며, 트랜잭션이 끝날 때 같이 close한다.
      • EntityManager는 하나의 db 커넥션을 물고있기 때문에, 트랜잭션이 끝나면 꼭 close한다.
      • EntityManager를 여러 쓰레드가 공유해선 안된다. 장애 발생이 우려됨.
  • Entity 클래스의 객체를 EntityManager 객체를 이용해 작업을 수행한다.
    • 조회를 제외한 생성, 수정, 삭제 작업은 트랜잭션 내에서 사용해야 한다. 아니면 동작 안함.
      • em.getTransaction();
      • tx.begin();
      • tx.commit();
      • tx.rollback();



JPA Dialect

  • JPA는 특정 RDBMS에 종속적이지 않다.
    • 각각의 DB들은 조금씩 문법이 다른데, JPA는 어떤 DB를 사용하든 코드를 바꿀 필요가 없다.
    • persistence.xml에 적절한 dialect를 명시해두면, 그에 맞는 쿼리로 바꿔서 날려준다.
  • Hibernate는 약 40가지의 방언을 지원한다.



JPQL

  • JPA를 사용하면 엔티티 중심적으로 개발한다.
  • 애플리케이션에 필요한 데이터만 DB로부터 받아오기 위해선 검색 조건이 포함된 쿼리가 필요하다.
  • JPQL은 SQL을 추상화한 객체 지향 쿼리 언어이다.
  • JPQL 역시 특정 RDBMS에 종속적이지 않다.
  • JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 언어이다.





This post is licensed under CC BY 4.0 by the author.