JPA 01 - JPA is


JPA란?

JPA(Java Persistence API)는 ORM(Object-Relational Mapping)기술 표준이다. 이를 통해 객체는 객체대로 개발하고 관계형 데이터베이스(RDBMS)는 관계형 데이트베이스대로 설계한 다음 ORM 프레임워크가 이 둘을 이어주는 역할을 한다.

'jpa'

즉, JPA는 자바 애플리케이션에서 RDBMS와의 상호작용을 쉽게 처리할 수 있도록 도와주는 자바 표준 API이다. JPA를 사용하면 객체 지향 언어인 자바의 객체와 관계형 데이터베이스의 테이블 간의 데이터를 매핑하여 데이터를 쉽게 저장하고 조회할 수 있다.
(대표적인 JPA 오픈소스 라이브러리가 바로 Hibernate이다)

Why JPA??

JPA를 사용하는 이유는 객체와 RDBMS의 개발 패러다임이 달라서 이를 합치기 위함이다. 객체 지향 프로그래밍에서는 데이터를 객체로 표현하고, 객체 간의 관계를 참조를 통해 표현한다. 하지만 RDBMS는 데이터를 테이블로 저장하고, 테이블 간의 관계는 외래 키로 연결하여 사용한다. 이로 인하여 다음과 같은 불일치 문제가 발생한다.

  1. 상속 문제
    자바에서 클래스는 상속을 통해 기능을 확장할 수 있지만, 데이터베이스 테이블은 상속 개념이 없다. 이를 테이블 구조로 변환하는 데 복잡한 처리가 필요하다.
  2. 참조와 외래 키 문제 자바 객체는 다른 객체를 참조할 수 있지만, DB에서는 이러한 참조를 외래 키로 관리한다. 이를 변환하는 작업 또한 많은 처리가 필요하다.
  3. 데이터 타입 차이 객체의 필드는 다양한 데이터 타입을 사용할 수 있지만, 관계형 데이터베이스는 제한된 데이터 타입만을 지원합니다. 이를 변환하는 과정에서도 불일치가 발생할 수 있다.

JPA는 위와 같은 문제를 자동으로 처리해준다. 즉 객체 지향 프로그래밍에 더 몰두할 수 있게 해준다.

How to use JPA?

JPA를 사용하면, 먼저 엔티티(Entity)라는 클래스를 정의하여 데이터베이스 테이블과 매핑한다. 엔티티는 데이터베이스의 각 레코드를 자바 객체로 다룰 수 있게 해준다. 아래 코드는 JPA에서 엔티티 클래스를 정의한 예시이다.

@Entity
public class Member {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    public Member() {}
    
    public Member(String name) {
        this.name = name;
    }
    
    // getter 및 setter
    public Long getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

엔티티 클래스를 정의할 때 @Entity 어노테이션을 통해 정의하고, 그 안에 @Id@GeneratedValue를 사용해 id 필드가 데이터베이스의 기본 키이며 자동으로 생성되도록 설정한다.

이렇게 설정된 엔티티 클래스는 어떻게 활용되는 가에 대해서 아래 코드를 통해 살펴본다.

// persistence.xml 파일에 정의된 persistence-unit의 이름으로 된 설정대로 작업 시작
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpablog");
EntityManager em = emf.createEntityManager();

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

// 데이터 저장
Member member = new Member("John");
em.persist(member);

// 데이터 조회
Member foundMember = em.find(Member.class, member.getId());
System.out.println("Found Member: " + foundMember.getName());

em.getTransaction().commit();
em.close();
emf.close();

나중에 설명할 persistence.xml 파일에서 설정된 값을 이용하여 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하고, 생성된 엔티티 매니저를 통해 본격적으로 엔티티를 관리하고 DB와 상호작용하게 된다.
JPA는 트랜잭션 기반으로 동작하기 때문에 먼저 트랜잭션을 시작한 다음, 엔티티 매니저의 persist()를 통해 데이터를 저장하거나, find()를 통해 데이터를 조회할 수 있다. 그리고 사용 다하면 트랜잭션을 종료한 다음 엔티티 매니저와 엔티티 매니저 팩토리 순으로 닫아 리소스를 반환한다.

Next..

JPA에 대한 기본적인 개념과 사용 이유, 그리고 어떻게 사용되는지 간단하게 살펴보았다. 이제 JPA 사용법에 관한 자세한 이야기를 다음 포스트에 하겠다.