간단한 애플리케이션을 작성하여 기본적인 JPA CRUD를 수행해본다.
public static void main(String[] args) { // EntityManagerFactory 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); // EntityManager 생성 EntityManager em = emf.createEntityManager(); // 트랜잭션 취득 EntityTransaction tx = em.getTransaction(); try { // 트랜잭션 시작 tx.begin(); logic(em); // 커밋 tx.commit(); } catch (Exception e) { e.printStackTrace(); // 오류 발생 시 롤백 tx.rollback(); } finally { // 로직 수행 후 EntityManager 종료 em.close(); } // 애플리케이션 종료 시 EntityManagerFactory 종료 emf.close(); }
public static void logic(EmtityManager em) { String id = "test"; Member member = new Member(); member.setMemberId(id); member.setMemberName("사용자"); member.setAge(20); // 등록 (C) em.persist(member); // 단 건 조회 (R) Member findMember = em.find(Member.class, id); System.out.println("findMember=" + findMember.getMemberName() + ", age=" + findMember.getAge()); // 목록 조회 (R) Listmembers = em.createQuery("select m from Member m", Member.class).getResultList(); System.out.println("member size=" + members.size()); // 수정 (U) member.setAge(25); // 삭제 (D) em.remove(member); }
위 코드에서 핵심은 크게 3가지로 볼 수 있다.
1. 엔티티 매니저 설정
2. 트랜잭션 관리
3. 비즈니스 로직
1. 앤티티 매니저 설정
1) EntityManagerFactory 생성 및 관리
JPA를 사용하기 위해서는 우선 persistance.xml을 통해 설정을 진행한 후 EntityManagerFactory를 생성해야한다.
JPA는 클래스패스의 META/INF/persistance.xml파일을 설정파일로 자동인식한다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistance.xml에 설정된 persistence-unit 명);
위 코드 한 줄로 손쉽게 EntityManagerFactory를 생성할 수 있다.
EntityManagerFactory가 생성될 때 JPA 동작을 위한 기반 객체를 생성하고, JPA 구현체에 따라 DB 커넥션 풀 생성 등 비용이 크다.
때문에 EntityManagerFactory는 애플리케이션 전체적으로 1번만 생성되고 공유되어야한다.
또한 애플리케이션 자체가 종료될 시 close 해줘야한다.
2) EntityManager 생성 및 관리
EntityManager em = emf.createEntityManager();
EntityManagerFactory를 통해 EntityManager를 생성한다.
JPA에서는 이 EmtityManager를 통해 DB에 등록/수정/삭제/조회하는 작업이 이루어진다.
내부에서 DB 커넥션을 유지하고 있기 때문에 Thread간 공유하거나 재사용하면 안되며
한 비즈니스 로직에 이용된 후 반드시 close 해줘야한다.
2. 트랜잭션 설정
JPA에서 등록, 수정, 삭제는 반드시 트랜잭션 내에서 이루어져야한다.
EntityManager를 통해 트랜잭션을 취득할 수 있다.
3. 비즈니스 로직
개발자는 EntityManager를 가상의 데이터베이스로 취급하며 EntityManager에 CRUD를 행할수있다.
1) 등록
em.persist(entity);
JPA는 전달된 entity의 타입(class)를 분석하여 테이블과 매핑정보를 얻은 후
적절한 INSERT문을 생성 및 수행한다.
2) 수정
수정의 경우 좀 특이하다.
JPA는 엔티티의 변경을 추적하는 기능이 있다.
위 소스에서 처럼 Entity객체의 setter를 통해 값을 변경하면 JPA가 이를 감지해 UPDATE문을 수행한다.
em.update 와 같은 update메소드가 따로 없다.
3) 삭제
em.remove(entity);
EntityManager에 삭제할 Entity객체를 넘겨줌으로써 엔티티를 삭제할 수 있다.
4) 조회
- 단 건 조회
em.find(Entity타입(class), ID);
EmtityManager의 find메소드를 통해 단 건 조회가 가능하다.
- 목록 조회
TypedQuery<Entity타입> query = em.createQuery("JPQL", Entity타입(class);
query.getResultList();
JPA에서 목록 검색을 한다면 DB가 아닌 Entity를 대상으로 수행해야한다.
하지만 DB의 모든 데이터를 읽어와 Entity로 변경한 후 검색을 한다는건 사실상 불가능하다.
JPA는 JPQL(Java Persistence Query Language)라는 쿼리언어로 이 문제를 해결한다.
JPQL은 일반 SQL과 거의 비슷한 문법으로 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 사용할 수 있다.
JPQL이 Entity 객체를 대상으로 쿼리한다. 즉 클래스 및 클래스의 필드를 대상으로 쿼리한다.
SQL은 데이터베이스 테이블을 대상으로 쿼리한다.
얼핏보면 JPQL이 일반 데이터베이스에 쿼리하는 것으로 보일수 있으나 JPQL은 데이터베이스 테이블을 전혀 알지 못한다.
위 소스에서 "select m from Member m" 이라는 JPQL이 사용됐는데 from Member의 Member는 MEMBER테이블이 아닌 Member 클래스를 의미한다.
개발자가 작성한 JPQL을 JPA가 적절한 SQL로 변환하여 수행한다.
'Back-End > JPA' 카테고리의 다른 글
영속성 컨텍스트 (Persistence Context) 란 (1) (0) | 2018.11.25 |
---|---|
EntityManagerFactory와 EntityManager (0) | 2018.11.23 |
기본적인 JPA 설정 방법 (0) | 2018.10.03 |
JPA / ORM 이란 (0) | 2018.10.03 |
객체 모델과 관계형 데이터베이스 모델 차이 (0) | 2018.10.03 |