JPA, ORM, 영속성

김태훈·2024년 1월 4일
0

Spring

목록 보기
9/16

ORM, Object-Relational Mapping

ORM을 사용하기 전에는 DB의 테이블을 만들고 SQL을 작성하고, JDBC를 사용해서 직접 실행하고, 결과를 객체로 만들어야하는 불편함이 있고, 데이터에 새로운 컬럼을 추가하게 된다면, SQL문을 또 수정해야하는 등 여러 불편함이 많습니다.

ORM은 객체와 DB의 데이터를 자동으로 매핑해주며, SQL쿼리가 아닌, 메서드로 데이터를 조작할 수 있게 해줍니다.
객체간 관계를 바탕으로 SQL을 자동으로 생성해줍니다.

JPA, Java Persistence API

JPA는 Java ORM 기술의 대표적인 표준 명세로, Java에서 제공하는 API입니다.

JPA는 애플리케이션과 JDBC 사이에서 동작되고 있으며, JPA를 사용하면 DB 연결 과정을 직접 개발하지 않아도 자동으로 처리해줍니다.

JPA의 특징

  1. 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성합니다
  2. 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원합니다.
  3. 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있습니다.

영속성, Persistance

영속성을 객체의 관점으로 해석한다면, ‘객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질’을 의미합니다.

영속성 컨텍스트

영속성 컨텍스트는 Entity 객체를 효율적으로 관리하기 위해 만들어진 공간이며, JPA는 영속성 컨텍스트에 Entity 객체들을 저장하여 관리하면서 DB와 소통합니다.

이 영속성 컨텍스트에 접근하여 Entity 객체들을 조작하기 위해서는 EntityManager가 필요하며 개발자들은 이 Entitymanager를 사용해서 Entity를 저장, 조회, 수정, 삭제할 수 있습니다.

JPA의 트랜잭션

트랜잭션?

트랜잭션은 DB 데이터들의 무결성과 정합성을 유지하기 위한 개념입니다.
여러 개의 SQL이 하나의 트랜잭션에 포함될 수 있으며 이 때 모든 SQL이 성공적으로 수행이 되면, DB에 영구적으로 변경을 반영하지만 하나라도 실패하면 모든 변경을 되돌립니다.

JPA에서는 이런 트랜잭션 개념을 사용하여 효율적으로 Entity를 관리하고 있습니다.
이러한 개념을 이용해서 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소에 전부 가지고 있다가 마지막에 SQL을 한 번에 DB에 요청해 변경을 반영합니다.

영속성 컨텍스트의 기능

  1. 1차 캐시
  • 영속성 컨텍스트는 내부적으로 캐시 저장소를 갖고 있으며, 우리가 저장하는 Entity 객체들이 1차 캐시에 저장되고, Map 자료구조 형태로 저장되어 있습니다.
  • key는 @Id로 매핑한 기본 키를 저장하고 value에는 해당 Entity 클래스의 객체를 저장합니다.
  1. 쓰기 지연 저장소 (ActionQueue)
    JPA의 트랜잭션을 설명했던 기능입니다. 영속성 컨텍스트로 관리하고 있는 마지막에 SQL을 DB에 요청해 반영합니다.

  2. 변경 감지 (Dirty Checking)
    만약 영속성 컨텍스트에 저장된 Entity가 변경될 때마다 UpdateSQL이 쓰기 지연 저장소에 저장된다면 마지막에 여러 개의 UpdateSQL을 요청하게 되기 때문에 효율적이지 않습니다.

그래서 JPA에서는 영속성 컨텍스트 내에서 Entity를 저장할 때, 최초상태(LoadedState)를 저장하고 트랜잭션이 commit되고 em.flush()가 호출된다면 현재 상태와 최초 상태를 비교하여 다르다면 updateSQL을 저장하여 commit합니다.

0개의 댓글