하나의 툴을 쓰더라도 7할은 알고 쓰자는 마음가짐. .

Java Persistence API : 자바 지속성 응용 프로그램 인터페이스
자바에서 데이터를 지속적으로 저장하고 관리하기 위한 프로그래밍 인터페이스
Object-Relational Mapping : 객체 - 관계형 DB 매핑 기술
어플리케이션 Class 와 RDB의 테이블을 자동으로 영속화 해주는 기술
JPA는 반복적인 CRUD SQL을 처리한다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하기에 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다. 추가로 네이티브 SQL 기능을 제공하기 때문에 관계 매핑이 어렵거나 성능 이슈가 우려된다면 직접 SQL을 작성할 수 있다.
JPA를 사용하여 얻을 수 있는 가장 큰 이점은 SQL이 아닌 객체 중심으로 개발할 수 있다는 것이다. 또한 JPA는 패러다임의 불일치도 해결하였다. 그 예로 JAVA에서는 부모클래스 - 자식 클래스의 관계 즉, 상속관계가 존재하는데 데이터베이스에서는 이러한 객체의 상속관계를 지원하지 않는다. 이런 상속관계를 JPA는 아래와 같은 방식으로 해결하였다.

위의 구조에서 만약 Album 클래스를 저장한다고 가정하면.
jpa.persist(album);
그럼 JPA는 위의 코드를 아래의 쿼리로 변환해서 실행한다.
INSERT INTO ITEM (ID, NAME, PRICE) ....
INSERT INTO ALBUM (ARTIST) ....
위처럼 저장하면 당연히 조회할 때도 두 테이블을 역어서 가져올 것이다. 조회하는 JAVA 코드와 변환되는 쿼리를 보자.
String albumId = "id100";
Album album = jpa.find(Album.class, albumId);
SELECT I.*, A.*
FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
위와 같이 상속관계에 대한 접근도 제공해주는데 객체지향에는 연관관계라는 것도 있다. 코드로 따지면 Class에서 또 다른 Class Type을 필드 변수로 가지고 있는 것이다. 객체관계와 이를 테이블 구조로 나타낸 아래의 그림을 보자.

위의 그림은 Member 클래스가 Team 타입의 team 필드 변수를 가지고 있는 형태인데, 코드로 나타내면 아래와 같다.
Class Member {
String id;
Team team;
String username;
}
Class Team {
Long id;
String name;
}
그렇다면 Team 객체를 참조하는 필드를 가지고 있는 Member 객체는 어떻게 저장할까 ? 위에서 봤던 상속구조와 다를바가 없다.
Member member = new Member();
member.setId("100");
member.setUsername("dbjh");
Team team = new Team();
team.setName("dev_team");
member.setTeam(team);
jpa.persist(member);
위처럼 Member 객체의 team 필드에 Team 객체를 set하고 Member 객체를 DB에 저장하게되면 JPA는 아래와 같은 코드를 데이터베이스에 실행하라고 한다.
INSERT INTO MEMBER (ID, TEAM_ID, USERNAME) ....
INSERT INTO TEAM (ID, NAME) ....
이렇게 저장 후 Member 객체만 조회하면, Team 객체 정보도 가져와 Member 객체의 team 필드에 주입하기 때문에 아래와 같이 사용할 수 있다.
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
위와 같은 구조들이 더 복잡해져도 JPA는 이를 모두 지원하기에 문제가 없다.
위에서 다룬 JPA의 저장 및 조회는 아래와 같은 구조로 실행된다.


참고로 JPA는 수정 메소드를 제공하지 않는다. 하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정 시, 매핑된 객체를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을 전송하여 실행한다.
Spring 에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 Spring-data-jpa 프레임워크이지 JPA는 아니다. 즉 Spring Data JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈이라는 것이다. JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록한다.

자바 언어를 위한 ORM 프레임워크. JPA 인터페이스의 구현체로, 내부적으로 JDBC API를 사용한다.
Java Database Connectivity : 자바 - 데이터베이스- 연결성
Java와 DB를 연결을 지원하는 표준
구현체로 Hibernate를 선택한 이유는 ?
JPA는 Hibernate를 추상화 한 인터페이스 입니다. 다른 구현체에 비해 가장 JPA와 호환이 잘 됩니다. 또한 Spring Starter의 Data JPA 의존성에는 Hibernate 구현체가 기본적으로 포함되어 있습니다. JPA에서 부족한 부분을 다른 구현체에서 채워줘 그들을 필요하게 된다면 선택하겠지만 현재까지 Hibernate는 가장 강력하고, 이후에도 변함 없을 것 같다는 생각입니다.
https://dbjh.tistory.com/77
https://livenow14.tistory.com/70