JPA?
- Java Persistence API
- API? : Application Programming Interface
- cf) API와 Protocol의 차이는?
- API : 상하관계가 존재하는 약속
- Protocol : 상하관계가 존재하지 않는다. 모두 동일함.
- 객체의 데이터를 영구적으로 저장할 수 있는 API
Java와 DB의 데이터 통신 절차
- 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터! (RAM과 반대)
- Java → DB 세션 요청
- DB, 세션 오픈
- Java, connection을 가짐
- Java → DB 쿼리 전송
- DB, 쿼리를 토대로 데이터 생성
- DB → Java 데이터 전달
- 6번에서, DB의 데이터 형식과 Java object 형식이 맞지 않기 때문에 Java에서 변환하는 작업이 필요하지만 번거로운 일 ⇒ CRUD
- 이후 Java와 DB의 세션을 끊고 connection까지 끊는 작업을 자바 함수로 간편하게 나타내주는 것이 JPA!
1. JPA는 ORM 기술이다.
ORM : Object Relational Mapping
- Object를 DB에 연결하는 방법론
- 객체(Java, Kotlin, ...)와 DB의 데이터 형식 차이를 극복!
- Java→DB : DML(Delete, Update, Insert) = 데이터 수정 및 삽입
- DB→Java : Select = 데이터 주기
- 하지만 Java의 데이터 타입과 DB의 데이터 타입은 다르기 때문에 바로 연결 불가
⇒ 모델링하는 작업이 필요함
- 객체를 DB 테이블에 자동으로 영속화(Persistence)한다.
2. JPA로 CRUD를 구현할 수 있다.
CRUD : Create(Insert) + Read(Select) + Update + Delete
- DB를 생성하고, 읽고, 갱신하고 지우는 기능. 게시판의 주요 기능과 같다.
- JPA의 기본적인 기능.
3. JPA는 영속성 context를 가지고 있다.
- 영속성 : Persistence, 데이터를 영구적으로 저장하는 속성
- context : 그 대상의 모든 정보를 의미
- Java와 DB 사이에 존재!
- DB와 영속성 context(자바 데이터로 존재)가 동기화되어 Java의 요청에 응답한다.
- 객체, 영속성 context, DB 간의 통신 과정
1 : 객체에는 data A가 있고 이것을 DB에 저장하고자 한다.
2 : 영속성 context가 data A를 저장하고 DB에 그 데이터를 넘겨준다.
3 : DB에서 data A를 저장한다.
a : Java, Kotlin에서는 DB의 data B가 필요하다. 따라서 영속성 context에게 요청한다.
b : 하지만 영속성 context에서는 data B가 없다.
c : 그러므로 DB에게 data B를 요청한다.
d : DB가 영속성 context에 data B를 동기화한다.
e : 동기화된 data B를 객체에 넘겨준다.
4. JPA는 DB와 OOP의 불일치성을 해결한다.
DB와 OOP의 불일치성?
💡 이렇게 DB 테이블이 구성되어 있다고 가정하자.
Babto 테이블에는 토베, 밥베 두 부류가 있고,
Animal 테이블에는 토베, 밥베의 동물들이 리스트되어 있다.
- DB에서는 각각의 자료형들은 기본 자료형(int, string)만으로 구성할 수 있어, Animal 테이블의 BT ID 항목은 Babto 객체가 아닌 Int로 선언해야 한다.
fun main() {
val tobae = Babto(1, "토베")
val babbe = Babto(2, "밥베")
val benny = Animal(1, "베니", tobae)
val babal = Animal(2, "바발", babbe)
}
class Babto(val id : Int, var name : String)
class Animal(val id: Int, var name: String, val BTid:Babto)
- 하지만 Java, Kotlin은 OOP이므로 BT ID 항목에 Babto 객체을 부여할 수 있다.
❓ 그럼 Animal 테이블의 BT ID 자료형 불일치는 누가 해결할까?
→ 이를 JPA가 해결해준다!