Wanna be Brilliant Full-Stack Developer

2/16 SPRING with JPA 영속성 컨텍스트는 무엇인가? 본문

Back-End/Spring Boot

2/16 SPRING with JPA 영속성 컨텍스트는 무엇인가?

Flashpacker 2022. 2. 17. 01:19


 

JPA 는 영속성 컨텍스트를 가지고 있다?!

영속성이란 어떤 데이터를 영구적으로 저장하게 해주는 Persistence  영속성이라 하고 우리 자바에서는 데이터를 영구적으로 저장할떄 파일시스템이아니라 데이터베이스 DB에 한다!

 

컨텍스트란 무엇인가? 프로그램을 하다보면 컨텍스트라는 말이 나오고 웹과 앱에서 도 나오는데 

컨텍스트: Context라는 개념이 굉장히 모호한데 

 

영숙이라고 여자 한명이 있고 길동이라는 남자도 있다. 길동이가 영숙이한테 난 영숙이 너의 모든 컨텍스트를 가지고 있어 -> 이게 무슨말이냐면 영숙이의 모든것들을 다 알고 있다라는것이다. 

컨텍스트라는건 모든 정보를 가지고 있다는 것이다. 컨텍스트는 모든곳에 달라붙을수 있다. 

영숙이의 컨텍스트, 어떤 대상의 컨텍스트, 컨텍스트라는건 어떤 대상에 달라붙는 순간 그 컨텍스트는 그대상의 모든 정보를 가지고 있는것이 컨텍스트이다! 

 

한번씩 프로그램에서 보면 컨텍스트 넘겨준다는 말이 있다. 

컨텍스트를 넘겨준다는것은 이런말인데 길동이가 영숙이의 모든 컨텍스트를 가지고있다. 그래서 길동이가 영숙이를 더이상 좋아하지 않은 상태에서 장보고라는 애가 영숙이를 짝사랑한다고하면 보고한테 길동이가 컨텍스트를 넘겨줄수있다. 그러면 영숙이의 대한 모든 컨텍스트를 장보고가 알게 되는것이다. 

그래서 보고가 영숙이한테 어느 카페에 놀러갔었지? 어제 어디갔었지? 어제 머먹었지? 다 알고 있는것이다 .

그런데 영숙이는 보고라는애를 좋아해서 보고의 컨텍스트를 다 알고있다.

보고야 너 어제 길동이한테 내 컨텍스트 다 받았지?

 

쉽게 이야기하면 컨텍스트는 대상의 모든 정보를 가지고 있다는것이다. 

영속성 컨텍스트라는건 데이터를 영구적으로 저장해야되는 컨텍스트를 가지고 있다는것인데 컨텍스트란 이런것이다.

ORM에서는 내가 만약에 이 데이터베이스가 있는데 데이터베이스에 어떤 데이터를 저장하고 싶은데 그 데이터가 그 동물데이터다. 그 동물 데이터를 내가 만들고 저장하려고 하면 다이렉트하게 데이터베이스에 접근해서 저장하는 것이 아니라 중간에 영속성 컨텍스트라는것이 있는데 

영속성 컨텍스트는 자바가 데이터베이스에 데이터를 저장해야하는 모든것들을 알고있는것이 영속성 컨텍스트다.

영속성이라는 것은 어떤 데이터를 영구적으로 저장하기위한 방법이니까 그것에대한 모든것을 컨텍스트는 알고있다. 

자바라는 프로그램에서 데이터베이스 에 왔다갔다 하는 모든것들을 영속성 컨텍스트가 알고있다.

 

자바는 데이터를 DB에 저장하고 싶으면 어떻게하냐면 영속성 컨텍스트를 동물 데이터를 던지고 

그다음에 영속성 컨텍스트에 있는 동물데이터를 데이터베이스에 던진다 그 데이터베이스에 동물데이터가 저장된다. 

그리고나서 여기에 영속성 컨텍스트에 접근이 가능하서 동물데이터를 삭제하고 

내가 다시 데이터베이스에 던지면? 그 동물데이터는 날라간다.

영속성 컨텍스트 안에있는 데이터와 DB안에 있는 데이터가 동기화된다. 

만약에 영속성컨텍스트 안에 아무것도 없는 상황에서 DB에서 과일 데이터가 있다? 그래서 과일 데이터가 필요하면 SELECT요청을 하면 첫번쨰로 자바는 데이터베이스에게 바로가는것이 아니라 영속성컨텍스트한테가서 과일 데이터를 좀줘 라고 한다

그러면 영속성 데이터는 과일데이터를 안가지고 있기떄문에 DB에가서 과일데이터를 내놓으라고 한다 과일 데이터를 받ㄱ아서 영속성 컨텍스트가 자바 오브젝트로 바꾼 과일 데이터를 가진다.

타입이 서로 다를것이다. DB안에 있는것은 DB타입이고 영속성 컨텍스트 안에있는건 자바 오브젝트이다. 

 

과일 데이터를 만들어서 자바한테 돌려준다. 그 과일 데이터(자바), 그 과일 데이터( 영속성컨텍스트안) , 그 과일 데이터( DB안) 에 있는것은 일치한다.

이상태에서 내가 그 과일데이터의 내용을 변경하면 만약 ㄱ이 과일이 사과인데 딸기로 변경하면? 

이 영속성컨텍스트 안에 있는 과일이 딸기로 바뀐다. 그리고 내가 DB 커밋해서 변경된 데이터를 밀어넣으면 

어떻게 되냐면 영속성 컨텍스트 가 가지고있는 과일 데이터에 형상이 달라져있다. 

영속성 과일은 딸기이고, DB안에 있는건 사과이다. 

이떄 어떤일이 일어나냐면 인서트가 아니라 업데이트가 일어난다 왜냐하면 서로데이터가 다르니까 

같은 데이터인데 데이터가 다르군아 해서 업데이트 문이 자동으로 호출이된다.

 

이런것들을 해주는것이 영속성 컨텍스트이다.

영속성컨텍스트는 자바라는 애가 DB에 저장하고 DB에 있는 데이터를 셀렉해서 가져오고 하는 일련의 모든 정보를 영속성 컨텍스트를 통해 다 확인할 수 있다. 그의미는 다 들고 있다는것이다.

자바가 해야하는 자바가 데이터베이스에 저장해야하는 모든 메타데이터들을 영속성 컨텍스트가 다 가지고 있다. 

자바는 항상 영속성 컨텍스트를 통해서 데이터베이스에 데이터를 저장하고 데이터베이스 에있는 데이터 또한 영속성컨텍스트를 통해서 데이터가 자바쪽으로 전달된다.

 

영속성컨텍스트에 일어나는 모든일은 자동으로 처리가 된다! 

 


JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. 

우리가 DB를 보면 Team이라는 테이블이 있고 Player이라는 테이블이 있따.

우리가 야구라는 어떤 프로그램을 만들건데 그 프로그램에 테이블이 두개 들어간다

이 Team에는 ID, NAME , YEAR이 있고

Player에는 ID, NAME, TeamId가 있다. 

1번 롲데 1990년도 2번 NC 2005 라는 데이터가 team에 있고 

Player에는 1번 이대호 1 ,

TeamId를 Foreign key (참조키) 라고 부른다. 누구를 참조하냐면 team의 id를 참조한다!2번 공필성 1, 3번 가득염 1 4번 홍길동 2 이런방식으로 데이터가 들어가면 데이터베이스를 보면 특징이 머냐면 각각의 컬럼들은 가질수 있는 데이터가 기본자료형들이다. 무엇을 못가지냐면 오브젝트를 못가진다이게 무슨말이냐면 이대호는 1이라는 integer데이터를 가지는거지  Team테이블에 1, 롯데, 1990  이 세가지 데이터를 통으로 들고 있는 오브젝트를 못가진다는것이다. 

 

 

자바 관점에서 보면 이거를 만약에 TEAM 과 PLAYER을 모델링을 하면 

Class Team {                   class player {

int id;                                    int id;

Stirng name;                           String name;

String year;                               int teamId;

}                                                 }             player는 teamId를 가지고 있기 떄문에 1,2,3,4요런값들을 가지고 있을거다 이렇게 만들면 DB에서 공필성을 셀렉하면

이렇게 보면 공필성이 어떤 팀에 있는지 모른다

이대로 던져주면은 일반 사용자들은 모른다 내가 웹페이지에다가 어떤 데이터를 뿌릴떄 2번 공필성의 팀은 1이에요 라고는 못보내는데 정상적으로 보내주기 위해서는 셀렉트를 한뒤에 1번으로 team 테이블을 셀렉트해서 어떤 팀인지 찾아오거나 조인을 통해서 해결해야한다.

실제로 이 자바 프로그램에서는 기본 자료형이 아닌 이 오브젝트를 저장 할수 있다. 

이렇게 만들게 되면 데이터베이스 에서 만든 player테이블과 자바 클래스는 모순이된다? 

player테이블에는 아이디라는 int값과 name이라는 STring 값과 teamid라는 int값을 가지고 있는데

거기에 맞춰 만들기 위해서는 Team부분이 int가 되어야하는데 애를 int로 만들지 않고 오브젝트로 만든거다. 

이렇게 만들게 되면 Team에는 TEAM 오브젝트를저장할수 있다. 

이렇게 되면 진정한 OOP를 객체지향을 이용할 수 있다! 

 

우리가 ORM을 하게되면 모델을 만들떄 자바가 주도권을 지고있는 모델을 만들수 있다! 

이렇게 들어간 데이터를 인서트하거나 셀렉트 할떄 JPA가 자동으로 매핑해서 데이터를 쏙 넣어줄것이다. 

이런일을 하는것이 ORM이다. 

ORM을 통해서 DB와 OOP의 불일치성을 해결할수 있다!! 

DB는 객체저장이 불가능하지만 자바는 객체 저장이가능하다! 자바에서 프로그래밍할떄는 객체를 저장하고 이걸 DB에 밀어넣을 때는 JPA가 자동으로 포린키를 넣어준다!