Springboot with JPA - 데어 프로그래밍 유튜브 (4~7강)

치즈말랑이·2021년 10월 20일
0

스프링부트 with JPA

목록 보기
2/9

JPA 개념잡기

1. JPA는 Java Persistence API이다.

persistence는 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.
= 어떤 하나의 기록이 영구히 기록될 수 있게 해주는 것.

DBMS라고 해서 하드의 특정부분을 잘라내서 데이터베이스가 관리한다.
JPA 라는건 자바에 있는 데이터를 영구히 기록할 수 있는 환경을 제공하는 API이다.

API란?
Application -> 프로그램
Programming -> 프로그래밍
Interface -> 인터페이스
인터페이스를 통해서 프로그래밍을 하면 프로그램이 만들어진다.

인터페이스란?

프로토콜 : 약속
인터페이스 : 약속

A, B, C가 있는데, 이중에 B가 가장 힘이 쌔다.
B가 "이제부터 나에게 연락을 할 때는 전화하지 말고 직접 찾아와" 라고 한다면, A와C는 힘이 없어서 이 규칙을 어쩔 수 없이 지켜야 한다.
이 규칙이 인터페이스이다.

홍길동이 사용하는 프로그램을 만든 장보고는 a 데이터 사용을 원하면 밤12시~새벽6시까지 사용하라는 규칙을 만든다. 이 규칙이 인터페이스이다. 장보고가 만든 프로그램이고 힘이 있으니까 이래도 된다.
장보고는 홍길동과 상의하지 않는다. 홍길동은 인터페이스를 따라야 한다.
그래서 a라는 데이터를 받아서 프로그램을 짜면 그게 API이다.
인터페이스는 상하관계가 존재하는 약속이다.

반대로 프로토콜은 A, B, C가 있을 때 세명의 위치가 동등하다.
B가 명령을 했을때 A, C는 싫다고 할 수 있고 B는 "그럼 하지마" 라고 말하지 못한다. 프로토콜은 다 동등하기 때문.
인터넷은 수많은 프로토콜로 이루어져있다.
그래서 B는 다양한 제안을 제시하고 세명이 동시에 동의할 수 있는 프로토콜: 이메일로 연락하자 를 만든다.

JPA
Java
Persistence
Application Programming Interface
자바 프로그램을 할 때 영구적으로 데이터를 저장하기 위해서 필요한 인터페이스

2. JPA는 ORM 기술이다.

Ojbect Relational Mapping
오브젝트를 데이터베이스에 연결하는 방법론
ORM -> 나의 하인!

class를 만들때 model class라는게 있다.
건물을 지을때 설계도대로 짓는걸 모델링이라고 한다.
모델링한다 = 추상적인 개념을 현실세계로 뽑아낸다.

자바 프로그램에서 테이블에 데이터를 Input하기도 하고, -> 밀어넣는작업: DML (Delete Update Insert)
Input된 데이터를 자바쪽으로 가져오는 Output도 한다. -> 가져오는 작업: Select
자바가 들고있는 데이터타입과 데이터베이스가 가지고 있는 데이터타입이 다르다.
그래서 class를 통해서 데이터베이스에 있는 테이블을 모델링 해야한다.

class Team {
	int id;
    	String name;
    	String year;
}

-> 데이터베이스 세상에 있는 데이터를 자바세상에 모델링!

그런데 ORM을 통해서 상황을 역전할 수 있다.
class를 먼저 만들고 데이터베이스를 자동생성할 수 있다. 이때 필요한것은 JPA가 가지고 있는 인터페이스이다.
즉, 자바에서 실행하면 데이터베이스의 테이블이 자동생성되게 하는 기법을 ORM이라고 한다.

3. JPA는 반복적인 CRUD 작업을 생략하게 해준다.

Select 1건 - Read
Select All 전체 - Read
Delete 1건 - Delete
Update 1건 - Update
Insert 1건 - Create

자바프로그램이 DB에 커넥션을 요청한다. DB가 신분을 확인하고 세션을 오픈해주면 연결이 된다. 그러면 자바에서는 커넥션을 가진다.
커넥션을 가지고 두번째 요청시에는 쿼리를 전송할 수 있다. 쿼리를 전송하면 DB는 해당 쿼리를 통해 작업을 수행하여 테이블에 있는 데이터를 만들어낸다. 이 데이터를 자바에 응답하게 되는데, 이때 DB의 데이터타입과 자바의 데이터타입이 다르므로 자바는 해당 데이터를 받아서 자바object로 변경해야한다. 자바 json DB
이것은 복잡한 일이아니고 단순한 반복 로직이다. 이것을 단순하게 해주는것이 JPA이다.

1) 전송된 커리에 대한 응답이 있을때 위에 써놓은 모든 일련의 작업들을 함수 하나로 제공해준다.
CRUD의 기본적인 작업들을 JPA가 단순하게 처리하도록 도와준다.

4. 영속성 컨텍스트를 가지고 있다.

영속성 : 데이터 -> 영구적으로 저장 ! (DB, MySQL에 저장)
컨텍스트 : Context = 대상에 대한 모든 정보

동물데이터를 하나 만들어서 DB에 데이터를 저장하고 싶으면 다이렉트로 저장하는게 아니고 영속성 컨텍스트(자바가 DB에 저장해야할 모든 데이터를 다알고있는것)에 데이터를 던진다. 그러면 영속성컨텍스트에 있는 동물데이터를 DB에 던진다. 그럼 DB에 동물데이터가 저장된다. 그 후 영속성컨텍스트에서 동물데이터를 지우고 DB에 던지면, DB에 있는 동물데이터가 없어진다. 즉, 동기화가 된다.

만약에 영속성컨텍스트에 아무것도 없고, DB에 과일데이터가 있는 상태에서 과일데이터가 필요해서 요청을 하면 자바가 select요청을 하고, 영속성컨텍스트로 먼저 가서 "과일데이터좀 줘" 라고 한다. 그럼 영속성 컨텍스트에서는 과일데이터가 없으니까 DB에 가서 과일데이터 달라고 한다. 그 후 과일데이터를 받아서 영속성컨텍스트는 자바 object로 바꾼 과일데이터를 가진다.

그럼 결국 자바, 영속성컨텍스트, DB에 있는 과일데이터는 모두 동일하다. 이때 자바에 있는 과일데이터를 딸기로 바꾸면 영속성컨텍스트의 과일데이터도 딸기로 변하고, 이것을 커밋하여 DB에 밀어 넣는다. 그런데 DB에 있는 과일데이터는 사과일때 데이터가 달라서 insert가 아니라 update가 일어난다.

자바에 대한 모든 데이터 정보를 영속성컨텍스트가 들고 있다.

5. JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)

야구
team table(Id, Name, Year)
1 롯데 1990
2 NC 2005
player table(Id, Name, team Id = FK(Foreign Key 참조키, team 테이블에서 팀의 아이디))
1 이대호 1
2 공필성 1
3 가득염 1
4 홍길동 2
각각의 컬럼들은 가질 수 있는 데이터가 기본자료형이다.
object를 못가진다.
이대호는 1이라는 integer 데이터를 가진다. 하지만 1, 롯데, 1990을 통으로 가지고 있는 데이터는 못가진다.

class Team {
	int id;
	String name;
	String year;

class player {
	int id;
	String name;
	int teamid;

선수의 팀에 대한 정보를 알고 싶으면
teamid를 뽑은다음에 이걸 select해서 어떤 팀인지 찾아와야함. 혹은 join
-> 두번의 select or 조인
자바는 object로 저장할 수 있어서 이런식으로 처리안해도됨

class player {
	int id;
    	String name;
    	Team team; = Team 오브젝트 라고하면 OOP(객체지향)를 이용할 수 있다.

ORM을 하면 자바가 주도권을 가지고 있는 방식을 만들 수 있다.
이렇게 들어간 데이터를 insert하거나 select할때 jpa가 자동으로 mapping해서 데이터를 넣어준다.

6. JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 컴포지션, 연관관계)

class Car {
	int id; (PK : Primary Key)
	String name;
    	String color;
    	Engine engine;
}

class Engine {
	int id;
    int power;
    Timestamp createDate;
    Timestamp updateDate;
}

Car와 Engine class는 상속으로 하는게아니고 컴포지션(결합)으로 한다.
위의 자바코드가 JPA에 의해 테이블이 자동생성된다.
OOP관점에서 테이블이 만들어진다.
Car
id name color engineId
1 bmw white 2
2 sonata black 1

Engine
id power
1 2000
2 4000

그런데 시간을 두 테이블에 모두 넣고싶으면, 어차피 공통된 사항이므로 각각 써줄필요가 없다.

class Car extends EntityDate{
	int id; (PK : Primary Key)
	String name;
    	String color;
    	Engine engine;
}

class Engine extends EntityDate{
	int id;
    int power;

class EntityDate {
	Timestamp createDate;
    	Timestamp updateDate;

상속을 하면 테이블 아래에 더 붙는데, 컴포지션을 하면 옆으로 붙는다
Car
id name color engineId createDate updateDate
1 bmw white 2
2 sonata black 1

7. 방언 처리가 용이하여 Migration 하기 좋음. 유지보수에도 좋음.

스프링->JPA-DB
JPA는 mysql말고도 수많은 방언(dialect: 오라클, 마리아, mssql, mysql, postgre)을 지원한다.
JPA-추상화객체가 DB에 달라붙어있다.
추상화객체는 방언중에 뭐가될지 자기가 선택할 수 있음.

8. JPA는 쉽지만 어렵다.

profile
공부일기

0개의 댓글