JPA - 자바 표준 ORM
* ORM(Object Relational Mapping, 객체 관계 매핑) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것
객체를 관계형 데이터베이스에서 관리하는 것이 무엇보다 중요한다.
1. 그런 과정에서 SQL문이 계속 반복될 수 있는데 반복되는 문제가 있다.
2. 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데, 객체를 데이터베이스에 저장하려고 하니 발생하는 문제가 패러다임 불일치이다.
JPA는 이런 문제점들을 해결하기 위해 등장했는데 객체지향 프로그래밍 언어와 관계형 데이터베이스를 중간에서 패러다임 일치를 시켜주기 위한 기술이다.
즉, 개발자가 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행하면 개발자는 항상 객체 지향적으로 코드를 표현할 수 있고, SQL에 종속적인 개발을 하지 않아도 된다.
Spring Data JPA
JPA는 인터페이스로서 자바 표준 명세서이다. 인터페이스인 JPA를 사용하기 위해서는 구현체가 필요한데 대표적으로 Hibernate, Eclipse, Link 등이 있다. 이 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 JPA 기술을 다룬다.
JPA <- Hibernate <- Spring Data JPA
Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없는데 이렇게 한 단계 더 감싸놓은 Spring Data JPA의 등장 이유는
1. 구현체 교체의 용이성 - Hibernate 외에 다른 구현체로 쉽게 교체하기 위함
2. 저장소 교체의 용이성 - 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함
실무에서 JPA를 사용하지 못하는 가장 큰 이유
높은 러닝 커브 - JPA를 잘 쓰려면 객체지향 프로그래밍과 관계형 데이터베이스를 둘 다 이해해야 한다.
하지만 그만큼 JPA를 사용해서 얻는 보상은 크다.
JpaRepository - 클래스로 데이터베이스를 접근하게 해준다.
예)
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long>{}
JPA에선 DB Layer 접근자가 Repositroy라고 부르며 인터페이스로 생성한다.
단순히 인터페이스를 생성한 후, JpaRepository<Entity 클래스, PK 타입>를 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다.
JPA의 영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- JPA의 핵심 내용은 엔티티가 영속성 컨텍스트에 포함되어 있냐 아니냐로 갈린다.
-> JPA의 엔티티 매니저가 활성화된 상태로 트랜잭션 안에서 데이터베이스의 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태이다.
- 이 상태에서 해당 데이터의 값을 CRUD하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영한다. (즉, Entity 객체의 값만 변경하면 별도로 쿼리를 날릴 필요가 없다.)