인프런 스프링부트 개념정리(이론)
이 글은 다음 강의의 이론 정리 글 입니다.
영속성(Persistence)이란 데이터를 영구적으로 저장하는 것을 의미한다. 이 때, Spring은 파일시스템에 저장하는 것이 아니라 데이터베이스(MySQL 등)에 저장을 한다.
그렇다면 컨텍스트(Context)란 무엇일까?
A: 난 너의 모든 컨텍스트를 가지고 있어(모든 것들을 다 알고 있어)
B: (변태)
C: (A에게 B의 컨텍스트를 넘겨 받았다.)
C: B야, 너 어제 ~ 했었지? 다 알고 있음
B: C야, 너 어제 A한테 내 컨텍스트 받았지?
(이를 알고있다는 것은 B도 C의 컨텍스트를 가지고 있다는 것)
위의 대화를 보면 알 수 있듯이 컨텍스트란 대상의 모든 정보를 알고 있다는 것이다.
💡 그렇다면 영속성 컨텍스트란?
자바가 데이터를 영구적으로 저장하기 위해서는 데이터베이스에 저장하는 모든 것들을 알고 있어야한다.
이를 위해서 데이터베이스에 어떤 데이터를 저장하려고 하면 다이렉트로 데이터베이스에 접근해서 저장하는게 아니라 중간에 영속성 컨텍스트를 거쳐서 간다.
자바에서 영속성 컨텍스트로 먼저 데이터를 던지면, 영속성 컨텍스트에서 디비로 데이터를 던진다. 추가적으로 다음과 같은 상황들이 일어난다.
영속성 컨텍스트에서 데이터를 삭제를 하면 데이터베이스에서도 삭제된다.(동기화)
영속성 컨텍스트가 비어있고 데이터베이스에 과일데이터가 있는 상태라고 생각해보자.
자바가 select로 과일데이터를 요청했다. → 자바가 영속성 컨텍스트에 먼저 과일데이터 줘! 라고 했는데 영속성 컨텍스트는 비어있다. → 영속성 컨텍스트는 데이터베이스에서 과일데이터를 받아온다.내놔! (이때, 영속성 컨텍스트 안에 있는 데이터는 자바 object다.)
자바에서 사과를 딸기로 변화시키면 영속성 컨텍스트에서도 딸기로 변화한다. → 영속성 컨텍스트는 딸기고, 데이터베이스에서는 아직 사과이기 때문에 변경됨을 감지해서 데이터베이스에도 자동으로 update가 일어난다.
나는 아직 잘 모르겠다. 그래서 찾아본 다음 글을 추천.
그래서 영속성 컨텍스트가 왜 필요한데?
결론: 1차 캐시역할을 한다. 동일성이 보장된다. 쓰기 지연을 시켜준다. 변경을 감지한다.
데이터베이스에 TEAM이라는 table이 잇고, PLAYER라는 table이 있다.
TEAM
ID | NAME | YEAR |
---|---|---|
1 | 롯데 | 1990 |
2 | NC | 2005 |
PLAYER
ID | NAME | TEAM_ID (FK) |
---|---|---|
1 | 이대호 | 1 |
2 | 공필성 | 1 |
3 | 가득염 | 1 |
4 | 홍길동 | 2 |
데이터베이스에서 각 컬럼이 가질 수 있는 데이터는 기본자료형이다. 즉, 1 롯데 1990
라는 정보를 한번에 담은 Object는 가지지 못한다. 그래서 TEAM_ID로 Foreign Key(FK) 연결을 시켜줘야하는 것이다.
이를 자바로 표현하면, 어쩔 수 없이 데이터베이스에 맞춘 형식이 된다.
Class Team {
int id;
String name;
String year;
}
Class Player {
int id; = 2
String name; = 공필성
int teamId; = 1
}
이것만 보면 공필성이 어느 팀에 있는지 바로 알 방법이 없다. 이를 알기 위해서는 teamId를 통해서 다시 select를 하거나(두번의select) 아님 join을 하면 된다.
하지만 원래 자바에서는 Object를 넣는것이 가능하다.
Class Player {
int id; = 2
String name; = 공필성
Team team; = Team Object
}
이렇게 되면 데이터베이스랑 column이 달라지기 때문에 모순이 된다.
하지만, ORM을 사용하면 자바에 클래스를 먼저 만들어서 자바가 주도권을 쥐고 있는 모델을 만들수 있다. 위와 같이 Object를 넣은 Class를 만들면, 데이터를 insert하거나 select할때 JPA가 자동으로 맵핑해서 Class안의 Object에 쏙 넣어줄 것이다. 그래서 JPA가 모순(불일치성)을 해결해준다고 하는 것이다.
이제 진정한 OOP(객체 지향)를 이용할 수 있게 된 것이다!