본문 바로가기
👨‍💻 개발/spring boot

[개념 및 기초] #2. JPA란?

by 말랑한곰탱이 2021. 10. 13.

1. JPA는 Java Persistence API이다.

Persistence(영속성) : 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미. 영속성은 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현한다.

 

API : Application Programming Interface

 

인터페이스 : 상하관계가 존재하는 약속

프로토콜 : 관계가 동등한 약속

수많은 프로토콜로 만들어진 ‘인터넷'

 

JPA

Java 자바 프로그래밍을 할 때

Persistence 영구적으로 데이터를 저장하기 위해 필요한

Application Programming Interface 인터페이스

 

2. JPA는 ORM 기술이다.

 -> Object-Relational Mapping

 

ORM -> 나의 하인!

자바는 클래스를 통해서 데이터베이스에 있는 테이블을 모델링해야 한다.

 

Class Team {

int id;

String name; DB 세상에 있는 데이터를 자바 세상에 모델링한다!

String year;

}

 

위 클래스를 실행하면 아래의 데이터베이스 테이블을 자동으로 만들어주는 것을 ORM이라고 한다.

 

Team 테이블

id int

Name varchar

year varchar

 

3. JPA는 반복적인 CRUD 작업을 생략하게 해 준다.

Select, Delete, Update, Insert 등 굉장히 반복적으로 일어나는 일들.

위의 일들을 할 때 자바 프로그램에서 DB에 커넥션을 요청함. -> DB가 요청자의 신분을 확인하고 세션열어줌. -> 자바에서 Connection을 가짐. -> 자바가 DB에 쿼리 전송 -> DB에서 Data를 자바프로그램에 응답 -> but, Data type이 서로 달라 자바 프로그램은 해당 데이터를 자바 object로 변경해야 함 -> 단순한 반복 로직..노가다..굉장히 귀찮음!

 

이런 일을 줄일 수 있는 것이 JPA!

전송된 쿼리에 대한 응답이 있을 때, 데이터를 받고 받은 데이터를 자바 오브젝트로 바꾸고 연결된 세션을 끊고, 연결된 커넥션을 끊는 이런 모든 과정을 함수 하나로 가능하게 해 줌!!

 

4. JPA는 영속성 컨텍스트를 가지고 있다.

영속성 : 데이터를 영구적으로 저장하게 해주는 속성 -> 자바에서는 DB에 저장.

컨텍스트 : Context. 모든 정보를 가지고 있는 것.

 

길동 -> 영숙 : 난 영숙이 너의 모든 컨텍스트를 가지고 있어. == 영숙이의 모든 것들을 알고 있다!!

영숙 -> 길동 : 변태.

 

영속성 컨텍스트는 자바가 DB에 데이터를 저장하고, 가져오는 일련의 모든 과정에 중간에서 관여한다. 자바에서 DB로 바로 가는 게 아니라, 영속성 컨텍스트를 거쳐서 데이터가 처리된다. 자바, 영속성컨텍스트, DB는 서로 동기화되어있다.

 

5. JPA는 ORM을 통해 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체 저장 불가능)

DB에선 객체 저장이 불가능하므로 foreign key를 사용하지만, 자바에선 객체 사용이 가능하므로, CRUD를 할 때 JPA가 ORM을 통해 자동으로 객체를 매핑해 준다.

 

OOP(Object-Oriented Programming) - 객체 지향 프로그래밍

 

6. JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)

Class Car extends EntityDate {

int id; (Primary key)

String name;

String color;

Engine engine;

}

 

Class Engine {

int id;

int power;

}

 

Class EntityDate extends EntityDate {

TimeStamp createDate;

TimeStamp updateDate;

}

 

Car  클래스에서 Engine을 사용하고 싶을 때, 상속을 해서는 안된다. 부모 자식 관계는 아니기 때문에. 콤포지션(결합)을 써야 한다.

시간과 같은 클래스에 공통으로 사용되는 객체가 필요하면, 새로운 객체를 만들어 상속하면 된다.

 

클래스를 통해 DB를 자동 생성하므로 아래와 같이 생성됨.

 

Car

id name color engineId createDate updateDate
1 bmw white 2    
2 sonata black 1    
           


Engine

id power createDate updateDate
1 2000    
2 4000    

 

7. 방언 처리가 용이하여 Migration 하기 좋음. 유지보수에도 좋음.

JPA는 DB에 붙어있는 추상화 객체를 사용해 mysql 뿐만 아니라, dialect(오라클, 마리아 DB, MSsql, mysql, postsql) 등 다양한 방언들 또한 추상화 객체가 수시로 변경되어 처리하기 용이하다.

원래는 방언들 사이에 코드가 다르기 때문에 처리하기 불편하고 힘들다. but JPA는 쉽게 가능!