[JPA] JPA 구동방식

19·2022년 9월 5일
0

JPA

목록 보기
3/18
post-custom-banner

JPA 구동방식

JPA를 사용하기 위해선 일단 EntityManagerFactory가 필요하다.

Persistence를 사용해 생성하면 된다

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
  • EntityManagerFactory가 생성되면 DB와 연결되고 쿼리를 날릴 수 있게된다.

생성한 EntityManagerFactory로 EntityManager를 생성한다.

EntityManager em = emf.createEntityManager();
  • EntityManager를 통해 JPA를 쿼리를 작성하고 사용할 수 있다.

테이블과 매핑되는 클래스 만들기

테이블

create table Member (
    id bigint not null,
    name varchar(255),
    primary key (id)
);

클래스 (객체)

@Entity
public class Member {
    @Id
    private Long id;    
    private String name;

	...
}
  • id와 name이 DB에 있기 때문에 필드에 꼭 넣어줘야 한다
  • PK가 무엇인지 명시해야함 (데이터베이스 PK와 매핑)

주의할 점

EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유해야 한다

EntityManager는 사용하고 버린다 em.close();

  • 쓰레드간 공유 금지

JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// 트랜잭션 얻어오기
EntityTransaction tx = em.getTransaction();
tx.begin(); // 트랜잭션 시작

try {
    // 코드 작성

    tx.commit(); // 커밋
} catch (Exception e) {
    tx.rollback(); // 예외 발생하면 롤백
} finally {
    em.close();
}
emf.close();
  • EntityManager 객체로 트랜잭션을 생성하고 직접적인 코드 작성은 트랜잭션 안에서 실행되도록 하고, 커밋을 해야 적용된다.

JPA 사용

예시1)

Member 객체에 값을 넣고 저장

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// 트랜잭션 얻어오기
EntityTransaction tx = em.getTransaction();
tx.begin();  // 트랜잭션 시작

// Member 객체 생성
try {
    Member member = new Member();
    member.setId(2L);
    member.setName("HelloB");

    // 저장
    em.persist(member);

	tx.commit();  // commit을 해야 DB에 반영됨
} catch (Exception e) {
    tx.rollback();
} finally {
    em.close();
}
emf.close();
  • 트랜잭션 내에서 코드를 작성후 commit을 해서 반영
  • Member 객체 생성 후, 값 세팅 -> JPA에게 객체를 넘겨줌 (저장) -> JPA가 관련 SQL 작성해 DB에 저장

  • JPA가 SQL을 작성해줌


예시2)

저장한 Member객체 조회, 수정

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// 트랜잭션 얻어오기
EntityTransaction tx = em.getTransaction();
tx.begin();  // 트랜잭션 시작

try {
    // DB에서 조회
    Member findMember = em.find(Member.class, 2L);
    // 수정
    findMember.setName("HelloJPA");

    tx.commit();  // commit을 해야 DB에 반영됨
} catch (Exception e) {
    tx.rollback();
} finally {
    em.close();
}
emf.close();
  • DB에서 Member객체 조회 후, set으로 수정
    • 수정을 하고 저장하지 않았는데, 변경사항이 적용됨
  • JPA에서 값을 가져오면 JPA가 관리한다
    • 변경사항이 있는지 commit할 때 확인하고 변경이 있으면 Update 쿼리를 날린다

  • Select 쿼리, Update 쿼리가 생성됨

  • 변경 적용



참고

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 김영한

profile
하나씩 차근차근
post-custom-banner

0개의 댓글