이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.
프로토콜 / 약속 / 인터페이스
하지만 프로토콜(약속) 은 A,B,C가 있을 때 세명의 권리가 동등하다. B가 나에게 연락할 때 직접찾아와..! 라고 할때 A, C는 싫어! 라고 대답할 수 있다. 이때 B는 하지마!라고 하지 못한다. 왜? 동등한 관계에 있기 때문이다. www(word wide web) 인터넷 세상은 인터페이스로 만들어져 있다. 수많은 프로토콜이 모여서 만든게 인터넷이다. B는 다른 대안책을 제시하고 서로에게 가장 잘 맞는 프로토콜을 만든다. ex) 프로토콜: email로 연락하자..!
<결론> JPA는 Java, Persistence, Application Programing interface 자바 프로그램을 할 때 영구적으로 데이터를 저장하기 위해서 필요한 인터페이스가 JPA이다.
Object Realational Mapping이다. 쉽게 말하면 오브젝트를 데이터베이스에 연결하는 방법론이다.
ORM 을 나의 하인이라고 생각하면 된다.
Class
건물을 짓는 설계도는 2d로 만들어져있다. 이 설계도로 건물을 짓게 되면 3d로 형상이 나오는데 이것을 모델링이라고 한다. 추상적인 개념을 현실 세계에 뽑아내는 것을 의미한다.
Id: int
Name: varchar
Year: varchar
자바에서 이 테이블을 이용해 input(DML: DELETE, Update, Insert) 과 output(Select)을 진행한다고 하자.
가져오거나 집어넣을 때 자바가 되는 데이터베이스 타입값이 다르다. 그래서 클래스를 통해 데이터베이스에 있는 테이블을 모델링 해야 한다. 실제로 모델링을 하게 되면
2.
class Team {
int id;
String name;
String year;
}
이를 DB 세상에 있는 데이터를 자바세상에 모델링 한다고 한다. 하지만 이 순서를 역으로 완벽히 바꿀 수 있다.
ORM!! TRM이 아니다. 먼저 1을 진행하고 1을 통해서 데이터베이스를 자동생성할 수 있다. JPA가 가지고 있는 인터페이스를 통해서 자바에서 클래스를 만들어서 데이터베이스 테이블이 자동으로 생성되게 하는 것을 ORM이라고 한다.
흔히 아는 Select, Select All, Delete, Update, Insert 등은 굉장히 자주 일어나는 반복적인 일들이다. 이런 것들을 할때 1차적으로
자바 프로그램에서 DB에 커넥션을 요청한다. 그럼 신분을 확인하고 세션을 오픈해준다. connection을 갖게 된 자바프로그램은 쿼리를 전송할 수 있다. 데이터베이스는 해당 쿼리를 이용해서 어떤 테이블에 있는 데이터를 만들어 낸다. 이 데이터를 다시 자바에 응답하게 되는데, 각각 갖고 있는 타입이 다르므로 자바는 해당 데이터를 받아서 자바 오브젝트로 변경해야 한다.
제이슨 데이터를 사용한다고 하는데, 이 돌려주는 데이터 타입... 이런 일들 노가다.. 이런 일들을 줄여주는 게 바로 JPA이다. 전송된 쿼리에 대한 응답이 있을 때 ~~ 이런 일렬의 과정들을 함수로 대체할 수 있다. 함수를 사용하면 반복적인 작업들이 불필요해진다.
<결론>
OMR은 나의 하인이다. 왜? 이런 반복적인 CRUD 작업을 단순하게 도와주고 내가 만든 클래스를 통해 자동으로 db테이블을 만들어 주기 때문에 내가 하던 귀찮은 모든 것들을 ORM이 다 해결해주기 때문이다.
영속성: 어떤 데이터를 영구적으로 저장하게 해주는 것
자바에서는 DB에 저장한다. MySQL을 사용할 것이다. 수업에서는
컨텍스트: context 라는 개념이 약간 모호하다. 어떤 여자가 한명 있다. 영숙이라고 하자. 남자는 길동이.
남자: "난 명숙이 너의 모든 컨텍스트를 가지고 있어" = 영숙이의 모든 것들을 다 알고 있다는 것이다.
영숙: 길동이는 변태다....라고 생각할 것...
프로그램에서 보면 컨텍스트를 넘겨준다는 말이다. 길동이가 영숙이를 더 이상 좋아하지 않는 상태에서 장보고가 영숙이를 좋아한다는 것을 알았다. 그래서 장보고에게 영숙이의 컨텍스트를 다 넘겨주었다.
장보고: "영숙아, 너 어제 ㅇㅇ 먹었지?"
근데 영숙이도 장보고를 좋아해서 보고의 컨텍스트를 다 알고 있다..
쉽게 말하면 컨텍스트는 대상에 대한 모든 정보를 알고 있는 것이다.
DB가 있다. 그 데이터가 어떤 동물 데이터이다. 동물 데이터를 저장하려고 하면 다이렉트하게 접근하는 게 아니라 중간에 영속성 컨텍스트가 있다. 자바가 데이터베이스에 저장해야 할 데이터 모든 것들을 알고 있다.
야구라는 프로그램을 만들기 위한 데이터베이스 테이블이 두개 있다고 치자.
[team]
id Name year
1 롯데 1990
2 NC 2005
[player]
id Name teamId(FK)
1 이대호 1
2 공필성 1
3 가득염 1
4 홍길동 2
각각의 컬럼들은 가질 수 있는 데이터가 기본자료형들이다. 무엇을 가지지 못할까? 오브젝트를 가질 수 없다.
이대호는 1이라는 integer 데이터를 가진 것인지 1, 롯데, 1990 이 세가지를 통째로 들고 있는 오브젝트를가지지 못한다. 하지만 기서을 자바의 관점에서 모델링을 해보자고 하자.
class Team {
int id;
String name;
String year;
}
class plyaer {
int id; => 2
String name; => 공필성
int teamId; => 1
}
공필성을 셀렉트 했으면..이 데이터만 보고 공필성이라는 사람이 어떤 팀에 있는지 모른다. 일반 사용자들은 모른다 . 웹페이지에 뿌릴 때...
다시 1번으로 셀렉해서 어떤 팀인지 봐야 한다.
두번의 select, 혹은 join을 해야 한다. 하지만 실제로 자바 프로그램에서는 그렇게 하지 않아도 된다. 기본 자료형이 아닌 오브젝트를 저장할 수 있다.
class plyaer {
int id; => 2
String name; => 공필성
Team team;
}
그럼 기존에 있던 데이터베이스 테이블가 달라지게 되는데..Team라는 오브젝트가 들어갔기 때문...하지만 이런 불일치성을 ORM을 통해 해결할 수 있다. DB는 객체 저장이 불가능하지만 자바는 객체 저장이 가능하다. 자바에서 프로그래밍 할때는 객체를 저장하고, DB에 넣을 때는 JPA가 자동으로 해준다.
class car {
int id (PK)
String name;
String color;
Engine engine;
}
class Engine {
int id;
int power;
}
잘 만든 엔진이 있다. 이 엔진을 차에서 사용하고 싶다면? 상속은 할 수 없다.
자동차가 자식이고 엔진이 부모가 되는 형태가 있으면?..자동차의 부모가 엔진?..말이 안된다. 콤포지션을 사용해야 한다. 결합!
JPA는 클래스를 먼저 만들고 이 클래스를 토대로 디비 테이블을 만들어주는 기법니다. 자동생성
[car]
id name color engineId
1 BMW White 2
2 Sonata block 1
[engine]
id power
1 2000
2 4000
위 두개의 테이블이 자동 생성된다. 모든 클래스에 날짜를 넣고 싶을 것이다.
class Engine {
int id;
int power;
TimeStampe createDate;
TimeStamp update;
}
타임스템프를 car에도 동일하게 넣고 싶을 것이다. 그럼..?
Class EntityDate {
TimeStampe createDate;
TimeStamp upDate;
}
extends를 사용하자!
class car extends EntityDate{
int id (PK)
String name;
String color;
Engine engine;
}
class Engine extends EntityDate{
int id;
int power;
TimeStampe createDate;
TimeStamp update;
extends를 사용함으로써 위 부분이 필요 없어짐
}
그럼 테이블이 이런식으로 변경된다.
[car]
id name color engineId createDate updateDate
1 BMW White 2
2 Sonata block 1
방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음.
정말 감사합니다 비유가 찰떡이여서 쉽게 이해했네요.