본문 바로가기
JAVA/JPA

인프런 JPA 2화 생성,삭제,수정 "김영한 강사" -PlusUltraCode-

by PlusUltraCode 2024. 7. 19.

 

## JPA의 트랜잭션 관리

JPA의 모든 활동은 트랜잭션이 반드시 필요합니다. 트랜잭션 없이 아래와 같은 코드를 실행해봤자 무의미합니다.

```java
public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        Member2 member2 = new Member2();
        member2.setId(1L);
        member2.setName("dongho");

        em.persist(member2);

        em.close();
        emf.close();
    }
}

 

 

트랜잭션 관리

어떻게 해야 할까요? EntityManager 안에 있는 트랜잭션을 꺼내야 합니다.

 
EntityTransaction tx = em.getTransaction(); tx.begin();

그리고 커밋할 시점을 정해야 합니다.

 
tx.commit();

생성

위에서 객체를 생성했습니다. 그렇다면 수정을 하려면 어떻게 해야 할까요?

먼저 ID를 통해 찾아야 합니다.

 
var findMember = em.find(Member2.class, 1L); // 1번 엔티티를 찾음

그 다음, 수정을 하려면

 
findMember.setName("dongho23"); // 수정
 

여기서 다시 저장할 필요는 없습니다. 그냥 이대로 끝입니다. 이렇게 되는 이유는 JPA를 이용하여 쿼리로 가져오면 JPA가 해당 객체를 관리하게 됩니다. 그래서 tx.commit()하는 시점에 변경 여부를 점검합니다. 바꾼 내용을 포착하면 update 쿼리를 만들어 트랜잭션을 커밋합니다. 즉, 우리는 별도로 만들 필요가 없습니다.

삭제

삭제하는 과정은 간단합니다.

 
em.remove(findMember); // 삭제

주의점

반드시 EntityManager는 사용 후 버려야 합니다. 쓰레드 간의 공유는 금지입니다.

복잡한 쿼리

복잡한 쿼리를 만들기 위해서는 JPQL을 사용합니다.

 
var memberList = em.createQuery("select m from Member as m", Member.class).getResultList();

Paging Navigation

Paging Navigation이 쉽습니다.

 
var memberList = em.createQuery("select m from Member as m", Member.class)
                          .setFirstResult(5)
                         .setMaxResult(8)
                           .getResultList();

여기서 중요한 점은 Member는 우리가 직접 IntelliJ에서 만든 엔티티 객체를 대상으로 쿼리를 날리는 것입니다. 실제 SQL은 데이터베이스에서 만든 테이블을 대상으로 쿼리를 날리기 때문에 차이가 있습니다. 이점은 방언을 바꿔도 그대로 유지된다는 점입니다.