JPA 구동 방식
JPA 구동방식을 설명하자면
먼저 Persistence 클래스에서 시작해서 설정 정보를 조회하고 EntityManagerFactory 클래스를 생성한다
마지막으로 EntityManagerFactory 클래스에서 나오는 EntityManager 들을 생성한다.
실제 코드)
메인 클래스에서 EntityManagerFactory 생성
그렇게 되면 DB와 연결이 가능해진다.
* [persistence.xml] 에서 <persistence-unit name="hello"> 이름을 넣는다
EntityManager 생성
DB에 조회하고 저장하는 실제 코드는 EntityManager 생성 후 작성해야한다.
public class JpaMain {
public static void main(String[] args) {
//EntityManagerFactory 는 애플리케이션 로딩시점에 딱 하나만 만들어놔야한다
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//'상품을 장바구니에 담기'같은 DB커넥션을 얻고 쿼리를 줘서 종료되는 일련의 과정의 단위를 할때마다 EntityManager를 만들어줘야함
EntityManager em = emf.createEntityManager();
//실제 code 작성위치 (DB데이터 조회,저장...)
em.close();
emf.close();
}
@Entity
public class Member {
//PK 설정(@Id 어노테이션)
@Id
private Long id;
private String name;
//getter, setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Entity 어노테이션을 꼭 써야하는 이유는 JPA가 처음 실행할때 인식을 하게 만든다.
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
//JPA는 트랜잭션 안에서 작업해야한다
//쉽게 말해 DB 커넥션을 받아놓는다
EntityTransaction tx = em.getTransaction();
tx.begin(); //DB 트랜잭션 시작
//member 객체 생성
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
//저장
em.persist(member);
//커밋
tx.commit();
em.close();
emf.close();
}
객체를 생성하고 setID, setName 을 저장한다고 저장이 안된다
왜냐하면 jpa는 트랜잭션 안에서 작업을 해야하기 때문이다
트랜잭션을 실행하여 값을 저장하고 커밋을 하면 DB에 값이 저장된다.
EntityTransaction tx = em.getTransaction();
tx.begin();
//실제코드~~
tx.commit();
여기까지가 JPA의 정석으로 쓰는 코드다.
실제로는 스프링이 해결해줘서 굳이 안써도 되고
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 1L); //(클래스 이름, PK)
//수정
findMember.setName("HelloJPA");
//DB에 저장안해도 된다.
//em.persist(findMember);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
em.persist(findMember); 를 안 쓰는 이유
원래는 em.persist 를 해서 DB에 저장을 시켰으나
JPA가 트랜잭션 커밋하는 시점에서 변경된걸 모두 확인 하고 알아서 업데이트 쿼리를 날리기 때문에 쓸 필요가 없다.
다시 말해, EntityManagerFactory 는 DB 당 하나만 생성되고
EntityManager 는 고객의 요청이 올때마다 생성하고 다시 버려야한다 (em.close)
그렇기 때문에 여러 쓰레드간에 공유하면 안된다
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다 (사실 내부적으로 알아서 처리를 함)
'공부' 카테고리의 다른 글
엔티티 매핑 (1) | @Entity, @Table, @Column, @Enumerated.. (0) | 2023.09.22 |
---|---|
JPA (3) 영속성 컨텍스트 | 생명주기(영속,비영속,준영속),이점(1차캐시,더티체킹,동일성) (0) | 2023.09.21 |
JPA (1) | 자바 컬렉션과 JPA의 등장배경, JPA 장점 (0) | 2023.09.08 |
메이븐 프로젝트 설정, JPA 설정 (0) | 2023.07.31 |
클래스 멤버 (0) | 2023.07.20 |