1 분 소요

이 포스트 시리즈는 inflearn의 ‘‘자바 ORM 표준 JPA 프로그래밍 - 기본편 : 김영한’’ 강의와 개인적인 추가학습을 정리한 내용입니다.


1. JPA

1) 기존 패러다임

  • DB: 여러가지 DB가 있지만, 현실적으로 가장 많이 사용하는 DB는 RDB(관계형 데이터베이스).
  • 언어: 객체 지향언어가 사용되고 있음(Java, Scala 등).
  • DB 단의 데이터 형태: RDB
  • 백엔드 단의 데이터 형태: 객체
  • 데이터 작업을 위해 매번 SQL 매핑작업을 했어야 했다.! -> SQL에 매우 의존적이며, 데이터 컬럼이 추가될 때마다 여러 곳에서 작업을 반복해야 함.
  • 데이터 형태가 무언가 불일치한다.! -> 객체를 편하게 저장할수는 없을까?

2) JPA의 관점

  • 객체 데이터를 컬랙션 다루듯이 DB에 저장하자!
  • 객체의 장점인 다형성을 적극 활용할 수 있도록 하자!

3) JPA란?

  • 어플리케이션과 JDBC 사이에서 동작하는 ORM(Object - Relational Mapping) 프레임워크.

  • 결국, 매핑작업을 하기는 해야지. 그러나 그 작업을 JPA 인터페이스가 작업해줌. 그리고 이를 통해 SQL에 덜 의존적인 객체 지향의 설계가 가능해짐!!

    • Entity 분석

    • SQL 생성

    • ResultSet 매핑

    • 즉, JDBC API를 사용

      [API 드라이버 세팅 예시 - Maven 프로젝트]
      <!-- META-INF / persistence.xml -->
          
      <?xml version="1.0" encoding="UTF-8"?>
      <persistence version="2.2"
                   xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
          <persistence-unit name="hello"> <!-- 사용 EntityManagerFactory에서 참조할때 사용할 이름 -->
              <properties>
                  <!-- 필수 속성 -->
                  <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
                  <property name="javax.persistence.jdbc.user" value="sa"/>
                  <property name="javax.persistence.jdbc.password" value=""/>
                  <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
                  <!-- 이 부분이 DB에 따라 MySQLDialect, OracleDialect 등으로 바뀜 -->
                  <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
                      
                  <!-- 옵션 -->
                  <property name="hibernate.show_sql" value="true"/>
                  <property name="hibernate.format_sql" value="true"/>
                  <property name="hibernate.use_sql_comments" value="true"/>
                      
                  <!-- batch 옵션 -->
                  <property name="hibernate.jdbc.batch_size" value="10"/>
                      
                  <!-- 자동으로 DB table 생성 옵션 -->
                  <property name="hibernate.hbm2ddl.auto" value="create"/>
              </properties>
          </persistence-unit>
      </persistence>
          
      
      [사용할 EntityManagerFactory]
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
      

JPA가 구현하는 3가지 구현체

1) Hibernate (거의 90% 이상) 2) EclipseLink 3) DataNucleus

4) JPA의 기능

  1. 1차 캐시와 동일성(identity) 보장 (영속성 컨텍스트와 1차 캐시)
    • 같은 트랜잭션 안에서는 같은 엔티티를 반환.
  2. 트랜잭션을 통한 쓰기 지연
    • JDBC BATCH를 사용하여 SQL을 한번에 전송
  3. 지연 로딩
    • 객체가 실제로 사용될 때 쿼리를 날려 로딩. -> 객체의 트리탐색이 가능해짐.

5) JPA 구동방식

  1. Persistence(영속 컨텍스트)가 META-INF의 persistence.xml 설정 정보를 조회함.
  2. 설정 정보를 반영한 EntityManagerFactory를 생성
  3. 트랜잭션에 맞춰 EntityManager를 생성하여 영속성 관리를 하며 DB를 매핑함.
  • EntityManagerFactory - 하나만 생성. 애플리케이션 전체에서 공유함.
  • EntityManager - 쓰레드간에 공유하지 않고 사용하면 바로 버려야 함. (JDBC의 커넥션 객체라고 생각하면 편함)

마지막 수정 일시: 2022-08-29 12:45

카테고리:

업데이트:

댓글남기기