본문 바로가기
Java

[Java] JPA 이해하기

by 마진 2024. 12. 20.

JPA란?

JPA는 애플리케이션에서 관계형 데이터베이스를 객체지향적으로 사용할 수 있게 해주는 ORM(Object-Relational Mapping) 기술 표준이다. 

 

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑하여 데이터베이스 작업을 객체지향적으로 처리할 수 있게 해주는 기술이다. 데이터베이스의 테이블을 단순한 데이터 집합이 아닌, 하나의 객체 대상(entity)로 바라보고 다룰 수 있게 한다. 즉, 객체를 직접 저장하고 조회할 수 있게 해준다.

반면 MyBatis나 Spring JdbcTemplate과 같은 SQL Mapper는 단순히 SQL 쿼리를 Java 코드와 연결하는 것에 초점을 맞추고 있어 ORM과는 다른 접근 방식을 보여준다.


JPA의 장점

JPA를 생각했을 때 떠올릴 수 있는 장점은 다음과 같다.

- 지루하고 반복적인 CRUD SQL을 자동으로 해결하여 SQL에 의존적인 개발을 회피할 수 있다.
- 객체 모델링과 관계형 데이터베이스 사이의 차이점을 해결한다.
    
'객체 모델링과 관계형 데이터베이스 사이의 차이점'은 무엇을 의미할까?

객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성 등의 장치를 사용해 시스템의 복잡성을 제어한다. 이와 달리 관계형 데이터베이스는 데이터 중심으로 구조화되어 있고 집합적인 사고를 요구한다. 즉, 객체지향 프로그래밍과 RDBMS는 문제해결을 위해 서로 다른 접근방식을 가진다.
    

 

페러다임의 차이 - OOP vs RDBMS

 

관계형 데이터베이스에서 말하는 ‘집합적인 사고’는 데이터를 개별적인 객체가 아닌 ‘데이터의 집합’으로 다루는 접근 방식을 의미한다. 즉, 관계형 데이터베이스는 **데이터 집합**을 나타낸다.

DB의 SQL을 사용해본 경험이 있으면 해당 특징을 쉽게 이해할 수 있다. DB에서 테이블은 여러 로우(행)들의 집합으로 구성되어 있으며, WHERE절을 사용하면 특정 조건에 맞는 로우들을 부분집합으로 추출할 수 있다 .또한 JOIN을 통해 두 테이블 집합 간의 연산을 수행하고 GROUP BY를 사용하면 특정 조건을 기준으로 로우들을 그룹화된 부분집합들로 나눌 수 있다.

반면에 객체지향 프로그래밍에서는 이와는 완전히 다른 접근 방식을 사용한다. 객체지향에서는 하나의 객체를 중심으로 생각하고, 객체간의 관계를 탐색하며, 각 객체의 속성과 행위를 캡슐화하여 다룬다.

이처럼 데이터를 바라보는 관점 자체가 다르기 때문에 ‘집합적인 사고’와 ‘객체지향적인 사고’ 사이에는 근본적인 차이가 발생하게 되며, 우리는 JPA를 통해 이러한 차이를 해결할 수 있다.  
→ 상속, 객체지향 모델링(연관관계, 객체 그래프 탐색)

 

 

동작원리 - Entity Manager, Persistence Context

엔티티는 테이블과 연결되는 객체 모델을 나타내며 JPA에서 ‘엔티티매니저(Entity Manager)’는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티를 관리하는 모든 일을 처리한다. 쉽게 말해 ‘엔티티’를 위한 가상의 데이터베이스 관리 시스템이라고 볼 수 있다. 데이터베이스 작업을 추상화하여 개발자가 더 객체지향적으로 데이터를 다룰 수 있게 해주기 때문이다.

 


이때, 가상 데이터베이스에 해당하는 것은 무엇일까?

 

‘영속성 컨텍스트(Persistence Context)’가 가상의 데이터베이스라고 할 수 있다. 영속성 컨텍스트는 엔티티를 영구저장하고, 1차 캐시와 변경감지(Dirty Checking) 등의 기능을 제공하며, 트랜잭션 커밋 전까지 데이터베이스 반영을 지연하는 역할을 한다. 즉, 객체를 위한 데이터베이스 역할을 한다고 볼 수 있다. 또한 실제 데이터베이스를 DBMS를 통해 접근하는 것처럼 영속성 컨텍스트는 엔티티 매니저를 통해서만 접근할 수 있다.

 

em.persist(instance);  // 엔티티 매니저가 엔티티 객체를 영속성 컨텍스트에 영구저장한다.



DBMS : DB = 엔티티 매니저 : 영속성 컨텍스트

 

 

영속성 컨텍스트는 ‘엔티티를 영구 저장하는 환경’이라는 뜻이다.
엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

자바 ORM 표준 JPA 프로그래밍, 92p 中

 

 

 

 

영속성 컨텍스트의 특징과 장점

지금까지 이야기한 영속성 컨텍스트의 특징과 장점은 다음과 같다.

 

특징
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다.
    → 영속 상태는 식별자 값이 반드시 있어야 한다. 

- 영속성 컨텍스트에 저장된 엔티티를 데이터베이스에 반영하는 작업을 flush라고 한다.
    → JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트의 내용을 반영하는 flush 작업을 수행한다.
    
* 식별자 값: @Id 어노테이션으로 테이블의 기본키와 연결되는 값

장점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지원 로딩

 


영속성 컨텍스트의 1차 캐시란?

영속성 컨텍스트는 내부에 캐시를 가지고 있으며 이것을 1차 캐시라 하며 영속 상태의 엔티티는 모두 이곳에 저장된다.



1차 캐시가 영속성 컨텍스트의 장점인 이유는 무엇일까? 여러 이유가 있지만 em.find(식별자 키)를 호출하면 우선 1차 캐시에서 ‘식별자 값’으로 엔티티를 찾는다는 점이다. 만약 찾는 엔티티가 존재한다면 데이터베이스를 조회하지 않고 메모리에 있는 1차 캐시에서 엔티티를 조회할 수 있다.

만약 엔티티가 1차 캐시에 없으면 엔티티 매니저는 데이터베이스를 조회해서 엔티티를 생성한다. 그리고 1차 캐시에 저장한 후 영속 상태의 엔티티를 반환한다.

 

 

 

 

 

References

[도서] 자바 ORM 표준 JPA 프로그래밍 - 김영한