JPA에 대해서

노력하는 배짱이·2022년 7월 19일
0

JPA

목록 보기
1/9

JPA

  • Java Persistence API
  • 자바 진영(자바 플랫폼 SE, EE)의 ORM 기술 표준

ORM

  • Object-relational mapping [객체 관계 매핑]

    데이터 베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법 - 위키백과

  • 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크(JPA, Hibernate, EclipseLink etc)가 중간에서 매핑

동작 방식

  • JPA 는 Java Application 과 JDBC 사이에서 동작

사용 이유

  1. 객체 중심으로 개발이 가능
  2. 객체지향적인 코드 작성이 가능하면서, 생산성이 향상
  3. 유지보수에 탁월
    3.1 데이터 필드가 추가되는 경우 JPA는 해당 객체의 필드만 추가하면 됨
    3.2 기존 SQL에서는 해당하는 모든 SQL를 수정
  4. 패러다임의 불일치 해결
    4.1 상속관계
    4.2 연관관계
    4.3 객체 그래프 탐색
    4.4 비교
  5. 성능 최적화
    5.1 1차 캐시와 동일성(Identity) 보장
    -> 같은 트랜잭션 안에서는 동일한 Entity를 반환 -> 캐싱된 Entity를 반환
    5.2 트랜잭션을 지원하는 쓰기 지연(Transactional Write-Behind)
    -> 트랜잭션을 Commit할 때까지 SQL를 모아서 한번에 처리 (JDBC BATCH SQL 기능)
    5.3 지연 로딩(Lazy Loading)
    -> Update, Delete로 인한 Row Rock(락) 시간을 최소화
    -> commit 시점에 해당 쿼리를 수행
    -> 지연 로딩 : 객체가 실제 사용될 때 로딩
    -> 즉시 로딩 : Join Sql로 한번에 연관된 객체까지 미리 조회

Dialect (방언)

  • JPA는 특정 데이터베이스에 종속적이지 않음
  • Dialect 설정으로 JPA에게 어떤 종류의 DBMS를 사용하는지 알려줄 수 있음
/META-INF/persistence.xml 설정
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

JPA 구동 방식

  1. Persistence 는 META-INF/persistence.xml 설정 정보를 조회
  2. Persistence 가 EntityManagerFactory 생성
val emf: EntityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName)
  1. EntityManagerFactory 가 각각의 필요한 EntityManager를 생성
    3.1 조회, 저장 등 클라이언트 요청마다 생성되어 처리 후 없어지는 존재
val em: EntityManager = emf.createEntityManager()

✔️ 예제 코드

fun main(args: Array<String>) {

    runApplication<>(*args)

    val emf: EntityManagerFactory = Persistence.createEntityManagerFactory("hello")

    val em: EntityManager = emf.createEntityManager()

    val tx: EntityTransaction = em.transaction

    tx.begin()

    try {
		// 비즈니스 로직
        
        ( ... )
        
        tx.commit()
    } catch (e: Exception) {
        tx.rollback()
    } finally {
        em.close()

    }
    emf.close()

}

주의

  1. 엔티티 매니저 팩토리(EntityManagerFactory)는 하나만 생성하여 Application 전체에서 공유
  2. 엔티티 매니저(EntityManager)는 쓰레드 간에 공유해서는 안됨
  3. JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

JPQL

  • JPA를 사용하면 엔티티 객체를 중심으로 개발을 하고, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 함
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문에, 검색 조건이 포함된 SQL이 필요
  • JPQL 은 객체를 대상으로 검색하는 객체 지향 쿼리 이며, 특정 데이터베이스 SQL에 의존하지 않음

참고 : 인프런 강의[자바 ORM 표준 JPA 프로그래밍 - 기본편]

0개의 댓글