쌩로그

Jpa기본 02. JPA 시작하기(인프런 + 자바 ORM 표준 JPA 프로그래밍) 본문

Spring/JPA

Jpa기본 02. JPA 시작하기(인프런 + 자바 ORM 표준 JPA 프로그래밍)

.쌩수. 2023. 8. 21. 00:23
반응형

목록

  1. 포스팅 개요
  2. 본론
      2-1. 라이브러리
      2-2. JPA 매핑 애너테이션
      2-3. persistence.xml
      2-4. EntityManager
      2-5. JPQL
  3. 요약

1. 포스팅 개요

해당 포스팅은 인프런에서 영한님의 JPA기본 강의에서 JPA 시작하기 파트와 해당 파트에 맞는 책의 챕터를 보고 학습한 내용을 요약 및 정리하는 포스팅입니다.

2. 본론

2-1. 라이브러리

hibernate-entitymanager : JPA 표준과 JPA 구현체 중 하나인 하이버네이트를 포함한 라이브러리입니다.

H2도 있지만, 굳이 적진 않았습니다.

2-2. JPA 매핑 애너테이션

@Entity

  • 선언된 클래스를 테이블과 매핑한다고 JPA에게 알려줍니다.
  • 해당 애너테이션이 선언된 클래스를 엔티티 클래스라고 합니다.

@Table

  • 엔티티 클래스에 매핑할 테이블 정보를 알려줍니다.
  • 해당 애너테이션을 생략하면, 클래스 이름을 테이블 이름으로 매핑합니다.
    • 정확히는 엔티티 이름을 사용합니다. 후에 더 자세히 다룹니다.

@Id

  • 엔티티 클래스중 @Id가 선언된 필드테이블의 기본키(primary key)와 매핑합니다.
  • 이 애너테이션이 사용된 필드를 식별자 필드라고 합니다.

@Column

  • 필드를 컬럼에 매핑합니다.

매핑 정보가 없는 필드

  • 매핑 애너테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑합니다.

※ 참고로 JPA의 매핑 애너테이션은 javax.persistence 패키지에 있습니다.

2-3. persistence.xml

데이터베이스 방언

  • JPA는 특정 데이터베이스에 종속적이지 않습니다.
  • SQL 표준(ANSI 표준)을 지키지 않거나, 특정 데이터베이스에서만 사용할 수 있는 고유한 기능을 JPA에서는 방언(Dialect)이라고 하는데, JPA는 약 40개가 넘는 방언을 지원합니다.
  • JPA가 데이터베이스 방언을 지원함에 따라, 개발자는 JPA의 표준에 맞게 JPA를 사용하면 되고, 데이터베이스마다 고유하게 가지고 있는 SQL은 JPA가 알아서 처리해줍니다.
    따라서, 개발자는 애플리케이션 코드를 변경할 필요 없이 JPA에게 어떤 데이터베이스 방언을 사용할지만 알려주면 됩니다.

하이버네이트 전용속성

hibernate.show_sql : 콘솔에 어떤 SQL이 실행되었는지 보여줍니다.
hibernate.format_sql : SQL을 보기 좋게 formatting해서 보여줍니다.
hibernate.use_sql_comments : SQL에 주석을 표시합니다.

2-4. EntityManager

EntityManagerFactory

Persistence 클래스를 이용하여 해당 객체를 생성합니다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistence-unit) // persistence.xml에서 persistence-unit의 설정정보를 읽어서 엔티티 매니저 팩토리를 생성한다. 

createEntityManagerFactory() 메서드 안에 persistence-unit 의 이름을 주면, /META-INF/persistence.xml에서 persistence-unit의 설정 정보를 읽어서 엔티티 매니저 팩토리를 생성합니다.

  • 엔티티 매니저 팩토리를 생성하는 비용은 아주 큽니다.
  • 애플리케이션 전체에 하나만 생성하여 공유해서 사용하도록 해야합니다.

EntityManager

EntityManagerFactory를 생성했다면, EntityManagerFactory를 통해서 EntityManager를 생성해야 합니다.

JPA의 기능 대부분이 EntityManager에서 나옵니다.

EntityManager em = enf.createEntityManager();

em.persist(객체); // 등록
Object findObject = em.find(Object.class, id);  // 조회

findObject.setXXX(""); // 수정
em.remove(object);     // 삭제

이처럼 데이터를 등록, 조회, 수정, 삭제(CRUD)시 EntityManager를 통해서 이루어집니다.

그리고, EntityManager를 통해서 트랜잭션을 생성해야하는데,
JPA의 모든 변경 사항은 트랜잭션 안에서만 이루어져야 합니다.

EntityManager em = enf.createEntityManager();

EntityTrasaction tx = em.getTransaction();

tx. begin(); // 트랜잭션 시작

try {
    em.persist(객체); // 등록
    Object findObject = em.find(Object.class, id);  // 조회

    findObject.setXXX(""); // 수정
    em.remove(object);     // 삭제

    tx.commit();
} catch(Exception c) {
    tx.rollback();         // 예외 발생시 롤백
} finally {
    em.close();            // EntityManager를 닫는다.
}

비느지스 로직을 수행하다가 예외가 발생하면, EntityManager로 얻은 트랜잭션에 롤백을, 예외가 발생하지 않는다면, 커밋을 합니다..

  • EntityManager는 데이터베이스의 커넥션과 밀접한 관계가 있기 때문에, 절대 다른 스레드와 공유하거나, 재사용하면 안 됩니다.

2-5. JPQL

JPA는 SQL을 추상화한 JPQL을 지원합니다.
JPQL은 엔티티 객체를 대상으로 쿼리를 하는 객체지향 쿼리입니다.

SQL과의 차이점SQL은 테이블을 중심으로 쿼리하지만,
JPQL은 엔티티 객체를 중심으로 쿼리합니다.

List result = em.createQuery(JPQL, 반환타입.class).getResultList(); 
// ex JPQL
select m from Member as m 

다음과 같이 JPQL을 사용하면, Member 엔티티 클래스를 중심으로 JPA가 적절한 SQL쿼리를 만들어 날립니다.

3. 요약

세부적으로 JPA에 대해서 알아보기 전에 맛보기로 전체적인 부분을 흩어본 챕터입니다.

다음 장부터 세부적인 내용이 나올 거 같습니다.

이번 챕터에선 간단하게
JPA 매핑 애너테이션 4가지,
persistence 각 설정(생략된 부분도 있습니다),
EntityManagerFactory와 EntityManager,
EntityManagerFactory는 비용이 많이 들기 때문에 애플리케이션 전체에서 하나만 생성해서 공유해야하며,
EntityManger는 데이터베이스 커넥션과 밀접한 관계를 가지므로, 스레드간 공유하거나, 재사용하지 않아야합니다.

그리고 JPQL에 대해서 간단히 알아보았습니다.

다음엔 영속성 관리에 대한 내용으로 찾아오겠습니다!

728x90
Comments