이 험난한 세상에서어어~

JPA란? 본문

이론/JPA, Spring, Spring boot

JPA란?

토끼띠NJW 2023. 7. 9. 10:54

JPA란 무엇일까

JPA는 java persistence api의 축약 단어로 간단하게 말하자면 JAVA 표준 ORM이다.

 

사실 JPA를 이렇게만 설명하면 완벽하게 와닫지 않을 것이다. 그렇기에 차근차근 위에 나온 개념들을 살펴 보면서 JPA에 대해 이해해보도록 하자.

 

ORM(객체 관계 매핑)

객체 관계 매핑은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법이다.
- 위키백과, 객체 관계 매핑

Java는 대표적인 객체 지향 프로그래밍 언어이지만, 우리가 일반적으로 사용하는 데이터베이스는 관계지향적이다. 그러므로 java의 클래스와 db의 테이블을 서로 연결하기 위해서 ORM을 이용하는 것이다. 이러한 ORM 중 java의 표준이 JPA이다. 

 

하이버네이트(Hibernate)

그렇다면 위의 설명에서 JPA가 java의 표준 ORM이라고 했으니 JPA가 DB와 연결되어 객체 지향 프로그램과 연결되도록 동작하는 것일까?

 

아니, JPA는 그저 인터페이스일 뿐이다. 때문에 기본적인 틀만 제공해준다. 그렇다면 어떻게 JPA를 이용해서 객체 지향 프로그램과 DB를 연결할 수 있을까?

 

바로 여기서 하이버네이트를 이용한다. JPA는 그저 인테페이스이기 때문에 그저 뼈대만 제공을 하고 이를 구현하는 것은 하이버네이트라는 의미이다. 참고로 말하자면 JPA의 구현체에는 하이버네이트 뿐만 아니라 EclipseLink나 DataNucleus  등이 있어 원한다면 다른 것을 선택해서 이용해도 된다.

 

JDBC(Java Database Connectivity)

지금까지 한 설명을 정리하자면, JPA는 java의 표준 ORM으로 객체 지향 프로그램과 관계지향 DB의 소통을 가능하게 해준다. 그러나 JPA는 인터페이스이기 때문에 하이버네이트가 JPA에 명시된 기능들을 구현한다. 

 

그렇다면 질문. JPA는 직접적으로 DB와 연결되어 있는 것일까?

 

아니요, 아니요. JPA는 DB와 직접 연결이 되어 통신을 하지 않습니다.

 

대신 JPA 안에 있는 JDBC api를 이용하여 DB와 연결을 한다. 즉, JDBC가 SQL문 등과 같은 작업들을 수행해서 DB에서 데이터를 저장하거나 가지고 올 수 있게 도와준다.

 

아래 그림을 보면 더 빠르게 와닿을 수 있을 것이다.

 

영속성

근데, 이 즈음 되니 JPA라는 이름은 왜 JPA인지 의문지 들지 않는가?

코가 엄청 긴 초식 동물 이름이 코끼리가 된 이유는 높은 코 때문일 것이다. JPA도 비슷하다. Java 공식 orm의 이름이 JPA가 된 이유에는 persistence가 중요한 역할을 차지했다고 생각한다.

 

JPA 안에는 영속성 컨텍스트가 있다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 의미인데 영어로 하면 persistence context가 된다. 

 

영속성 컨텍스트에 대해 설명하기 전에 잠깐만 엔티티에 관해 이야기를 하겠다.

 

엔티티는 간단하게 말해서 java 클래스를 db의 테이블과 연관짓는 짓는 것이다. 즉, 클래스에 적은 변수들이 테이블의 컬럼이 된다. 이러한 엔티티들을 관리하기 위해서 엔티티 니저가 존재한다. 또 엔티티 멘니저를 관리하기 위해서는 엔티티 메니저 팩토리가 존재하고.

 

Entity manager factory 오로지 하나 뿐으로 엔티티 매니저를 생성한다. 이렇게 생성한 엔티티 매니저들은 엔티티를 저장하거나 찾거나 삭제하는 등 엔티티에 관한 전반적인 일들을 수행한다.

 

아, 들어가기에 앞서!

아래 설명은 김영한 님의 JPA 기초 강의를 기반으로 했다.

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com

예를 들어서 member이라는 엔티티를 하나 생성했다고 생각해보자.

이때 생성한 엔티티는 JPA와 관련이 없이 그저 객체를 생성한 상태일 뿐이다. 그러나 만일 엔티티 메니저를 통해 persist를 했다고 하면 지금부터 member 엔티티는 영속성 컨텍스트(1차 캐시)에 저장이 되어 영속성 관리가 되는 것이다.

 

영속성 관리를 하면 어떤 장점이 있을까?

 

먼저 엔티티는 영속성 컨텍스트에 있는 1차 캐시에 저장이 된다. 이는 조회를 할 때 굳이 db까지 갈 필요를 덜어주며 만일 값이 없더라도 db에서 값을 가지고 와 1차 캐시에 저장 후 사용하기 때문에 나중에 같은 값을 찾을 때도 1차 캐시만 찾아주면 된다.

 

다음으로는 엔티티의 동일성을 보장한다.

예를 들어서 memebr1과 member2에 각각 member 객체를 생성한 후 두 개의 객체를 비교해보자. 당연한 말이지만 컴퓨터는 두 객체가 다르다는 결과를 뱉을 것이다.

하지만 영속성 관리가 되는 엔티티의 경우에는 비교를 했을 때 같은 트랜젝션 안에서는 같다는 결과가 나온다. 

 

마지막으로는 쓰기 지연이 있다.

엔티티를 DB에 저장하기 위해서는 SQL 문을 작성해서 뿌려줘야 한다. 이때 쓰기 지연 SQL 저장소에 SQL문들을 모아놨다가 트랜잭션 커밋을 하면 SQL이 한 번에 실행이 되면서 DB에 값이 저장되거나 수정, 삭제되는 방식이다. 커밋과 persist에 관한 차이는 나중에 다른 글을 통해서 더 자세하게 다루겠다.

'이론 > JPA, Spring, Spring boot' 카테고리의 다른 글

@GenerateValue strategy  (0) 2023.08.01