티스토리 뷰
개요
예제 프로젝트를 통해 Hibernate를 사용해보자
Persistence.xml 설정
: META-INF/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="study">
<properties>
<!-- H2 필수 속성 -->
<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/C:/Users/evo/Database/h2/study"/>
<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.jdbc.batch_size" value="10"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
</persistence-unit>
</persistence>
속성을 보면 java 표준 속성(javax.persistence), 하이버네이트 속성(hibernate)로 나뉜다.
하이버네이트에서는 데이터베이스의 방언을 설정하게 된다.
데이터베이스 방언(=dialect)란? SQL 표준을 지키지 않거나, 특정 데이터베이스만의 고유한 기능
2. 애플리케이션에서 사용하기
public class JpaMain {
public static void main(String[] args) {
//엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
try {
tx.begin(); //트랜잭션 시작
logic(em); //비즈니스 로직
tx.commit();//트랜잭션 커밋
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //트랜잭션 롤백
} finally {
em.close(); //엔티티 매니저 종료
}
emf.close(); //엔티티 매니저 팩토리 종료
}
public static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("지한");
member.setAge(2);
//등록
em.persist(member);
//수정
member.setAge(20);
//한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
//삭제
em.remove(member);
}
}
EntityManagerFactory
: JPA 구현체에 따라 데이터베이스 커넥션 풀도 생성하므로 생성 비용이 크다. 그러므로 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성되고 공유해서 사용해야 한다.
커넥션 풀이란? 데이터베이스와 연결된 커넥션을 미리 만들어 풀 속에 저장해 두었다가 필요할 떄 커넥션을 풀에서 쓰고 다시 반환하는 기법 또는 미리 생성한 커넥션을 모아놓은 집합
EntityManager
: 데이터베이스에 등록/수정/삭제/조회를 할 수 있다. 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용될 수 없다. 또한 트랜잭션을 시작할 때 커넥션을 획득한다. 트랜잭션이 수행된 후에는 반드시 닫고 DB 커넥션을 반환한다
Transaction
: 데이터의 모든 변경은 트랜잭션 안에서만 실행 가능하다.
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
try {
tx.begin(); //트랜잭션 시작
logic(em); //비즈니스 로직
tx.commit();//트랜잭션 커밋
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //트랜잭션 롤백
} finally {
em.close(); //엔티티 매니저 종료
}
emf.close(); //엔티티 매니저 팩토리 종료
정상 동작 후에는 트랜잭션을 커밋, 예외가 발생하면 롤백한다.
BuisnessLogic
: 엔티티를 하나 생성한 다음 엔티티 매니저를 통해 데이터베이스에 등록, 수정, 삭제, 조회 한다. 수정 시 update()와 같은 메소드를 호출 할 필요 없이 값을 변경하면 알아서 데이터베이스에 반영된다. 추후 영속성 컨텍스트에서 자세히 알아보자
3. JPQL
: JPA는 SQL을 추상화한 Java Persistence Query Language라는 객체지향 쿼리 언어를 제공한다.
- JPQL : 엔티티 객체를 대상으로 쿼리 실행, JPQL은 데이터베이스 테이블을 알지 못함
- SQL : 데이터베이스 테이블을 대상으로 쿼리 실행
'BackEnd > JPA 스터디' 카테고리의 다른 글
[JPA 스터디 3주차] - 프록시와 연관관계 정리 (0) | 2021.07.14 |
---|---|
[JPA 스터디 3주차] - 다양한 연관관계 매핑 (0) | 2021.07.12 |
[JPA 스터디 2주차] - 엔티티 매핑 (0) | 2021.07.05 |
[JPA 스터디 1주차] - 영속성 관리 (0) | 2021.06.26 |
[JPA 스터디 1주차] - JPA 소개 (0) | 2021.06.24 |