2. JPA 사용해보기

xellos·2022년 6월 15일
0

JPA

목록 보기
1/7

환경 설정

  • META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
	<persistence-unit name="jpabook">
		<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.id.new_generator_mappings" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="create" />
		</properties>
	</persistence-unit>
</persistence>

객체 매핑

  • @Entity: 해당 클래스를 테이블과 매핑한다고 JPA에게 알린다. → 엔티티 클래스
  • @Table: 엔티티 클래스에 매핑할 테이블 정보를 알려준다. (생략시 클래스 이름 == 테이블 이름)
  • @Id: 엔티티 클래스의 필드를 테이블의 기본키 (PK)에 매핑. 해당 애노테이션이 적용된 필드를 식별자 필드라고 한다.
  • @Column: 필드를 컬럼에 매핑한다. 여기서는 name 속성을 사용해서 Member 엔티티의 username을 테이블의 NAME 컬럼에 매핑했다.
@Setter @Getter
@Entity
@Table(name="MEMBER")
public class Member {
	
    @Id @Column(name="ID")
    private String id;
    
    @Column(name="NAME")
    private String username;
    
    private Integer age;
    
}

애플리케이션 개발

public class Application {
	public static void main(String[] args) {
    	//[엔티티 매니저 팩토리] - 생성
        EntityManangerFactory emf = Persistence.createEntityManagerFactory("jpabook");
        
        //[엔티티 매니저] - 생성
        EntityManager em = emf.createEntityManager();
        
        //[트랜잭션] - 획득
        EntityTransaction tx = em.getTransaction();
        
        try {
        	tx.begin();
            logic(em);
        } catch (Exception e) {
        	tx.rollback();
        } finally {
        	em.close();
        }
        
        emf.close();
   	}
}
  • 엔티티 매니저 팩토리 생성
    persistence.xml 의 설정 정보를 사용해 엔티티 매니저 팩토리를 생성한다. 이때 Persistence 클래스를 생성하는데 이 클래스에서 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비한다.
    → 여기서 DB 커넥션 풀도 생성하므로 엔티티 매니저 팩토리의 생성 비용은 매우 크다. 따라서 애플리케이션 전체에서 한 번만 생성하고 공유해서 사용해야 한다.
//[엔티티 매니저 팩토리] - 새성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");

  • 엔티티 매니저 생성
    엔티티 매니저 팩토리에서 엔티티 매니저를 생성한다. JPA의 기능 대부분은 이 엔티티 매니저가 제공한다. 엔티티 매니저는 내부에 DB소스를 유지하면서 DB와 통신한다. 따라서 앱개발자는 엔티티 매니저를 가상의 DB로 생각할 수 있다. 참고로 엔티티 매니저는 DB 커넥션과 밀접한 관계가 있으므로 쓰레드간 공유 및 재사용하면 안된다.
//[엔티티 매니저] - 생성
EntityManager em = emf.createEntityManager();

  • 종료
em.close(); 	//[엔티티 매니저] - 종료
emf.close(); 	//[엔티티 매니저 팩토리] - 종료

1) 트랜잭션 관리

JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생한다.

try {
	tx.begin();		//[트랜잭션] - 시작
    logic(em);		//비즈니스 로직 실행
    tx.commit();	//[트랜잭션] - 커밋
} catch(Exception e) {
	tx.rollback();	//[트랜잭션] - 롤백
}

2) 비즈니스 로직

등록

String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("zenon");

em.persist(member);
INSERT INTO member(id, name) VALUES('id1', 'zenon');

수정

JPA는 어떤 엔티티가 변경되었는지 추적하는 기능을 갖추고 있다. 따라서 값만 변경하면 UPDATE SQL을 생성해서 값을 변경한다.

member.setName("xellos");
UPDATE member SET name = 'xellos' WHERE id = 'id1';

삭제

em.remove(member);
DELETE FROM member WHERE id = 'id1';

단건 조회

find() 메서드는 조회할 엔티티 타입과 @Id로 DB 테이블의 기본 키와 매핑한 식별자 값으로 엔티티 하나를 조회하는 가장 단순한 메서드다.

Member findOne = em.find(Member.class, id);
SELECT * FROM member id = 'id';

JPQL

아래 사용한 쿼리문은 SQL을 추상화한 JPQL(Java Persistence Query Language) 라는 객체 지향 쿼리언어다.

  • JPQL은 SQL과 문법이 거의 유사하다.
  • 둘의 차이점은 JPQL은 엔티티 객체를 대상으로 쿼리한다는 것이다. 즉, 클래스와 필드를 대상으로 쿼리한다.
  • 반면에 SQL은 DB테이블 대상으로 쿼리한다.
TypeQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
List<Member> members = query.getResultList();

0개의 댓글