①. JPA
이 포스트 시리즈는 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차 캐시와 동일성(identity) 보장 (영속성 컨텍스트와 1차 캐시)
- 같은 트랜잭션 안에서는 같은 엔티티를 반환.
- 트랜잭션을 통한 쓰기 지연
- JDBC BATCH를 사용하여 SQL을 한번에 전송
- 지연 로딩
- 객체가 실제로 사용될 때 쿼리를 날려 로딩. -> 객체의 트리탐색이 가능해짐.
5) JPA 구동방식
Persistence
(영속 컨텍스트)가 META-INF의persistence.xml
설정 정보를 조회함.- 설정 정보를 반영한
EntityManagerFactory
를 생성 - 트랜잭션에 맞춰
EntityManager
를 생성하여 영속성 관리를 하며 DB를 매핑함.
EntityManagerFactory
- 하나만 생성. 애플리케이션 전체에서 공유함.EntityManager
- 쓰레드간에 공유하지 않고 사용하면 바로 버려야 함. (JDBC의 커넥션 객체라고 생각하면 편함)
마지막 수정 일시: 2022-08-29 12:45
댓글남기기