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 프로그래밍 - 기본편을 수강하고 정리한 글입니다.
반응형
    
    
    
  'BACK > JPA' 카테고리의 다른 글
| [JPA] 영속성 관리(1차 캐시, 쓰기 지연, 변경 감지) (1) | 2024.04.01 | 
|---|---|
| [JPA] JPA 연관관계 매핑 (1) | 2024.03.31 | 
| [JPA] JPA 소개, 사용 이유 (0) | 2024.03.30 | 
| [JPA] 실무 활용 - 스프링 데이터 JPA 와 Querydsl (1) | 2024.03.15 | 
| [JPA] 실무 활용 - 순수 JPA 와 Querydsl (0) | 2024.03.15 |