RAM은 전기로 데이터를 저장하기 때문에 전류 공급이 안되면 날아가는 휘발성 데이터를 저장한다는 특징을 가지고 있다. 즉, 컴퓨터가 꺼지면 데이터가 날아간다. 그래서 컴퓨터가 꺼지더라도 데이터가 지워지지 않도록 하기 위해서 우리는 하드디스크에 데이터를 저장하여 사용한다.
JPA가 그렇다. Java에 있는 데이터를 영구히 보존할 수 있는 환경인 DBMS를 제공하는 API가 바로 그것이다.
간단한 개념인데 API는 무엇일까?
Application Programming Interface는 쉽게 말해서 어플리케이션을 프로그래밍 하기 위한 인터페이스이다.
프로토콜과 인터페이스
이 둘의 공통점은 약속이라는 키워드이다. 하지만 분명한 차이점이 존재한다. 프로토콜은 공동으로 지켜야 할 약속이라면, 인터페이스는 제작자로부터 만들어진 일방향적인 약속이라는 것이다.
JPA는 ORM 기술이다.
ORM(Object Relational Mapping)은 오브젝트를 데이터베이스에 연결하는 방법론 중 하나이다.
JPA를 사용하지 않았더라면 설계된 DB 테이블을 기준으로 모델링 된 자바 클래스를 만들어야 했을 것이다.(데이터베이스의 데이터 타입과 자바에서 사용하는 데이터 타입은 다르기 때문)
하지만 JPA의 ORM 기술을 사용하면 오브젝트를 먼저 생성하고, 오브젝트를 기준으로 데이터베이스를 자동으로 생성해줄 수 있다.
JPA는 반복적인 CRUD 작업을 생략하게 해준다.
Java 환경에서 Select, SelectAll, Delete, Update, Insert와 같은 CRUD 작업을 하기 위해서는 먼저 DB에 커넥션과 관련된 요청을 보낸다. 데이터베이스가 Java에게 접근 권한인 세션을 부여해주면, Java는 이후 요청부터 쿼리를 보낼 수 있다. 쿼리를 보내고나서 DB로부터 Java로 전달된 데이터는 Java에서 이해할 수 없는 데이터 타입이므로 자바 오브젝트로 변환하는 과정을 거친다. 복잡하지는 않지만 귀찮은 여러 과정을 거쳐야 하므로 굉장히 불편하다. JPA를 사용하면 이러한 일련의 과정을 모두 함수 하나로 생략할 수 있다.
JPA는 영속성 컨텍스트를 가지고 있다.
컨텍스트(Context)라는 단어는 굉장히 애매모호한 뜻을 가지고 있다. 컨텍스트는 어떠한 대상의 모든 정보를 가지고 있다.
자바 환경에서 DB에 데이터를 저장할 때는 다이렉트로 DB에 접근하는 것이 아니라, 먼저 영속성 컨텍스트에 접근하여 저장하고자 하는 데이터를 넘겨준다. 그러면 영속성 컨텍스트에 저장된 데이터는 DB로 전달되어 저장되게 된다.
자바에서 DB에 저장된 데이터를 가지고 올 때, DB는 영속성 컨텍스트에 데이터를 전달해준다. 이때, DB의 데이터 타입과 자바의 데이터 타입은 서로 다르기 때문에 영속성 컨텍스트는 자바 데이터 타입으로 변환하여 자바에 전달해준다.
자바와 DB에 동물이라고 하는 데이터가 저장되어 있다고 가정해보자. 자바의 초기 동물 데이터는 호랑이이고, DB의 동물 데이터도 호랑이이다. 자바에서 동물 데이터를 고양이로 바꾸고 inster를 하면 영속성 컨텍스트와 데이터베이스는 서로 동기화가 되어 있기 때문에 DB의 동물 데이터는 호랑이에서 고양이로 insert가 아니라 update가 되게 된다.
JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)
JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다.
상속, 컴포지션, 연관관계
방언 처리가 용이하여 Migration하기 좋다. 유지보수에도 좋다.
스프링을 사용할 때, JPA를 통해 DB에 접근한다. JPA는 MySQL 뿐만아니라, 오라클, 마리아 등 수많은 종류의 Direction을 제공한다. 사용하고 싶은 DB를 추상화 객체로 만들어주면 된다.