JPA란?

HwangJerry·2023년 4월 8일
0
이 내용은 김영한 - 자바 ORM 표준 JPA 프로그래밍 인프런 강의를 정리한 내용입니다.

JPA 시작하기

JPA는 자바 객체와 관계형 데이터베이스를 연결하는 기술입니다. 개발자는 데이터베이스와의 상호작용을 추상화된 객체 모델로 다룰 수 있습니다. 이를 통해 개발자는 데이터베이스 구조와 SQL 쿼리를 몰라도, 객체를 다루듯이 데이터베이스를 조작할 수 있게 됩니다.

JPA는 무엇인가


JPA(Java Persistence API)는 자바 애플리케이션에서 관계형 데이터베이스와 상호작용하기 위한 API입니다. 이는 ORM(Object-Relational Mapping) 기술을 기반으로 정의된 인터페이스이고, 이를 구현한 가장 대표적인 프레임워크로 하이버네이트(Hibernate)가 있습니다. 개발자는 하이버네이트를 활용하면 직접 SQL 쿼리를 작성하지 않으면서 객체와 관계형 데이터베이스 간의 매핑을 처리할 수 있어 비로소 객체지향적인 코드를 작성할 수 있게 됩니다.

JPA 동작 원리


JPA는 내부적으로 JDBC API를 사용하여 데이터베이스와의 통신을 처리합니다. JDBC API는 Java에서 데이터베이스와 연결하고 쿼리를 실행할 수 있는 표준 인터페이스로, JPA는 애플리케이션과 JDBC 사이에서 동작한다고 이해할 수 있습니다.

JPA 동작 과정을 통해 위 사항을 더욱 자세히 이해해봅시다.
1. Entity 매핑
JPA는 개발자가 어노테이션을 사용하여 정의한 엔티티 클래스와 데이터베이스의 테이블 간의 매핑 정보를 기반으로 객체와 데이터베이스 간의 매핑을 수행합니다.

  1. EntityManagerFactory 생성
    EntityManagerFactory는 JPA에서 커넥션 풀을 생성하고 관리하여 데이터베이스 연결을 관리하는 객체로, 하이버네이트 등의 Persistence Provider를 생성할 때 한 번만 생성되어 애플리케이션 전체에서 공유됩니다.

  2. EntityManager 생성
    EntityManager는 애플리케이션에서 데이터베이스와 상호작용하는 주요 객체로서, EntityManagerFactory를 통해 EntityManager를 생성합니다. EntityManager는 JDBC API를 사용하여 데이터베이스와 상호작용함으로써 엔티티를 관리하고 조작합니다. 주의할 것은, EntityManager는 쓰레드 간 공유를 해선 안되고, 사용할 때 생성한 뒤 작업이 끝나면 버려야 합니다.

  3. 트랜잭션 관리
    트랜잭션은 데이터베이스의 상태를 변화시키는 작업을 하나의 논리적인 단위로 묶어서 처리하는 것을 말합니다. JPA에서는 모든 데이터베이스 작업이 트랜잭션 안에서 수행되어야 하며, 개발자는 EntityManager를 사용하여 트랜잭션을 시작하고 종료할 수 있습니다.

    트랜잭션 단위로 작업을 수행하면 단위 내 모든 작업은 모두 성공 또는 모두 실패로 귀결되기 때문에, 데이터 변경 작업 시에 모두 정상 반영 또는 모두 롤백 등으로 데이터 일관성을 유지할 수 있습니다. 또한 단위별 작업으로 인해 여러 작업자가 데이터를 건드릴 때 발생할 수 있는 동시성 문제를 막을 수 있고 데이터베이스 엑세스 횟수를 최소화하여 성능 저하를 방지할 수 있습니다.

  4. 엔티티 조작
    EntityManager를 사용하여 해당 객체와 관련된 SQL 쿼리를 생성한 뒤 JDBC API를 사용하여 해당 쿼리를 실행하여 데이터베이스 내의 엔티티를 조작할 수 있습니다.

  5. 영속성 컨텍스트 관리
    영속성 컨텍스트는 JPA의 핵심 기능 중 하나로, EntityManager 내부에 존재하여 엔티티의 생명 주기를 관리하는 컨테이너입니다. 이를 EntityManager는 영속성 컨텍스트를 통해 엔티티를 관리하고 데이터베이스와의 상호작용을 처리합니다. 엔티티를 조작하고자 하면 우선 영속성 컨텍스트를 1차 캐시로서 사용하여 데이터를 관리하고, 데이터 조작은 트랜잭션 단위로 데이터베이스와 상호작용하여 처리합니다.

JPA는 위와 같이 동작하는 과정에서 EntityManager를 사용하여 간접적으로 JDBC API를 사용해 데이터베이스와 통신합니다.

JPA를 사용하는 이유


개발자는 JPA를 사용하여 SQL 중심적인 개발에서 벗어나 객체 중심적인 개발을 수행할 수 있습니다. 이를 통해 얻을 수 있는 장점은 다음과 같습니다.

패러다임의 불일치 해결

JPA를 사용하면 객체 지향 프로그래밍에서 사용되는 객체 모델과 관계형 데이터베이스에서 사용되는 데이터 모델 간의 패러다임 불일치를 해결할 수 있습니다.

객체 모델과 데이터 모델은 서로 다른 모델링 기법을 사용합니다. 객체 모델은 클래스, 상속, 다형성 등을 사용하여 데이터의 복잡한 구조를 표현하고, 데이터 모델은 열과 행으로 이루어진 테이블과 PK, FK 등을 이용하여 데이터의 구조와 관계를 저장합니다. 이러한 차이로 인해 각 모델 간 매핑 작업이 필요한데, JPA를 이용하면 개발자가 이를 직접 처리할 필요 없이, 모델 간 매핑 작업을 위한 SQL 쿼리 작성 등의 작업을 처리해줍니다.

생산성과 유지보수성 향상

JPA는 객체와 데이터베이스 간의 매핑을 처리하는 기능을 제공하므로, 개발자는 객체 지향적인 비즈니스 로직에 더욱 집중할 수 있게 됩니다. 또한 JPA는 데이터베이스 스키마 변경 사항을 감지하여 SQL을 수정 작성하여 엔티티 클래스에 반영할 수 있으므로, 개발자가 데이터베이스 스키마 변경에 쉽게 대처할 수 있게 됩니다.

JPA와 하이버네이트 등의 구현체들은 다양한 데이터베이스의 방언을 구사할 수 있도록 되어 있으므로, 개발자는 이를 사용함으로써 벤더별로 다른 SQL 문법을 학습할 필요가 없으며 SQL 쿼리를 항상 직접 작성해야 하는 번거로운 작업을 최소화할 수 있습니다. 따라서 JPA를 사용하면 벤더 독립적인 코드를 작성할 수 있게 됩니다.

성능 최적화

JPA는 영속성 컨텍스트 내에서 엔티티를 캐싱하고, 같은 엔티티에 대한 여러 요청이 들어올 때 캐시된 데이터를 반환홤으로써 데이터베이스 조회를 최소화할 수 있습니다. 또한 2차 캐시를 설정하여 영속성 컨텍스트의 범위를 넘어서도 엔티티를 캐싱할 수 있습니다.

또한 지연 로딩을 활용하여 연관된 엔티티가 실제로 사용될때만 로딩되도록 설정하여 불필요한 데이터 로딩을 방지할 수 있습니다.

데이터의 볼륨이 클 경우에는, JDBC Batch SQL 기능을 사용하여 트랜잭션이 커밋될 때 까지 Statement 또는 PreparedStatement 객체에 쿼리문을 모았다가 데이터를 일괄 처리해 성능을 향상시킬 수 있습니다.

EntityManager em = emf.createEntityManager();
EntityTrasaction transaction = em.getTransaction();
// 엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin();

// JDBC API batch SQL...여기까지는 INSERT SQL을 DB에 보내지 않음
em. persist(memberA);
em.persist(memberB);

// 커밋을 하는 순간에 마침내 DB에 Insert SQL을 보낸다.
transaction.commit();
profile
알고리즘 풀이 아카이브

0개의 댓글