반응형
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
Hello JPA 프로젝트 생성
- Language : JAVA 8 이상(8 권장)
- DB : H2 Database - http://www.h2database.com/
- 최고의 실습용 DB
- 가벼움 (1.5M)
- 웹용 쿼리툴 제공
- MySQL, Oracle DB 시뮬레이션 기능
- 시퀀스, AUTO INCREMENT 기능 지원
- Build Tool : Maven
- 자바 라이브러리, 빌드 관리
- 라이브러리 자동 다운로드 및 의존성 관리
- 최근에는 그레이들(Gradle)을 많이 사용하지만 강의에서는 아직도 Maven을 많이 사용하기 때문에 Maven으로 진행
IntelliJ에서 프로젝트 생성
pom.xml dependency 추가
<!-- 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>
추가 후 라이브러리 글자가 빨간 글자가 되길래 뭐지 하다가 저장해봤더니 라이브러리를 다운이 다 되면 하얀색 글자로 돌아온다.
JPA 설정 - persistence.xml
- src/main/resources/META-INF/persistenct.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"/>
<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>
- hibernate.dialect 옵션의 경우 각 DBMS마다 기능은 같거나 비슷하지만 명칭이 다른 부분 때문에 Oracle을 사용할 거면 Oracle, MySQL을 사용할 거면 MySQL로 지정해주어야 각 DBMS에 맞게 쿼리가 작성된다.
ex) MySQL의 Limit, Oracle의 Rownum
애플리케이션 개발
- h2 DB에 MEMBER TABLE 생성
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
- JpaMain.class 코드 작성
// 저장의 경우 JPA 정석 코드
public class JpaMain {
public static void main(String[] args) {
// 엔티티 매니저 팩토리 생성, 파라미터로 넘어가는 값은 persistence.xml에서 persistence-unit의 name 값을 넘겨주면 된다.
// emf의 경우 애플리케이션 로딩 시점에 딱 하나만 만들면 된다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 생성
Member member = new Member();
member.setId(1L);
member.setName("helloA");
em.persist(member);
// 조회
// 첫번째 파라미터 : 엔티티 클래스
// 두번째 파라미터 : PK 값
Member findMember = em.find(Member.class, 1L);
// 삭제
//em.remove(findMember);
// 수정
findMember.setName("HAN");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
// 엔티티 매니저 종료
em.close();
}
// 엔티티 매니저 팩토리 종료
emf.close();
}
}
- JPA 구동 방식
- EntityManagerFactory
- 애플리케이션 전체에서 딱 한 번만 생성해서 애플리케이션 전체에서 공유해 사용한다.
- EntityManager를 생성한다.
- EntityManager
- 쉽게 생각하면 DB 커넥션 풀과 같은 기능을 가지고 있다고 생각하면 된다.
- DB 커넥션과 밀접한 관계가 있으므로 Thread 간 공유하면 안 되고 사용 후 버려(close)야 한다.
조회
- 단건 조회의 경우 위에서 작성했던 코드처럼 간단하게 조회할 수 있다.
Member findMember = em.find(Member.class, 1L);
- 다건 조회일 때는 JPQL을 사용해야한다.
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList();
// 모든 멤버 이름 출력
for (Member member : result) {
System.out.println("member.name = " + member.getName());
}
JPQL
- SQL을 추상화한 객체 지향 쿼리 언어 -> 특정 DB SQL에 의존하지 않음
- SQL과 문법이 유사하고 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- JPQL은 엔티티 객체를 대상으로 쿼리를 작성
- SQL은 데이터베이스 테이블을 대상으로 쿼리를 작성
반응형