BACK/JPA

[JPA] TIL 4일차 - JPA 시작하기, 동작 방식

연듀 2024. 3. 31. 12:38

JPA 시작하기

 

JPA 구동 방식

Persistence.xml 설정 정보를 읽어서 EntityManagerFactory라는 클래스를 만든다.

여기서 필요할 때마다 EntityManager를 사용한다.

  • EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유해야 한다.
  • 앤티티매니저는 쓰레드 간에 공유하면 안된다.
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.

 

회원 저장

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 데이터베이스 연결
        // 애플리케이션 로딩 시점에 딱 하나만 만들어야 한다.

        EntityManager em = emf.createEntityManager(); // database connection을 받음
        //code

        EntityTransaction tx = em.getTransaction(); // 트랜잭션 단위 안에서 실행되어야 함
        tx.begin();

        try{
            Member member = new Member();
            member.setId(1L);
            member.setName("helloA");

            em.persist(member);

            tx.commit();
        }catch(Exception e){
            tx.rollback();
        }finally {
            em.close();
            emf.close();
        }

	emf.close(); 

 

 

조회, 수정, 삭제

try{
	Member findMember = em.find(Member.class, 1L); // 조회
	System.out.println("findMember.id = " + findMember.getId());

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

	em.remove(findMember); // 삭제

		
	tx.commit();
 }catch(Exception e){
     tx.rollback();
 }finally {
     em.close();
     emf.close();
 }

 

 

물리적인 테이블 대상으로 쿼리를 날리면 DB에 종속적인 설계가 되기 때문에

JPA는 엔티티 객체를 대상으로 쿼리를 할 수 있는 JPQL을 제공한다.

*JPQL: 객체 지향 쿼리 언어

 

try{
 	// Member findMember = em.find(Member.class, 1L); // 조회
	List<Member> result = em.createQuery("select m from Member as m", Member.class)
                    .setFirstResult(5)
                    .setMaxResults(8)
                    .getResultList();
            // 테이블이 아닌 엔티티 객체 대상으로 쿼리한다.
            for (Member member : result) {
                System.out.println("member.getName() = " + member.getName());
            }
            tx.commit();
}catch(Exception e){
            tx.rollback();
}finally {
            em.close();
            emf.close();
}

 

SQL을 추상화해서 특정 데이터베이스에 SQL에 의존하지 않는다.

DB 종류를 바꿔도 JPQL 쿼리를 안바꿔도 된다. JPA가 알아서 맞게 SQL로 변환해준다.

 

 

정리

  • JPA는 항상 EntityManagerFactory 라는걸 만들어야 한다. (설정 파일을 읽어와 생성)
  • EntityManagerFactory에서 고객의 요청이 올 때마다 DB 작업을 해야하면 EntityManager를 통해 작업을 해야 한다.
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 일어나야 한다.
  • commit()으로 커밋을 해줘야 DB에 반영이 된다.
  • 자원을 다쓰면 close() 메서드로 데이터베이스의 커넥션을 반환해야 한다.
  • 웹 어플리케이션이면 WAS가 내려갈 때 EntityManagerFactory를 닫아줘야 한다.

 

 

 

인프런 자바 ORM 표준 JPA 프로그래밍 - 기본편을 수강하고 정리한 글입니다.

https://www.inflearn.com/course/ORM-JPA-Basic