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가 동작하게 된 원인은 무엇인지
데이터베이스 방언
객체의 상속 관계, RDB의 슈퍼타입 서브타입 관계
- 데이터베이스 방언
- SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능을 의미한다.
JPA는 특정 데이터베이스에 종속되지 않는다. 그래서 이런 데이터베이스의 방언도 처리가 되어야하는데, 이를 위해서
hibernate.dialect
와 같은 방언에 대한 속성값을 입력한다.
JPA 구동 방식
1
2
3
4
5
6
7
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
EntityManager entityManager = entityManagerFactory.createEntityManager();
//TODO DB에 접근해서 할 로직 작성
entityManager.close();
entityManagerFactory.close();
entityManagerFactory와 entityManager
- 1
persistence-unit name
을 매개변수로 해서,EntityManagerFactory
를 생성한다. EntityManagerFactory
는 애플리케이션당 1개만 생성해 공유되어야한다.
- 1
- 2
EntityManagerFactory
에서EntityManager
를 생성한다. EntityManager
는 1개의 트랜잭션마다 할당되어야한다.EntityManager
는 쓰레드간에 공유하지 않고, 사용하고 버려야한다.- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야한다.
- 2
- 4
EntityManager
를 통해서 실제 DB에 접근해서 할 추가, 수정, 삭제등의 로직을 작성한다.
JPQL 소개
- JPQL
- JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다.
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능해 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요한데, 이 때 검색 조건을 쿼리로 할 수 있도록 해주는 기능이다.
- 객체를 대상으로 한 쿼리를 작성함으로써 엔티티 객체를 대상으로 검색한다.
- 쿼리를 작성함에도 특정 데이터베이스에 의존하지 않는다는 것이 장점이다.
- 모든 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.