영속성이란 데이터를 생성한 프로그램이 종료되어도 삭제되지 않는 특성이다.
아래 그림은 데이터가 생성한 프로그램이 종료되었을때의 상황이다.
데이터는 항상 보존되어야 하기 때문에 데이터베이스를 통해 영속성을 부여하게 된다.
Spring Boot의 아키텍처를 이해하면서 아래와 같이 크게 4개의 layer로 구분된다.

앞으로 설명할 JPA는 위의 계층에서 Persistence Layer 즉 영속 계층에서 사용되는 API이다.
위의 JPA를 소개하면서 JPA란 하이버네이트 기반의 ORM표준 API라고 했는데, 사실 JPA를 처음 접하는 사람이라면 저 말을 듣고 무슨소리인가 했을 것 이다.
일단 위의 말을 이해하기 위해서 ORM을 알아야 한다.
ORM이란 object relational mapping의 줄임말로 쉽게 말하자면 객체와 데이터베이스 사이의 관계를 연결해주는 역활을 하게 된다.
JAVA → 객체 저장 가능
DataBase → 객체 저장 불가능
데이터베이스는 객체를 저장하는것이 아닌 단순 데이터를 저장하는 것 이다. ORM은 이러한 DB와 OOP의 불일치성을 해결할 수 있다. (이러한 불일치를 패러다임의 불일치 라고 한다.)
예를들어 객체를 DB에 저장하기 위해 insert SQL을 직접 작성하는 것이 아니라 객체를 자바 컬렉션에 저장하듯이 ORM표준 프레임워크에 저장하게 되면 ORM은 적절한 insert SQL을 생성해서 데이터베이스에 저장하게 된다.
이렇듯이 ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달하는 것 뿐만이 아니라 앞에서 설명한 패러다임의 불일치 문제도 해결할수 있게 된다. 그러면 개발자는 더욱 객체측면에서의 정교한 데이터 모델링 또한 가능해져 객체지향 어플리케이션 개발에 집중할 수 있게 되는 장점이 있다.
하지만 모든 ORM 프레임워크들이 다 같은건 아니고 어떤 프레임워크는 단순 CRUD의 기능정도만 제공하고 있고 어떤 프레임워크는 패러다임의 불일치 문제까지 대부분 해결해주는 ORM 프레임워크가 있다. 하이버네이트(Hibernate)가 딱 그것이다.
여기까지 이해가 됬으면 위의 JPA란 하이버네이트 기반의 ORM 표준 API라는 말이 이해가 될 것이다.
Q: 매우 복잡한 쿼리같은 경우 SQL의 처리?
A: JPA는 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화 되어 있다. 때문에 JPA가 제공하는 네이티브 SQL을 사용하거나 MyBatis같은 SQL mapper 형태의 프레임워크를 혼용하는것도 좋은 방법이다.
Q: JPA vs MyBatis
A: MyBatis같은 경우가 SQL mapper이다. SQL과 객체를 매핑만 해주면 되는 좋은 프레임워크이지만 결국 이것 또한 SQL을 직접 작성해야하기 때문에 SQL에 의존하는 개발을 피할 순 없다. 반면 ORM은 객체와 테이블을 매핑만하면 ORM프레임워크가 SQL을 만들어서 처리하기 때문에 SQL에 의존하는 개발을 피할 수 있다.