연관관계 매핑

객체 연관관계와 테이블 연관관계의 차이점

  • 객체는 참조(주소)값을 기준으로 연관관계를 맺는다.(단방향)
    ex) X->Y , Y->X
  • 테이블은 외래키를 기준으로 연관관계를 맺는다. (JOIN operation , 양방향)
    ex) X JOIN Y 는 Y JOIN X 도 가능하다.

단방향 연관관계

  • 두 entity 중 어느 한쪽만 다른 한쪽을 참조하는 경우을 단방향이라고 한다.
Read more

Entity 기본 키 매핑 전략 - SEQUENCE/TABLE/IDENTITY

Entity - DB table mapping

Jpa를 사용해서 테이블과 매핑할 class를 @Entity를 필수로 붙여야하며, @Entity가 붙은 class를 entity라고 부른다.

@Entity 적용 시 다음과 같은 전제조건을 만족해야한다.

  1. 기본생성자
  2. final class , enum , interface , inner class가 아니여야 한다.
  3. 저장할 필드에 final 키워드가 붙으면 안된다.

Jpa는 다양한 mapping annotation을 지원하는데 , 크게 4가지로 분류될 수 있다.

  1. 객체와 테이블 매핑 : @Entity , @Table

  2. 기본 키 매핑 : @Id

  3. Field와 Column 매핑 : @Column

  4. 연관관계 매핑 ex) @ManyTone , @JoinColumn

기본키 매핑 전략

DB id값을 client측에서 넘겨줄 수 있겠지만, 인조키의 경우 DB vendor에서 생성할 수도 있다.
DB vendor 마다 기본키를 생성하는 방식이 다르다, 예를 들면 oracle에서는 sequence 객체를 만들고, mysql에서는 auto_increment기능을 사용한다.

Read more

EntityManagerFactory ,EntityManager, Persistent Context 주요 개념

Jpa 의 EntityManagerFactory ,EntityManager, Persistent Context 주요 개념을 알아보기전에 spring boot에서 Jpa 환경을 setting 해주었다.

spring boot에서는 /meta-inf/persistence.xml JPA 설정파일을 인식하지 않고, 기본으로 설정해준다.

spring이 아닌 환경에서는 /META-INF/persistence.xml 파일을 설정해주어야 한다.

boot에서는 다음과 같이 EntityManagerFactory 와 EntityManager 를 주입받을 수 있다.

1
2
3
4
5
@PersistenceContext
EntityManager em;

@PersistenceUnit
EntityManagerFactory emf;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@SpringBootTest
class JpaApplicationTests {

@PersistenceUnit
EntityManagerFactory emf;

@Test
void basicJpa() {

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

try{
transaction.begin(); // transaction 시작
// 비즈니스 로직
transaction.commit();
}catch (Exception e){
transaction.rollback();
}
finally {
em.close();
}
emf.close();
}
}

boot에서 자동으로 설정해준 Persistence class(Jpa 설정 정보)를 주입받아, EntityManagerFactory instance를 생성했다.

참고로 Jpa는 기본적으로 데이터 변경시 Transaction을 당연히 필요로 하며, transaction이 없는 경우는 예외를 던진다. (javax.persistence.TransactionRequiredException)

EntityManagerFactory

  • EntityManagerFactory 는 Persistence class로부터 Jpa를 동작시키기 위한 기반 객체를 만들고, Jpa 구현체에 따라서는 DB connection pool도 만든다

  • 객체 생성 비용이 매우 큼으로, application 전체에 딱 한번만 생성하고 공유된다 (singleton)

  • DB 1개당 하나의 EntityManagerFactory가 생성된다.

  • multi-thread 상황에서 공유 가능하다

EntityManager

다음으로 EntityManagerFactory에서 EntityManager를 생성하게 되는데,

EntityManager 가 사실상 Jpa 기능의 대부분을 제공한다.

  • 요청시(Thread별로)마다 EntityManagerFactory로부터 EntityManager가 생성된다. (Thread간에 공유하면 race condition 이 생길 수 있다. )

  • EntityManager는 내부적으로 DB connection을 가지고 DB와 통신하는데, DB 연결이 꼭 필요한 시점까지는 Connection을 가져오지 않는다.

Persistence Context (영속성 컨텍스트)

Entity를 영구 저장하는 환경으로, EntityManager가 생성될떄 하나 만들어지고, EntityManager는 이 영속성 컨텍스트에 Entity를 보관하고 관리한다.
Read more

Jpa

Jpa 란?

  • Java Persistence API (JPA)는 Java 진영의 ORM (Object relational mapping ) 기술 표준으로서 (API 표준 명세로 , JPA 자체가 구현체는 아니다. ) , JDBC API를 추상화해 application과 JDBC 사이에서 동작한다.

  • Jpa를 사용하려면 그 구현체를 선택해야하는데, 구현체는 hibernate , EclipseLink , DataNuclues가 존재하며 이중에서 hibernate가 가장 대중적이다.

  • ORM의 정의

    객체와 관계형 데이터베이스의 엔티티를 매핑한다
Read more