JPA는 Java Persistence API이다.
자바프로그램을 할 때 영구적으로 데이터를 저장하기 위해서 필요한 인터페이스가 JPA이다.
JPA는 ORM기술이다. (Object Relational Mapping)
object를 데이터베이스에 연결하는 어떠한 방법론 같은 것이다. (나의 하인 같은 아이)
자바가 들고있는 데이터 타입과 데이터베이스가 들고 있는 데이터 타입이 다르다.
그래서 클래스를 통해 하려면 데이터베이스에 있는 테이블을 모델링해야 한다.
실제로 모델링을 하게 되면
Class Team {
int id;
String name;
String year;
}
DB세상에 있는 데이터를 자바세상에 모델링한 것이다.
근데 테이블을 만들고 모델링한 것을 역전할 수 있다.
클래스를 만들고 그 클래스를 통해 데이터베이스를 자동 생성할 수 있는데 이때 필요한 것이 JPA가 가지고 있는 인터페이스이다.
그래서 인터페이스의 규칙을 지켜서 클래스를 만들어 Java에서 실행을 하면 데이터베이스의 테이블이 자동으로 생성되게 하는 기법을 ORM이라고 한다.
JPA는 반복적인 CRUD 작업을 생략하게 해 준다.
자바프로그램에서 데이터베이스에게 커넥션을 요청->데이터베이스가 사람의 신분을 확인하고 session을 오픈하여 연결한다->자바에서는 커넥션을 가진 뒤에 쿼리를 전송할 수 있게 되고 커리를 전송하면 데이터베이스는 테이블을 만든다->
그리고 이 데이터를 자바에 다시 응답하게 되는데 자바와 데이터베이스의 데이터타입이 다르기 때문에 그 데이터를 자바가 이해할 수 있도록 변경하고 세션을 끊고 이런 기본적으로 반복되는 CRUD 로직을 줄여주는 것이 JPA이다.
JPA는 영속성 컨텍스트를 가지고 있다.
영속성 : 어떤 데이터를 영구적으로 저장하게 해주는 persistence 영속성이라고 하고 자바에선 데이터를 영구적으로 저장할 때 파일시스템이 아니라 데이터베이스에 저장을 한다.
컨텍스트 : 어떤 대상에 대한 모든 정보를 가지고 있는 것

만약 DB에 저장했던 데이터를 변경해 커밋해서 DB에 밀어 넣으면 영속성컨텍스트와 가지고 있는 데이터와 DB가 다르다는 걸 캐치하여 insert가 아니라 update문이 자동으로 호출한다. 이런 일을 해주는 게 연속성컨텍스트이다.
이 연속성컨텍스는 Java가 DB에 저장하고 DB에 있는 데이터를 가져오고 하는 이 일련의 모든 정보를 연속성컨텍스트에서 확인할 수 있다 -> 다 알고 있다!
그래서 Java는 항상 연속성컨텍스트를 통해서 데이터베이스에 데이터를 저장하고 데이터베이스에 있는 데이터도 영속성컨텍스트를 통해서 데이터가 Java 쪽으로 전달이 된다. 그리고 연속성 컨텍스트에서 일어나는 이 모든 것들은 자동으로 처리된다.
JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다.(DB는 객체저장 불가능)
OOP:객체지향프로그래밍

player테이블과 team 테이블을 두고 자바 관점에서 모델링을 하게 되면 왼쪽 두 개의 클래스를 명할 수 있다.
DB는 기본자료형이고 Java는 기본 자료형이 아닌 오브젝트를 저장할 수 있기 때문에 오른쪽 player클래스를 만들 수 있다.
근데 그렇게 만들면 테이블에서는 teamID가 int로 만들어져야 하는데 오브젝트로 만들어져 있기 때문에 모순이 일어난다.
이렇게 되면 진정한 OOP를 이용할 수 있다.
ORM을 하게 되면 모델을 만들 때 Java가 주도권을 쥐고 있는 모델을 만들 수 있다.
이렇게 들어간 데이터를 insert 하거나 select를 할 때 JPA가 자동으로 Mapping 해서 데이터를 넣어줄 것이다.
이런 일들을 해주는 것이 ORM이다.
JPA는 OOP의 관점에서 모델링을 할 수 있게 해 준다. (상속, 콤포지션, 연관관계)
방언 처리가 용이하여 Migration 하기 좋음. 유지보수에도 좋음.
스프링 할 때 JPA를 돌리는데 추상화객체만 바라보고 있기 때문에 추상화객체가 Oracle로 바뀌든 mysql로 바뀌든 상관없이 데이터베이스에 연결해서 사용할 수 있기 때문에 방언 처리가 용이하다. 안 그러면 코드가 엄청나게 많이 바뀌어야 하는데 덕분에 유지보수에 좋당
JPA는 쉽지만 어렵다.
'공부중 > 스프링부트 개념정리' 카테고리의 다른 글
스프링부트 개념정리(5) - 스프링 컨테이너 (0) | 2023.12.27 |
---|---|
스프링부트 개념정리(4) - web.xml (0) | 2023.12.27 |
스프링부트 개념정리(3) - 서블릿 컨테이너, 톰캣 (0) | 2023.12.26 |
스프링부트 개념정리(1) - 스프링 (0) | 2023.12.19 |
댓글