02. JPA 시작

zwundzwzig·2023년 2월 3일
0
post-thumbnail

구현체

이 책은 hibernate로 JPA를 구현했다. 나는 properties 파일 기준으로 spring.jpa.hibernate.ddl-auto 옵션을 사용해 애플리케이션 구동 시 JPA의 데이터베이스 초기화 전략을 설정함으로써 hibernate를 사용한 경험이 있다.

참고로 구현체는 인터페이스인 JPA를 직접 구현한 라이브러리이다. JPA와 Hibernate는 마치 자바의 interface와 이를 구현한 class와 같은 관계라는 글의 도움받았다.

객체 매핑

import javax.persistence.*;

@Entity
@Table(name = "MEMBER")
public class Member {
    @Id
    @Column(name="ID")
    private String id;
    
    @Column(name = "NAME")
    private String name;
    
    // 매핑 정보가 없는 필드
    private Integer age;
}

각각의 매핑 어노테이션을 살펴보면

@Entity : 해당 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 이를 엔티티 클래스라 한다.
@Table : 엔티티 클래스에 매핑할 테이블 정보를 알려준다. 만약 생략하면 엔티티 이름을 테이블 이름으로 매핑한다.
@Id : 식별자 필드라 부르며 엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다.
@Column : 필드를 컬럼에 매핑한다.
매핑 정보가 없는 필드 : 멤버에 어노테이션이 생략되면 컬럼명으로 매핑한다.

애플리케이션 개발

import javax.persistence.*;
import java.util.List;

public class JpaMain {
	public static void main(String[] args) {
    	// 엔티티 매니저 팩토리 - 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
        
        // 엔티티 매니저 - 생성
        EntityManager em = emf.createEntityManager();
        
        //트랜젝션 - 획득
        EntityTransaction tx = em.getTransaction();
        
        try {
        	tx.begin(); // 트랜젝션 - 시작
            logic(em); // 비즈니스 로직 실행
            tx.commit(); // 트랜젝션 - 커밋
        }
        catch (Exception e) {
        	tx.rollback(); // 트랜젝션 - 롤백
        }
        finally {
        	em.close(); // 엔티티 매니저 - 종료
        }
        emf.close(); // 엔티티 매니저 팩토리 - 종료
        

애플리케이션 개발 시작 코드는 크게 세 가지로 나뉜다.

엔티티 매니저 팩토리

엔티티 매니저의 생성 과정을 분석해보자

JPA를 시작하려면 우선 persistence.xml이나 build.gradle의 설정 정보를 사용해 엔티티 매니저 팩토리를 생성해야 하는데, 이때 엔티티 매니저 팩토리를 생성해 JPA를 사용케 하는 Persistence 클래스를 사용한다.

이러면 META-INF/persistence.xml에서 설정한 이름의 영속성 유닛을 찾아 팩토리를 생성한다.

이 비용은 매우 크기 때문에, 팩토리는 애플리케이션 전체에서 한번만 생성하고 공유해 사용하자.

엔티티 매니저

이 엔티티 매니저로 CRUD가 가능하다.

엔티티 매니저는 내부에 DB 소스를 유지하며 통신한다.

이렇듯 DB 커넥션과 밀접한 관계가 있으므로 스레드 간 공유하거나 재사용해선 안된다.

종료

jdbc처럼 close 메소드를 사용해서 끄면 된다.

트랜젝션 관리

예외 발생 시 롤백한다.

비즈니스 로직

C: persist 메소드 인자에 엔티티를 넘겨준다.
R : 한 건을 조회할 땐 find 메소드를 사용한다.
U : 단순히 엔티티 내 수정하고픈 멤버만 set으로 변경하면 된다.
D : remove 메소드 사용한다.

Java Persistence Query Language

하나 이상의 엔티티 값을 조회할 때 사용된다.

JPQL은 SQL과 비슷하지만

  • SQL은 데이터베이스 테이블을 대상으로 쿼리하는 반면
  • JPQL은 엔티티 객체를 대상으로 쿼리하며 DB 테이블을 전혀 알지 못한다.

간단하게 JPA 키워드를 알아봤다. 이제 3강부터 본격적인 개념공부에 들어간다.

🧷 참조 교재

  • 김영한, 『자바 ORM 표준 JPA 프로그래밍』 에이콘(2015)
profile
개발이란?

0개의 댓글