JPA

2장 JPA 시작

iksadnorth 2023. 8. 27. 17:35

해당 게시물은 책 '자바 ORM 표준 프로그래밍'을 읽고 작성했습니다.

👣 개요

해당 게시물에선 실제로 JPA를 사용하는 방법에 대해 서술한다.

 

👣 엔티티 구조

@Entity @Table(name = "member")
@Getter @Setter @NoArgsConstructor
public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;
}

@Entity
이 어노테이션이 적용된 클래스는 테이블과 매핑할 것이라고 JPA에게 선언함.

@Table
매핑할 테이블에 대한 정보를 알려준다.
만약 name 속성을 설정하지 않는다면 테이블 이름을 클래스 이름으로 매핑한다.

@Id
엔티티 클래스의 기본 키[Primary Key]를 매핑한다.

@Column
필드를 컬럼으로 매핑한다.
마찬가지로 name 속성을 생략한다면 필드명이 칼럼명이 된다.
DB에 따라 대소문자를 구분하는 곳도 있기 때문에 되도록 설정하는 것이 좋다.

 

👣 persistence.xml 설정

JPA에 필요한 설정 정보를 관리하는 곳이 persistence.xml이다.

META-INF/persistence.xml 파일을 사용하면, 별도의 설정 없이 JPA가 인식할 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             version="2.1">
        <!-- 영속성 유닛 -->
        <persistence-unit name="simple-jpa-application">
        
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            
            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
        </properties>
    </persistence-unit>
</persistence>

 

👣 애플리케이션 개발

JPA의 코드는 3가지 부분으로 나눌 수 있다.

1. 엔티티 매니저 설정
2. 트랜잭션 관리
3. 비즈니스 로직

EntityManagerFactory emf = Persistence.createEntityManagerFactory("simple-jpa-application");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();

try {

    tx.begin();
    businessLogic();
    tx.commit();
    
} catch(Exception e) {
    tx.rollback();
} finally {
    em.close();
}

emf.close();

엔티티 매니저 팩토리 
persistence.xml 내용에 근거해 만들어지는 객체

엔티티 매니저
해당 객체를 이용해 쿼리를 주고 데이터를 받는다. 
DB 커넥션과 밀접한 관계에 있기에 스레드 사이에 공유는 금물이다.

 

👣 트랜잭션 관리

데이터는 항상 트랜잭션 내부에서 변경해야 한다.
만약 그렇지 못하다면 예외를 발생시킨다.

try {

    tx.begin(); // 트랜잭션 시작.
    businessLogic();
    tx.commit(); // 커밋
    
} catch(Exception e) {
    tx.rollback(); // 롤백
}

 

👣 비즈니스 로직

Member entity = new Member();
// entity에 데이터를 적재.

// 엔티티 등록
em.persist(entity);

// 엔티티 단일 조회
em.find(Member.class, id);

// 엔티티 복합 쿼리 조회
em.createQuery("SELECT m FROM Member m", Member.class).getResultList();

// 엔티티 수정
entity.setName("iksadSouth");

// 엔티티 삭제
em.remove(entity);

여기서 수정 쿼리의 경우, 별도의 em.update()와 같은 메서드를 사용하는 것이 아닌
JPA가 자동으로 추적해 변경이 감지되면 Update 쿼리를 내보내는 것이다.

또한 복합 쿼리의 경우, 네이티브 SQL을 사용하는 것이 아닌 JPQL을 이용한다.

 

👣 JPQL

JPQL이란, SQL을 추상화해 객체 지향적인 쿼리 언어로 만든 언어체계를 의미한다.
해당 언어는 특정 벤더에 종속적이지 않고 객체 지향적인 쿼리를 작성할 수 있게 한다.

해당 내용은 제 10장에서 자세하게 다룬다.
참고로 JPQL은 대소문자를 구분한다.

'JPA' 카테고리의 다른 글

5장 연관관계 매핑 기초  (0) 2023.08.30
4장 엔티티 매핑  (0) 2023.08.30
3장 영속성 관리  (0) 2023.08.27
1장 JPA 소개  (0) 2023.08.27
'자바 ORM 표준 JPA 프로그래밍' 읽기 전략  (0) 2023.08.24