JPA 환경 설정
메이븐에 라이브러리 추가
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jpa-basic</groupId>
<artifactId>ex1-hello-jpa</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- JPA 하이버네이트 -->
<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>
</project>
persistence.xml 설정 정보 기입
META-INF/persistence.xml
에 jpa 설정정보를 기입- 필수옵션, 부가옵션등을 설정
- JPA를 사용하기 위해서 해당 설정 정보를 가지는
persistence-unit
의 이름을 가지는 객체를 리턴받아서 사용한다.
주의점!
EntityManagerFactory
는 하나만 생성해서 애플리케이션 전체에서 공유EntityManager
는 쓰레드간에 공유X → 사용하고 버려야 한다.- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPA를 사용한 실습 코드
1. 회원 등록
- 회원 등록은 객체에 값을 set메서드로 세팅을 후, EntityManager클래스의
persist()
를 사용하면 insert쿼리문이 실행 된다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
//고객이 DB에 접근하는 한 일관적인 단위를 할때마다 EntitiyManager를 만들어 주어야 한다.
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Member member = new Member();
member.setId(2L);
member.setName("helloA");
em.persist(member);
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
emf.close();
}
2.회원 조회
- EntityManager클래스의
find()
메서드 사용
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember = " + findMember.getId());
System.out.println("findMember = " + findMember.getName());
tx.commit();
3. 회원 수정
- 멤버 조회후 해당 멤버의 값을 set해준후에,
persist()
할 필요가 없다. - 그냥 조회후, setName 하면, update쿼리문이 DB에 전송!
- JPA를 통해서 Entity를 가져오고, 트랜젝션 커밋을 하면, 커밋 실행전에 JPA에서 해당 Entity에서 바뀐점이 있는지 확인 해서 바뀐점이 있으면, UPDATE쿼리문이 실행
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
4. 회원 리스트 조회 - JPQL의 사용
- 회원 리스트를 조회 할 때는
JPQL
을 사용한다. - JQPL은 쿼리문 작성시 테이블 이름이 아니고, 조회하고자 하는 객체의 이름으로 쿼리문을 작성한다.
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
//테이블이 아니라 Member객체로 쿼리문 작성
for (Member member : result) {
System.out.println("member.name = " + member.getName());
}
멤버 리스트에서 검색 조건을 포함한 경우
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(5)
.setMaxResults(8)
.getResultList();
- 5번부터 - 8번까지의 rownum을 가지는 자료를 조회
JPQL 이란?
JPA를 사용하면, 엔티티 객체를 중심으로 개발하게 되는데, 검색 쿼리를 수행할 때도, 객체를 대상으로 검색 하게 된다. 이러면 모든 DB데이터를 객체로 변환해서 검색해야하는데, 이는 불가능하다. → 검색 조건이 포함된 SQL이 필요
JPA는 SQL을 추상화한 JPQL
이라는 객체 지향 쿼리 언어를 제공한다.
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 데이터베이스 테이블을 대상으로 쿼리
정리
- JPA는 항상
EntityManagerFactory
객체를 이용해서 사용한다. EntityManagerFactory
객체는persistence.xml
의 설정 정보를 읽어와서 만든다.- 고객의 요청이 올때(DB작업을 해야 할 때),
EntityManager를 통해서 작업
이 일어난다. - JPA의 모든 데이터 변경은 트랜젝션 안에서 일어나야 한다.
반응형