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 |