JPA 애플리케이션을 개발하기 위해서는 크게 3부분으로 나누어 개발 할 수 있다.
엔티티 생성 과정은 다음과 같다.
JPA를 시작하려면 persistance.xml의 설정 정보를 사용하여 EntityManagerFactory를 생성해야한다.
EntityManagerFactory emf = Persistance.createEntityManagerFactory("hello");
뒤에 선언한 hello는 persistance.xml에서 설정한 persistance-unit(영속성 유닛)에 선언한 정보로 해당 유닛의 내부의 설정 정보를 읽어서 엔티티 팩토리 매니저를 생성하고 JPA를 동작시키기 위한 기반 객체를 만들고 구현체에 따라서는 데이터베이스 커넥션 풀도 생성한다.
때문에 생성 비용이 많이 크기 때문에 엔티티 팩토리 매니저는 애플리케이션 전체에서 딱 한번만 생성을 하고 공유해서 사용하는 싱클톤 방식을 적용하여 운영하는 것이 바람직하다.
엔티티 메니저 팩토리에서 엔티티 매니저를 생성하는데, JPA의 대부분 기능을 엔티티 메니저가 제공한다.
엔티티 매니저를 사용하여 CURD를 할 수 있다.
엔티티 매니저는 데이터베이스 커넥션을 유지하면서 데이터베이스와 통신한다.
때문에 애플리케이션 개발자는 엔티티 매니저를 가상의 데이터베이스로 생각할 수 있다.
여기서 중요한 점은 엔티티 매니저 팩토리와는 다르게 데이터베이스 커넥션과 밀접한 관계가 있기 때문에 스레드간에 공유를 하면 안 된다.
생성하는 방법은 다음과 같다.
EntityManager em = emf.createEntityManager();
사용이 끝난 엔티티 매니저는 close() 메서드를 사용하여 반드시 종료해야 한다.
엔티티 매니저가 종료되면, 엔티티 매니저 팩토리도 종료해야한다.
em.close();
emf.close();
JPA를 사용할 경우 항상 트랜잭션 안에서 데이터를 변경 해야한다.
트랜잭션 없이 데이터를 변경하면 예외가 발생한다.
엔티티 매니저에서 트랜잭션 관련 API를 선언 해줘야한다.
EntityTransaction tx = em.getTransaction();
try{
tx.begin(); //트랜잭션 시작
logic(); //비즈니스 로직 실행
tx.commit(); //트랜잭션 커밋
}catch(exception e){
tx.rollback(); //예외 발생 시 롤백
}
트랜잭션을 사용하여 비즈니스 로직이 잘 동작하면 트랜잭션을 커밋하고 예외가 발생하면 트랜잭션을 롤백한다.
비즈니스 로직은 관리할 엔티티를 선언 한 후 엔티티 매니저를 통해 데이터베이스에 등록, 수정, 조회, 삭제를 수행한다.
JPA에서의 등록은 persisct를 사용한다.
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUserName("득");
member.setAge(2);
//등록
em.persist(member);
엔티티를 저장하기 위해서 persist() 메서드를 사용하여 저장할 엔티티들 파라메터로 넘겨주면 된다.
JPA에서의 특이점은 수정하는 메서드가 따로 존재하지 않는다.
다면 엔티티가 수정되면 JPA에서 어떤 엔티티가 수정되었는지 추적하는 기능을 갖추고 있어서 값만 변경하더라도 JPA에서 UPDATE를 수정하여 데이터베이스의 값을 변경한다.
member.setAge(24);
엔티티를 삭제하기 위해서는 remove() 라는 메서드를 사용하여 엔티티를 넘겨주면 된다. JPA에서는 DELETE SQL을 생성 후 실행한다.
em.remove(member);
SQL과의 차이점은 엔티티 객체를 대상으로 쿼리하는 것인지, 데이터베이스 테이블을 대상으로 쿼리하는 것인지가 다르다.
사용법은 em.createQuery(JPQL, 반환타입); 메서드를 실행하고 getResultList() 메서드를 호출하면 된다.
List<Member> members =
em.createQuery("select m from Member m", Member.class).getResultList();