JPA 기본적인 CRUD 해보기

간단한 애플리케이션을 작성하여 기본적인 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)
    List<member> members = 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로 변환하여 수행한다.


자바 ORM 표준 JPA 프로그래밍을 공부하며 정리한 내용입니다.


deveely
Written by@deveely
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호

GitHubTistory