02. JPA 시작하기

ex1-hello-jpa 프로젝트 코드 에서 실습함

프로젝트 생성#

H2 DB 설치와 실행#

  • h2database.com
    • Mac이라 All Platform으로 다운
    • download 경로 풀어놓음 (까먹을까봐 ㅎㅎ)
    • 다운로드 경로에 ./bin/h2.sh 실행
    • Server 모드로 실행
  • 로컬 실습용 (테스트용) DB
  • 가벼움
  • 웹 콘솔 환경 지원
  • SQL 지원
  • 시퀀스, AUTO INCREMENT 기능 지원

프로젝트 생성#

  • Java 8 이상
  • Maven 설정
    • groupId: jpa-basic
    • artifactId: ex1-hello-jpa
    • version: 1.0.0

의존성#

pom.xml 에 dependencies 추가
<dependencies>
<!--jpa hibernate-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!--h2 드라이버-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>

persistence.xml 추가#

  • JPA 설정 파일
  • main/resources/META-INF/persistence.xml 경로로 세팅
  • persistence-unit name으로 DB 이름 지정
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">
<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"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!--방언 설정-->
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/> <!--db 쿼리 볼껀지 관련 옵션들-->
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>

DB 방언#

  • JPA는 특정 DB 종속 X
  • DB 벤더마다 다른 표현들을 방언 dialect 라 표현
    • 페이징: MySQL은 LIMIT, Oracle은 ROWNUM
  • mysql, oracle, h2 등 각각 dialect 가 있음
  • javax 로 시작하는 property
    • hibernate에 의존적이지 않음
  • hibernate.dialect
    • hibernate의 전용 옵션

앱 개발#

JPA 구동 방식#

  1. PersistenceMETA-INF/persistence.xml 의 설정정보 조회
  2. PersistenceEntityManagerFactory 를 생성
  3. 팩토리가 EntityManager 를 필요할때마다 찍어냄

실습#

  • option command v -> 변수 자동완성
  • h2 콘솔 시작 시, jdbc url은 persistence.xml 에서 설정한 값과 똑같이 설정

JPA 활용한 Member Entity 실습#

  • JPA는 transaction 단위가 중요
transaction 지정 시, console에 쿼리가 찍힘
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(name, id)
values
(?, ?)
  • JPA가 맵핑 정보를 보고 쿼리를 만들어 줌

주의 사항#

  • EntityManagerFactory 는 앱이 실행되는 시점에서 하나만 만들어져야 함
  • EntityManager 는 여러 스레드간 공유 X (사용하고 버려야 함)
    • 계속 요청마다 썼다가 지웠다하는 역할 (DB 커넥션을 쓰고 바로 돌려주듯이)
  • JPA의 모든 데이터 변경은 트랙잭션 안에서 실행

JPQL 소개#

객체 지향 SQL, 뒤에서 상세히 다루게 됨

  • 현업에서의 고민
    • 필요한건 조인도 해야되고... 원하는 데이터만... 통계성 쿼리도...
    • JPA에선 JPQL로 도와줌
  • JPA를 사용하면 엔터티 객체 중심으로 개발 됨
  • 문제는 검색쿼리... 조인 남발..
  • 검색을 할 때도 테이블이 아닌 엔터티 객체를 대상으로 검색
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
  • 앱이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

SQL과 차이#

  • JPQL은 엔터티 객체 중심의 쿼리
  • SQL은 DB의 테이블 대상임

장점#

  • dialect를 바꿔도 JPQL을 바꾸지 안아도 됨
  • 객체 지향 개념을 쿼리에 적용할 수 있음
Last updated on