[번역글] JPA(Java Persistence API) 아키텍처에 대한 소개/개요/설명
- 흑구의 공부내용 공유
- 2020. 7. 11. 12:50
JPA 아키텍처에 대한 소개
이번 포스팅에서는 JAVA Persistence API의 핵심 클래스/인터페이스인 JPA의 구조에 대해서 알아보겠습니다. Java Persistence API(JPA)는 관계형 데이터베이스(RDBMS)객체를 자바 객체로 매핑하는 자바 표준 스펙입니다. 자바 객체를 데이터베이스 테이블로 변환하는 작업, 혹은 반대의 작업을 객체-관계 매핑(Object-Relational Mapping, ORM)이라고 합니다. JPA는 ORM에 대한 한가지 접근 방법중에서 하나입니다. JPA를 통해서 개발자들은 자바 객체 데이터를 데이터베이스 데이터로 매핑, 저장, 수정, 검색할 수 있습니다. JPA는 엔터프라이즈급 혹은 SE 버전에서도 사용할 수있습니다. JPA는 여러가지 구현체를 가지고 있는데 그중에서 가장 유명한 것들은 Hiberante, EclipseLink, Apache OpenJPA 같은 것들이 있습니다. 대부분 Hibernate를 사용할 것 같습니다.
JPA 아키텍처
JPA는 관계형 엔티티로써 source-to-store 비즈니스 엔티티입니다. JPA로 일반 자바 객체를 엔티리로 정의하는 방법을 보여드리고 어떻게 관계로써 관리하는지를 보여드릴 것입니다.
클래스 수준 아키텍처
아래의 이미지는 JPA의 클래스 레벨 아키텍처입니다. 여러가지 코어적인 JPA의 클래스와 인터페이스들을 볼 수 있습니다.
위의 아키텍처 사진에 대해서 설명해보겠습니다.
1. EntityManagerFactory - EntityManager 클래스의 팩토리 클래스입니다. 이 클래스로 EntityManager 클래스의 인스턴스를 생성하고 관리할 수 있습니다. 2. EntityManager - 인터페이스입니다. 객체에 대한 영속성 관리작업을 합니다. Query 인스턴스를 생성하는 팩토리처럼 작동합니다. 3. Entity - 영속객체입니다. 이 객체의 스펙에 의해서 데이터베이스에 기록될 객체입니다. 4. EntityTransaction - EntityManager와 일대일 관계입니다. 각각의 EntityManager들의 작업은 EntityTransaction 클래스에 의해서 유지됩니다. 5. Persistence - 이 클래스는 EntityManagerFactory 인스턴스를 생성하는 정적(static) 메소드를 가지고 있습니다.ㅏ 6. Query - 인터페이스로서 각각의 JPA 벤더에 의해 구현되며 각 기준에 충족하는 관계형 객체를 얻습니다. |
위의 클래스와 인터페이스들은 엔티티를 데이터베이스에 저장하는데 사용됩니다. 이것들은 프로그래머가 데이터베이스에 데이터를 저장하는 코드를 작성하는 것을 줄여주어 좀더 중요한 활동(예컨데, 객체매핑하는 부분)에 집중할 수 있게 해줍니다.
JPA 클래스 관계
위의 아키텍처에서 클래스와 인터페이스들의 관계는 javax.persistece 패키지에 속해 있습니다. 아래의 다이어그램은 그들의 관계를 나타내줍니다.
EntityManagerFactory와 EntityManager의 관계는 일대다 관계입니다. EntityManagerFactory 클래스는 EntityManager 클래스의 인스턴스를 생성하는 팩토리 클래스입니다.
EntityManager와 EntityTransaction 의 관계는 일대일 관계입니다. 각각의 EntityManager의 작업에서 EntityTransaction 인스턴스가 작동합니다.
EntityManager와 Query(sql이 아님, JPA 인터페이스)의 관계는 일대다 관계입니다. 한 EntityManager를 통해 여러가지 Query 객체를 통해 sql이 실행될 수 있습니다.
EntityManager와 Entity의 관계는 일대다 관계입니다. 한 EntityManager 인스턴스는 여러 Entity를 관리할 수 있습니다.
간단 JPA 예제
한번 javax.persistence 패키지의 클래스와 인터페이스를 이용해서 예제를 만들어보겠습니다.
JPA Entity(엔티티 클래스 정의)
@Entity, @Id, @GeneratedValue, @Column 과 같은 어노테이션들을 사용해서 자바 객체와 데이터베이스의 테이블 객체를 매핑해보겠습니다.
@Getter @ToString @NoArgsConstructor @AllArgsConstructor //lombok
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
}
EntityManager와 EntityManagerFactory, EntityTransaction 사용하기
위의 클래스 수준 아키텍처에서 응용하여 사용해보겠습니다.
아래의 예제코드는 persist() 라는 메소드를 사용하여 Student 객체를 데이터베이스에 저장하는 코드입니다.
package net.javaguides.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import net.javaguides.hibernate.entity.Student;
public class App {
public static void main(String[] args) {
//EntityManagerFactory -> EntityManager, EntityTransaction
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PERSISTENCE");
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
//EntityTansaction transaction start
entityTransaction.begin();
//Entity Persist
Student student = new Student("Ramesh", "Fadatare", "rameshfadatare@javaguides.com");
entityManager.persist(student);
//EntityTansaction transaction end (commit)
entityTransaction.commit();
entityManager.close();
entityManagerFactory.close();
}
}
이상으로 간단히 JPA에 대해서 알아보는 시간을 가졌습니다. 사실 JPA는 이러한 core한 객체들을 이용하는 방법보다는 사실 Spring Framework를 이용하는 Spring Data JPA 쪽에서 작업하는 부분이 현업에서는 좀 더 많을 수도 있습니다. 하지만 JPA를 학습하는데 있어서 이러한 코어 클래스, 인터페이스에 대한 지식이 없이 들어가는 것은 오히려 mybatis 같은 라이브러리를 사용하는 것만 못할것입니다. 따라서 앞으로도 이러한 개념적인 부분이 담긴 원서를 번역하는 글을 공유해보겠습니다.
감사합니다.
'흑구의 공부내용 공유' 카테고리의 다른 글
스프링 부트 실행 시, Database sql 스크립트 실행하는 방법(더미데이터), 테이블 데이터 초기화 (1) | 2020.08.12 |
---|---|
[Java] 직렬화(Serialization)와 역직렬화(Deserialization), Serializable 인터페이스 (0) | 2020.07.20 |
[IntelliJ] SonarLint 코드분석 플러그인 소개(코드리뷰, 코딩 rule, 코딩스타일) (5) | 2020.06.25 |
[HttpStatus] Forbidden 과 UnAuthorized의 차이점. (2) | 2020.06.22 |
[Spring] 어노테이션을 통한 AOP 설정시 주의할 점!(feat. proxy, 내부 메소드 call) (0) | 2020.06.06 |