Search

JPA의 개념

JPA는 Java Persistence API이다.

RAM은 휘발성 데이터 저장장치로써 전기를 사용해 데이터를 저장하기 때문에 컴퓨터의 전원을 끄면 데이터가 소멸한다.
이 데이터들을 하드디스크에 하여금 기록함으로써, 데이터는 영구히 저장되고 접근될 수 있다. 이러한 영구성을 persistence라 부른다.
자바는 하드디스크에 데이터를 쓰고 읽는 파일시스템 프로그램이 아니다. 자바에서 생성된 데이터가 영구성을 부여받기 위해선 파일입출력이나 DBMS의 힘이 필요하다. 결국 JPA는 하드디스크의 일부 공간을 DB로 배정, 관리하는 DBMS 시스템과 소통하며 자바 데이터를 영구히 기록할 수 있는 환경을 구출할 수 있게 제공받는 API인것이다.

JPA는 ORM 기술이다.

ORM은 Object Relational Mapping이라는 뜻으로. 오브젝트를 데이터베이스에 연결하는 방법론이다.
DB에 테이블을 생성하고 column값을 정해주면 사용자는 테이블의 각 행 형태의 데이터를 사용할 수 있다. 자바로부터 하여금 DB에 접근하기 위해선 DBMS에게 요청하는 입력(DML)과 결과값을 받는 출력이 필요하다.
자바는 이렇게 받은 테이블형태의 데이터를 자바 오브젝트 형태로 변환해야 하는데, 일반적으로 각 column을 멤버변수로 선언하고, 각 column에 해당하는 값을 매핑하여 사용한다. 이렇게 테이블 생성이 우선되어 오브젝트에 맵핑되는 방법을 TRM(Table Relational Mapping)이라 한다.
JPA는 이 과정을 역전시키는 기능과 인터페이스를 제공한다. 오브잭트를 통해 테이블이 맵핑되어 자동적으로 생성되도록 만들어주는 기능을 ORM이라 한다.

JPA는 반복적인 CRUD 작업을 생략하게 해준다.

Create, Read, Update, Delete 작업을 수행하는 SELECT, INSERT, UPDATE, DELETE쿼리는 하나의 서비스 내에서도 무수히 반복되는 작업들이다. 또한 이러한 작업을 할때마다 DB와의 연결을 잇고 끊은 다음, 테이블의 데이터를 자바 오브젝트로 다시 변환하는 일은 여간 귀찮은 일이 아닐 수 없다.
JPA는 DB와의 연결 관리와 데이터 변환 과정을 함수 하나로 제공해준다. 또한 반복적으로 작성해야 하는 쿼리들을 자바 오브젝트의 구조에 따라 생성되는 간편한 메소드로 지원해준다.

JPA는 영속성 컨텍스트를 가지고 있다.

앞서 설명했듯, 데이터를 영구적으로 저장하는 속성을 영속성이라 부른다.
컨텍스트는 대상의 구조, 속성, 행위 등 모든 정보를 일컫는 말이다.
이 두가지를 조합하면, 영속성 컨텍스트는 영속성을 지니는 모든 데이터와 영속성에 대한 정보 등 모든 정보를 가지고 있는것이라 말할 수 있다.
자바 어플리케이션, 영속성 컨텍스트와 DB의 데이터 타입은 다르지만, 일치하는 정보를 지닌다.영속성 컨텍스트는 생명주기(life cycle)동안 이 정보들을 동기화하는 책임을 진다. 그러기 위해 자바 어플리케이션에서 DB간 이동하는 데이터들은 영속성 컨텍스트를 거치고, 정보의 수정에 대해 영속성 컨텍스트는 소멸시기에 담고있는 모든 데이터를 DB에 반영한다.

JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체 저장이 불가능)

객체지향적 구조에선 객체 내부에 객체를 가질 수 있다. 하지만 테이블 형식의 DB에선 엔티티 내부에 또 다른 엔티티를 가질 순 없다. 외래키(Foreign key)로 참조를 할 뿐이다.
JPA는 ORM을 사용해 이를 OOP의 관점으로 해결해주도록 동작한다. 오브젝트 내에 포함된 오브젝트는 참조를 통해 JOIN할 수 있도록 기능을 제공해준다. 하지만 언제까지나 최적화가 완벽한 구조를 보장할 순 없으니(1+N 문제), 때에 따라 다른 적용방식을 모색할 필요가 있다.

JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)

방언 처리가 용이하여 Migration과 유지보수하기에 좋다.

JPA는 추상화 전략을 사용하여 MySQL, Oracle, MariaDB 등 아주 많은 dialect와 연동이 가능하다. 이에 사용자들은 환경에 따라 DBMS를 교체하더라도 상대적으로 용이하게 Migration을 진행할 수 있다.

JPA는 쉽지만 어렵다.