Post

Springboot Jpa - JPA 시작하기

JPA를 사용하기 위한 프로젝트 설정과 구동 방식을 알아보자. JPQL이란 무엇인지 간단히 알아보자.

Springboot Jpa - JPA 시작하기

Hello JPA

기본 설정

dependency 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencies>
  <!-- JPA 하이버네이트 -->
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.3.10.Final</version>
  </dependency>

  <!-- JAXB 구현체 추가 -->
  <dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.1</version>
  </dependency>

  <!-- JAXB API 추가 (JDK 9 이상에서 필요) -->
  <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
  </dependency>
</dependencies>

pom.xml

  • 3~7JPA의 구현체인 하이버네이트 추가
  • 10~21하이버네이트는 javax.xml.bind를 의존하는데, java9이상에서는 기본제공하지 않아 추가

persistence.xml 작성

작성 위치는 resources/META-INF/하위에 위치해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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"><!-- DataBase 당 1개 생성-->
		<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/~/Develop/h2/h2"/>
			<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"/>
			<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
		</properties>
	</persistence-unit>
</persistence>

persistence.xml

  • 6~9DB의 접근 정보 입력
  • 10DB의 방언 정보 입력
  • 12옵션 설정: query를 보낼 때 마다 볼 것인지
  • 13옵션 설정: query를 볼 때 포맷팅 해줄것인지
  • 13옵션 설정: query가 동작하게 된 원인은 무엇인지

데이터베이스 방언 Build source 객체의 상속 관계, RDB의 슈퍼타입 서브타입 관계

데이터베이스 방언
SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능을 의미한다.

JPA는 특정 데이터베이스에 종속되지 않는다. 그래서 이런 데이터베이스의 방언도 처리가 되어야하는데, 이를 위해서 hibernate.dialect와 같은 방언에 대한 속성값을 입력한다.

JPA 구동 방식

Build source

1
2
3
4
5
6
7
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
EntityManager        entityManager        = entityManagerFactory.createEntityManager();

//TODO DB에 접근해서 할 로직 작성

entityManager.close();
entityManagerFactory.close();

entityManagerFactory와 entityManager

  • 1persistence-unit name을 매개변수로 해서, EntityManagerFactory를 생성한다.
    EntityManagerFactory애플리케이션당 1개만 생성해 공유되어야한다.
  • 2EntityManagerFactory에서 EntityManager를 생성한다.
    EntityManager1개의 트랜잭션마다 할당되어야한다.
    EntityManager는 쓰레드간에 공유하지 않고, 사용하고 버려야한다.
    JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야한다.
  • 4EntityManager를 통해서 실제 DB에 접근해서 할 추가, 수정, 삭제등의 로직을 작성한다.

JPQL 소개

JPQL
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다.
모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능해 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요한데, 이 때 검색 조건을 쿼리로 할 수 있도록 해주는 기능이다.
객체를 대상으로 한 쿼리를 작성함으로써 엔티티 객체를 대상으로 검색한다.
쿼리를 작성함에도 특정 데이터베이스에 의존하지 않는다는 것이 장점이다.
1
2
3
4
List<Member> memberList = entityManagerFactory.createQuery("select m from Member as m", Member.class)
                                              .setFirstResult(5)
                                              .setMaxResult(8)
                                              .getResultList();

jpql의 예시

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