티스토리 뷰
JPA(Java Persistence Api)
persistence란 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 말함
RAM은 휘발성 데이터를 저장이 가능 즉 컴퓨터가 종료되면 데이터가 사라짐 그래서 하드디스크에 영구적 저장이되도록 기록하게되는데 이런 하드디스크에 저장하는것을 persistence라고 한다.
자바에서 데이터를 저장할때 하드시크에 저장되긴하지만 파일시스템이 다르다 DBMS
API(Aplication programing interface)
Aplication 프로그램, programing 프로그래밍, interface 인터페이스
인터페이스란
프로토콜이 있고 인터페이스가 있는데 프로토콜과 인터페이스는 어떤 약속을 뜻하게 되는데
둘의 약속은 다르다 예를 들어
A , B, C가 있으면 B가 가장 힘이 강하다 B에게 연락을 할때는 전화하지 말고 직접 찾아와라고 약속을 하였다 이때 A 와 C는 B에게 규칙을 지키게 되는데 이것을 interface라고 한다.
프로그램으로 예는 장보고란 사람이 프로그램을 공유하였고 홍길동이란 사람이 장보고의 프로그램을 이용할때 장보고는 이때 인터페이스를 지정할 수 있게되는데 장보고의 인터페이스는 밤12시부터 새벽6시까지만 사용가능하다고 지정하게되면 그때만 홍길동은 장보고의 프로그램을 사용할 수 있게된다.
그렇다면 프로토콜은 위처럼 A,B,C가 존재할때 B가 위와같은 조건을 걸었을때 A,C는 거부할 수 있게된다 수많은 프로토콜이 모인것이 인터넷인데 A,B,C는 동등한 입장이며 서로에게 맞는 프로토콜을 만들게되어 연락을 하게되는데 예시론 email이라고 할 수 있다.
java persistence Application인 jpa는 자바프로그래밍을 할때 영구적으로 데이터를 저장하기위한 인터페이스를 말하게 된다.
ORM(Object Relational mapping)
object를 db에 연결하는 방법이며 orm은 나의 종이라고 생각해보자
건물을 짓는 설계도가 있고 그설계도에 따라 건물을 만드는것을 모델링이라고 한다 설계도에 따라 실체화시키는것과도 같다
team테이블에 id int, name varchar, year varchar 형태의 테이블이 존재하는데 이것을 자바쪽에 가져와서 input & output을 하게되는데 가져올때는 DML(insert, delete, update)가있고 output에는 (select)를 사용하게된다.
자바와 db의 데이터타입이 완전히 다른데 이때 DB의 데이터를 모델링하게되는데 DB의 데이터가 java의 형식으로 변환되어 java에 전달되게된다
int id, String name, String year등 옆과같은 형식으로 클래스안에 멤버필드로 들어가게됌
하지만 위에선 db에서 모델링을하여자바에 전달하였지만
java에서 모델링을하여 db에 전송이 가능하다 이때 필요한게 jpa -인터페이스이며 이것을 ORM이라고 칭한다
반복작업을 줄여줌
자바에서 db에 데이터를 수정하거나 입력 등을할때 db에요청을하게되는데 요청이 성공하면 세션이 오픈되게된다 그리고 db에서 데이터를 java에 보낼때 java형식으로 변경해주고 보내주고 모든 전송이 완료되면 connection를 끊고 요청이있을때마다 같은 작업을 계속반복하게된다 하지만 jpa를 사용하게되면 함수하나로 위와같은 반복적인 코드를 사용하지 않아도 된다 위와같이 귀찮은 작업을 대신해주기때문에 하인이라고 생각하는것
영속성 컨텍스트
컨텍스트란 개념이 모호하다 영숙이라는 여자와 길동이라는 남자가 있다 길동이가 영숙이에게 난 영숙이의 모든 컨텍스트를 가지고 있다 라고 말하였다 이뜻은 영숙이의 모든것을 알고있다는 말이된다 즉 모든 정보를 가지고있는것을 컨텍스트라고한다 그리고 컨텍스트는 다른데에 양도가 가능하다 새로운 사람 보고라는 남자가있고 길동이가 보고에게 영숙의 컨텍스트를 넘기게되면 보고는 이제 영숙의 모든 정보를 가지게되고 영숙도 만약 보고에 대한 컨텍스트를 가지고있다면 서로 모르는게 없는 사이가 되는것이다
동물 데이터가 존재하고 DB에 데이터를 넣을려할때 중간단계에서 영속성 컨텍스트가 있는데 거길 거쳐서 DB에 전달되게 되면 db에 동물 데이터가 저장이될것이며 영속성 컨텍스트에 db에 대한 데이터가 저장이된다 그렇다면 select로 데이터를 요청하게되면 데이터를 어떻게 가져올까?
DB에 과일데이터가 존재하고 영속성 컨택스트에 데이터는 비어있다고 가정해보자 요청을하게되면 영속성컨텍스트에 과일데이터가 있나확인하고 없다면 db에 요청을 하게될것이다 해당 과일데이터를 찾아 영속성 커텍스트에 저장을하고 자바에 데이터가 전달이되며 현재 영속성 컨텍스트에 과일데이터가 저장이되어있다 생각을하고 자바에서 과일데이터의 원래값은 과일이었는대 사과로 바꿔서 영속성 컨텍스트에 전달하게되면 알아서 update가 되게 되는데 이것도 영속성 컨텍스트의 기능이다
JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다 (DB는 객체저장 불가능)
team이라는 테이블이있고 player라는 테이블이존재한다
team에는 id,name,year이라는 속성이있고
player에는 id,name,teamId속성이 있음
이때 player의 teamId는 team테이블의 id를 참조하게되는데
각각의 속성의 값은 object값을 가질수 없다 id에는 int자료형의 데이터 하나만 들어와야하고 name에는 String 형태의 데이터 하나만 들어와야하니 object값을 가질 수 없다는것이된다 그렇다면 player의 데이터가 1, 공필성, 2 라고할때 player의 공필성의 팀을 알고싶다면 team table과 join을 하여야하는데 만약 DB가 아닌 자바라면 데이터가 이렇게 생겼을것이다 1, 공필성, team(object)형태일것이다 자바형태로 모델링을 하게되면 되게 편하니 ORM을 사용하게 되고 JPA가 매칭될때 알아서 데이터를 알맞게 넣어주게 된다.
OOP관점에서 모델링이란?
Car과 Engine라는 두개의 클래스가 존재하는데 Engine란 클래스를 Car에 사용하고싶다면 상속은 할 수 없다 왜냐면 엔진의 기능을 사용하기위해선 Car가 Engine를 상속받아야하는데 Car의 부모가 Engine가 되는건 말이안되기 때문이다 그렇담 Car에서 Engine를 사용하기 위해선 클래스에 맴버필드의 내용은 이러할것이다 String name, String color, Engine engine형태로 만들것이고 이형태로 테이블을 만들게된다면
Car table
id | name | color | engineId |
1 | BMW | white | 2 |
2 | sonata | black | 1 |
Engine table
id | power |
1 | 2000 |
2 | 4000 |
위와같이 테이블이 자동생성이 될것이다.
상속
날짜도 필요하여 class EntityDate라고 생성하고 안의 멤버는 Timestamp createDate, Timestamp updateDate 두개의 멤버를 만든뒤 Car과 Engine에 extends를 하게되면 테이블은 이렇게 생성이될것이다.
Car table
id | name | color | engineId | createDate | updateDate |
1 | BMW | white | 2 | ||
2 | sonata | black | 1 |
그렇다는것은 jpa에서는 상속받더라도 알맞게 db를 만들어준다는 뜻이된다.
방언처리 용이
스프링 - JPA - DB 형태로 데이터가 전달이 될때 JPA에는 추상화 객체가 있는데 추상화 객체의 역할은 oracle든 mysql, maraDB등 여러개의 DB도 형태에 맞게 DB에 데이터를 전달할 수 있게 해준다
'Spring Boot' 카테고리의 다른 글
스프링부트 개념정리(스프링 컨테이너, 응답) (0) | 2023.07.19 |
---|---|
스프링부트 개념정리(Socket, HTTP, Tomcat, web.xml) (0) | 2023.07.19 |
스프링부트 개념정리(제어역전, 메세지 컨버터,Buffered, 필터, ) (0) | 2023.07.19 |
SpringBoot + MariaDB 12 페이스북로그인 (OAuth2) 앱등록 설정 di에러 해결 (0) | 2023.06.15 |
SpringBoot + MariaDB 11 AOP자동에러처리(Spring AOP) (0) | 2023.06.15 |