[Spring] JPA?

조오닭·2022년 4월 7일
0

Concept of Spring Boot

목록 보기
3/3
post-thumbnail

JPA?

  • Java Persistence API
    • API? : Application Programming Interface
    • cf) API와 Protocol의 차이는?
      • API : 상하관계가 존재하는 약속
      • Protocol : 상하관계가 존재하지 않는다. 모두 동일함.
  • 객체의 데이터를 영구적으로 저장할 수 있는 API

Java와 DB의 데이터 통신 절차

  • 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터! (RAM과 반대)
    1. Java → DB 세션 요청
    2. DB, 세션 오픈
    3. Java, connection을 가짐
    4. Java → DB 쿼리 전송
    5. DB, 쿼리를 토대로 데이터 생성
    6. 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의 불일치성을 해결한다.

  • 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) //tobae 객체가 들어감
    val babal = Animal(2, "바발", babbe) //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가 해결해준다!

profile
백엔드 응애

0개의 댓글