ORM 과 JPA
🙊

ORM 과 JPA

Created
Apr 12, 2024 06:22 AM
Last edited time
Last updated April 12, 2024
Tags
CS
Spring
Language
URL

Intro::

ORM 과 JPA 에 대해서 알아보자.
 

ORM 이란 ?

데이터베이스를 객체로 매핑해서 효과적으로 사용하게 해주는 기술.
ORM(Object-Relational Mapping)은 "객체-관계 매핑"을 의미합니다. 이는 데이터베이스의 테이블을 프로그래밍 언어에서 사용하는 객체로 매핑해서, 객체 지향 언어로 데이터베이스의 데이터를 쉽게 다룰 수 있게 해주는 기술입니다. 예를 들어, 데이터베이스에 저장된 사용자 정보가 있는 테이블을 Java 프로그램 내에서 'User' 클래스의 객체로 다룰 수 있게 해줍니다. 이렇게 함으로써 개발자는 복잡한 SQL 쿼리 대신에 좀 더 직관적인 코드를 사용할 수 있습니다.

JPA 란??

Java 진영의 ORM 기술 표준
JPA는 자바 애플리케이션에서 관계형 데이터베이스의 데이터를 관리(저장, 조회, 수정, 삭제 등)하는 방식을 정의한 API입니다. JPA를 사용함으로써, 개발자는 데이터베이스에 종속적인 SQL을 직접 작성할 필요 없이, 데이터를 객체로서 다룰 수 있으며, 이는 개발의 생산성과 유지 보수성을 향상시킵니다.
 

JPA의 주요 구성 요소

  1. 엔티티(Entity): 데이터베이스의 테이블을 자바 클래스로 매핑한 것입니다. 이 클래스는 @Entity 어노테이션을 사용하여 엔티티임을 명시합니다. 클래스의 필드는 테이블의 컬럼에 해당하며, 이러한 매핑은 @Column 같은 어노테이션을 통해 설정됩니다.
  1. 엔티티 매니저(Entity Manager): 엔티티 객체의 생명 주기를 관리합니다. 엔티티 매니저를 통해 엔티티 객체를 생성, 조회, 수정, 삭제할 수 있습니다.
  1. 영속성 컨텍스트(Persistence Context): 엔티티의 저장 상태를 관리하는 환경입니다. 영속성 컨텍스트는 엔티티의 상태 변화를 추적하고, 트랜잭션이 완료될 때 변경 사항을 데이터베이스에 반영합니다.

특징

  • 데이터베이스 독립성: JPA를 사용하면, 데이터베이스에 종속되지 않는 코드를 작성할 수 있습니다. 이는 다양한 데이터베이스 기술에 애플리케이션을 쉽게 적용할 수 있도록 해줍니다.
  • 표준화: JPA는 자바 플랫폼의 공식 ORM 기술로, 다양한 ORM 프레임워크에서 공통적으로 사용할 수 있는 표준을 제공합니다. 예를 들어, Hibernate, EclipseLink, OpenJPA 등 여러 JPA 구현체가 있습니다.
  • 캐싱: JPA는 자동 캐싱 기능을 제공하여, 자주 사용되는 데이터를 메모리에 저장해 놓고 빠르게 접근할 수 있도록 돕습니다. 이는 애플리케이션의 성능을 향상시킬 수 있습니다.
  • 트랜잭션 관리: JPA는 선언적 트랜잭션 관리를 지원하여, 코드 내에서 복잡한 트랜잭션 관리 코드를 작성할 필요가 없습니다.

작동 방식

  1. 최초의 쿼리 실행: 데이터베이스에서 엔티티를 최초로 조회할 때, JPA는 해당 데이터를 데이터베이스에서 읽어와서 엔티티 객체로 변환합니다. 이때, 이 엔티티는 영속성 컨텍스트 내에 관리되는데, 이 과정에서 해당 엔티티의 상태가 '영속 상태(persistent state)'가 됩니다. 이 상태의 엔티티는 영속성 컨텍스트에 의해 관리되며, 필요에 따라 캐시에도 저장될 수 있습니다.
  1. 캐싱: 최초 쿼리 이후, 같은 트랜잭션 내에서 동일한 엔티티를 다시 조회하게 되면, JPA는 가능한 경우 캐시(일차 캐시, 즉 영속성 컨텍스트)에서 해당 데이터를 먼저 찾아보고, 캐시에 데이터가 있다면 데이터베이스에 쿼리를 다시 날리지 않고 캐시된 데이터를 반환합니다.
  1. 영속성 컨텍스트의 역할: 영속성 컨텍스트는 엔티티의 상태 변화를 관리하며, 엔티티의 생명 주기 동안 이루어지는 모든 변경을 추적합니다. 트랜잭션이 진행되는 동안 엔티티에 대한 변경 사항이 있을 경우, 이러한 변경들은 데이터베이스에 즉시 반영되지 않고, 트랜잭션이 종료될 때(커밋되는 시점에) 일괄적으로 데이터베이스와 동기화됩니다.
  1. 트랜잭션의 종료와 데이터베이스 동기화: 트랜잭션이 커밋되면, 영속성 컨텍스트에 쌓인 모든 변경 사항들이 데이터베이스에 반영됩니다. 만약 트랜잭션이 롤백되면, 영속성 컨텍스트에 있는 모든 변경 사항들은 무효화되고, 엔티티는 롤백 이전의 상태로 복원됩니다.
 

영속성 컨텍스트란 ?

💡
엔티티를 영구 저장하는 환경입니다. EntityManager를 통해 영속성 컨텍스트에 접근합니다.
트랜잭션이 시작한 후에 객체(Entity)를 생성하게 되면, 해당 객체(Entity)는 "영속성 컨텍스트"에 저장 및 관리가 이루어진다. 이 때 DB에 저장이 되는 상태는 아니며, 쿼리가 날라가지 않는다. 영속성 컨텍스트에 저장이 이루어져 있을 뿐이다.
트랜잭션이 끝나면 영속성 컨텍스트에 저장되어있던 변경사항들이 쿼리로 변환되어 DB에 날라간다.

영속성 컨텍스트의 이점

  • 영속성 컨텍스트 내부에는 1차 캐시가 존재한다.
  • Entity를 영속성 컨텍스트에 저장하면 1차 캐시에 저장이 된다.(key, value)쌍으로 key = PK, value = Entity
  • 1차 캐시로 DB조회가 이루어질 때 Entity가 1차 캐시에 존재한다면 굳이 DB까지 가지 않아도 바로 객체를 찾아올 수 있다.
  • 만약 존재하지 않으면 DB에서 꺼내와 1차 캐시에 저장한다.
  • 그렇게 되면 DB에 쿼리를 직접 날리지 않고도 객체를 찾아올 수 있다.
  • 동일성을 보장한다. 만일 member1을 2번 조회한다 한들, 1차 캐시에서 참조하는 것이기 때문에 같은 주소값을 지닌다.

Dirty Checking

변경 감지라는 것이다. 위에 1차 캐시에 "스냅샷 필드"도 저장되는데 트랜잭션을 commit() or flush()가 일어난다면 "Entity"와 "스냅샷"을 비교하여 변경사항이 있으면 알아서 SQL 쿼리문을 날려준다.
commit()시에는 flush()가 자동 호출된다.
flush()는 DB에게 위에서 저장된 쓰기 지연 SQL저장소에 있는 쿼리문을 날리는 역할이다.
영속성 컨텍스트를 비우는 역할은 하지 않는다.
 

References::

Loading Comments...