연관관계 매핑
객체 연관관계와 테이블 연관관계의 차이점
- 객체는 참조(주소)값을 기준으로 연관관계를 맺는다.(단방향)
ex) X->Y , Y->X - 테이블은 외래키를 기준으로 연관관계를 맺는다. (JOIN operation , 양방향)
ex) X JOIN Y 는 Y JOIN X 도 가능하다.
단방향 연관관계
- 두 entity 중 어느 한쪽만 다른 한쪽을 참조하는 경우을 단방향이라고 한다.
Jpa를 사용해서 테이블과 매핑할 class를 @Entity를 필수로 붙여야하며, @Entity가 붙은 class를 entity라고 부른다.
@Entity 적용 시 다음과 같은 전제조건을 만족해야한다.
Jpa는 다양한 mapping annotation을 지원하는데 , 크게 4가지로 분류될 수 있다.
객체와 테이블 매핑 : @Entity , @Table
기본 키 매핑 : @Id
Field와 Column 매핑 : @Column
연관관계 매핑 ex) @ManyTone , @JoinColumn
DB id값을 client측에서 넘겨줄 수 있겠지만, 인조키의 경우 DB vendor에서 생성할 수도 있다.
DB vendor 마다 기본키를 생성하는 방식이 다르다, 예를 들면 oracle에서는 sequence 객체를 만들고, mysql에서는 auto_increment기능을 사용한다.
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 |
|
1 |
|
boot에서 자동으로 설정해준 Persistence class(Jpa 설정 정보)를 주입받아, EntityManagerFactory instance를 생성했다.
참고로 Jpa는 기본적으로 데이터 변경시 Transaction을 당연히 필요로 하며, transaction이 없는 경우는 예외를 던진다. (javax.persistence.TransactionRequiredException)
EntityManagerFactory 는 Persistence class로부터 Jpa를 동작시키기 위한 기반 객체를 만들고, Jpa 구현체에 따라서는 DB connection pool도 만든다
객체 생성 비용이 매우 큼으로, application 전체에 딱 한번만 생성하고 공유된다 (singleton)
DB 1개당 하나의 EntityManagerFactory가 생성된다.
multi-thread 상황에서 공유 가능하다
다음으로 EntityManagerFactory에서 EntityManager를 생성하게 되는데,
EntityManager 가 사실상 Jpa 기능의 대부분을 제공한다.
요청시(Thread별로)마다 EntityManagerFactory로부터 EntityManager가 생성된다. (Thread간에 공유하면 race condition 이 생길 수 있다. )
EntityManager는 내부적으로 DB connection을 가지고 DB와 통신하는데, DB 연결이 꼭 필요한 시점까지는 Connection을 가져오지 않는다.
Entity를 영구 저장하는 환경으로, EntityManager가 생성될떄 하나 만들어지고, EntityManager는 이 영속성 컨텍스트에 Entity를 보관하고 관리한다.
Java Persistence API (JPA)는 Java 진영의 ORM (Object relational mapping ) 기술 표준으로서 (API 표준 명세로 , JPA 자체가 구현체는 아니다. ) , JDBC API를 추상화해 application과 JDBC 사이에서 동작한다.
Jpa를 사용하려면 그 구현체를 선택해야하는데, 구현체는 hibernate , EclipseLink , DataNuclues가 존재하며 이중에서 hibernate가 가장 대중적이다.
ORM의 정의
객체와 관계형 데이터베이스의 엔티티를 매핑한다