JPA란?
Java persistence API이다
- persistence : Persistence(영속성) : 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미, 영속성은 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현
- 자바에 있는 데이터를 영구히 기록할 수 있는 환경(스토리지 내 DBMS)에 영구히 저장할 수 있도록 하는 환경을 제공하는 API라고 할 수 있음
API (Application Programming Interface) : 프로그램 사이 데이터 통신 규칙(상하관계가 존재) ↔ Protocol
Protocol은 서로 동일시하여 규칙을 서로 합의하에 정함
JPA는 ORM 기술이다.
- ORM(Object Relation Mapping) : 자바 오브젝트를 데이터베이스에 연결하는 방법론이라고 할 수 있다.
public class Team {
private Long id;
private String name;
private String year;
}
- 데이터베이스에 있는 세상을 자바 세상에 모델링한다.
- 자바의 클래스(엔티티)를 생성하고 데이터베이스 테이블 및 데이터를 생성하는 기법을 ORM이라고 한다. → 이때 필요한 것이 JPA 인터페이스
- JPA 반복적인 CRUD 작업을 생략하게 해 준다.
- 자바가 연결요청을 한다.
- 데이터베이스가 세션을 오픈하고 연결이 수립된다.
- 조회쿼리를 전송한다.
- 데이터를 자바로 돌려준다
- 자바 오브젝트로 변경한다.
- 위와 같은 반복로직을 JPA 함수를 통해 처리할 수 있다.
JPA 영속성 콘텍스트를 가지고 있다
- 영속성 : 어떤 데이터를 영구적으로 저장하게 해 주는 것(데이터베이스)
- 콘텍스트 : 대상에 대한 모든 정보 → 영속성 콘텍스트는 자바가 데이터베이스에 데이터를 저장하고, 가져오거나 삭제하는 일련의 모든 과정과 정보라고 할 수 있음
- 자바 → 영속성 콘텍스트 → 데이터베이스
- 데이터베이스 → 영속성 콘텍스트 → 자바
- 자바의 객체와 자바의 영속성 콘텍스트에 있는 정보(데이터)와 데이터베이스의 정보가 동기화됨
자바의 객체정보의 name을 수정 → 영속성 콘텍스트에 반영 →DB상의 name과 불일치 → update 쿼리를 실행하여 DB 상의 name 업데이트 → 객체-영속성콘텍스트-DB 모든 정보 동기화 완료
JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다(DB는 객체 저장 불가능)
- ORM(JPA)로 자바가 주도권을 쥐게 된다.
- DB는 객체저장이 불가능하지만, 자바는 객체저장이 가능하기 때문
- 즉, 자바에서 객체저장을 하고 JPA가 그 객체의 FK를 넣어 DB에 저장해 준다.
public class Team {
private int id;
private String name;
private String year;
}
public class Player {
private int id;
private int name;
// private int teamId; // FK로 teamId 를 가져올 경우 두번의 select쿼리, 혹은 조인으로 팀 데이터를 가져와야함
private Team team; // JPA를 통해 자바가 주도권을 가지고 객체방식으로 저장 가능
}
JPA는 OOP의 관점에서 모델링을 할 수 있게 해 준다(컴포지션, 상속, 연관관계)
- 만약 Engine(엔진)과 Car(자동차)가 있다고 하면, 자동차는 엔진이 필요하다.
- 상속은 x, 상속은 부모-자식 관계인데 Engine과 Car은 그 관계가 성립하지 않는다. (엔진과 자동차가 부모 자식 관계라는 게 말이 안 됨)
- 따라서 콤포지션(결합)을 한다.
Class Car {
int id;
String name;
String color;
Engine engine; // 콤포지션
}
Class Engine {
int id;
int power;
}
- JPA는 1. 클래스를 만들고 2. 자동생성하여 데이터베이스 테이블을 만든다.
- 따라서, 위의 코드가 실행되면 Car테이블과 Engine테이블까지 자동생성되어 만들어진다. → OOP관점 (Object-Oriented Programming)
Class BaseEntity {
LocalDateTime createdAt;
LocalDateTime updatedAt;
}
Class Car extends BaseEntity {
int id;
String name;
String color;
Engine engine;
}
Class Engine extends BaseEntity{
int id;
int power;
}
방언 처리가 용이하여 Migration 하기 좋음, 유지보수에도 좋음
- 방언 종류 : MySQL, MariaDB, Oracle, PostgreSQL...
- JPA는 추상화 객체를 두고 DB로 연결
- JPA는 추상화 객체만 바라보고 있기 때문에 방언 바뀌어도 상관없이 DB 연결하여 사용 가능
'JPA' 카테고리의 다른 글
JPQL 사용법 (3) | 2023.01.09 |
---|---|
JPA의 데이터 타입 (3) | 2023.01.07 |
프록시 & 지연로딩 (0) | 2023.01.07 |
엔티티 매핑 (0) | 2023.01.06 |
영속성 컨텍스트 (2) | 2023.01.05 |