Springboot 개념정리 - JPA란?

Yuri Lee·2020년 8월 18일
0

Springboot 개념정리

목록 보기
2/10

이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.

1. JPA는 Java Persistence API 이다.

  • Persistence는 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.
  • RAM 휘발성 / 하드디스크(파일시스템) 기록, 비휘발성
  • JPA 자바에 있는 데이터를 영구히 기록할 수 있는 환경을 제공하는 API이다. 프로그램의 실행이 종료되도 영구히 데이터를 기록할 수 있는 환경을 조성해준다.

API?

  • 애플리케이션(A) -> 프로그램
  • 프로그래밍(P) -> 프로그래밍
  • 인터페이스(I) -> 인터페이스

인터페이스?

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

  • A, B, C 중에서 B가 가장 힘이 좋다고 가정하자. 만약 B가 "이제부터 나에게 연락을 할 때는 전화하지 말고 직접 찾아와!" 라고 할 경우 A, C는 B가 말하는 약속을 어쩔 수 없이 지켜야 한다. 이 약속이 인터페이스이다.
  • 장보고가 어떤 프로그램을 하나 만들었다. a,b 두개의 기능이 있다. 너무 좋아서 이 기능을 홍길동,,등등 여러 사람들에게 공유하려 한다. 이때 장보고는 a 사용을 원하면 밤 12시부터 새벽 6시까지만 가능하다는 인터페이스를 만들 수 있다. 장보고가 만든 프로그램이기 때문에 남들에게 공유할 수 있는 힘이 있다. 그래서 홍길동에게 상의하지 않는다. 그냥 홍길동은 그 시간에 요청하고 데이터를 받아서 프로그램을 만들 수 있는 것이다. 홍길동은 해당 시간 안에 a를 사용해 데이터를 받고 그것을 이용하여 프로그램을 짤 수 있는데 바로 그것이 API이다.
  • 인터페이스는 상하관계까 존재하는 약속이다.

하지만 프로토콜(약속) 은 A,B,C가 있을 때 세명의 권리가 동등하다. B가 나에게 연락할 때 직접찾아와..! 라고 할때 A, C는 싫어! 라고 대답할 수 있다. 이때 B는 하지마!라고 하지 못한다. 왜? 동등한 관계에 있기 때문이다. www(word wide web) 인터넷 세상은 인터페이스로 만들어져 있다. 수많은 프로토콜이 모여서 만든게 인터넷이다. B는 다른 대안책을 제시하고 서로에게 가장 잘 맞는 프로토콜을 만든다. ex) 프로토콜: email로 연락하자..!

<결론> JPA는 Java, Persistence, Application Programing interface 자바 프로그램을 할 때 영구적으로 데이터를 저장하기 위해서 필요한 인터페이스가 JPA이다.

2. JPA는 ORM 기술이다.

Object Realational Mapping이다. 쉽게 말하면 오브젝트를 데이터베이스에 연결하는 방법론이다.
ORM 을 나의 하인이라고 생각하면 된다.

Class

건물을 짓는 설계도는 2d로 만들어져있다. 이 설계도로 건물을 짓게 되면 3d로 형상이 나오는데 이것을 모델링이라고 한다. 추상적인 개념을 현실 세계에 뽑아내는 것을 의미한다.

  1. DB에 Team이라는 테이블이 있다고 하자
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이라고 한다.

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

흔히 아는 Select, Select All, Delete, Update, Insert 등은 굉장히 자주 일어나는 반복적인 일들이다. 이런 것들을 할때 1차적으로
자바 프로그램에서 DB에 커넥션을 요청한다. 그럼 신분을 확인하고 세션을 오픈해준다. connection을 갖게 된 자바프로그램은 쿼리를 전송할 수 있다. 데이터베이스는 해당 쿼리를 이용해서 어떤 테이블에 있는 데이터를 만들어 낸다. 이 데이터를 다시 자바에 응답하게 되는데, 각각 갖고 있는 타입이 다르므로 자바는 해당 데이터를 받아서 자바 오브젝트로 변경해야 한다.

제이슨 데이터를 사용한다고 하는데, 이 돌려주는 데이터 타입... 이런 일들 노가다.. 이런 일들을 줄여주는 게 바로 JPA이다. 전송된 쿼리에 대한 응답이 있을 때 ~~ 이런 일렬의 과정들을 함수로 대체할 수 있다. 함수를 사용하면 반복적인 작업들이 불필요해진다.

<결론>
OMR은 나의 하인이다. 왜? 이런 반복적인 CRUD 작업을 단순하게 도와주고 내가 만든 클래스를 통해 자동으로 db테이블을 만들어 주기 때문에 내가 하던 귀찮은 모든 것들을 ORM이 다 해결해주기 때문이다.

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

영속성: 어떤 데이터를 영구적으로 저장하게 해주는 것

자바에서는 DB에 저장한다. MySQL을 사용할 것이다. 수업에서는

컨텍스트: context 라는 개념이 약간 모호하다. 어떤 여자가 한명 있다. 영숙이라고 하자. 남자는 길동이.

남자: "난 명숙이 너의 모든 컨텍스트를 가지고 있어" = 영숙이의 모든 것들을 다 알고 있다는 것이다.

영숙: 길동이는 변태다....라고 생각할 것...

프로그램에서 보면 컨텍스트를 넘겨준다는 말이다. 길동이가 영숙이를 더 이상 좋아하지 않는 상태에서 장보고가 영숙이를 좋아한다는 것을 알았다. 그래서 장보고에게 영숙이의 컨텍스트를 다 넘겨주었다.

장보고: "영숙아, 너 어제 ㅇㅇ 먹었지?"

근데 영숙이도 장보고를 좋아해서 보고의 컨텍스트를 다 알고 있다..

쉽게 말하면 컨텍스트는 대상에 대한 모든 정보를 알고 있는 것이다.

DB가 있다. 그 데이터가 어떤 동물 데이터이다. 동물 데이터를 저장하려고 하면 다이렉트하게 접근하는 게 아니라 중간에 영속성 컨텍스트가 있다. 자바가 데이터베이스에 저장해야 할 데이터 모든 것들을 알고 있다.

5. JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (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가 자동으로 해준다.

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

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하기 좋음. 유지보수에도 좋음.

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

  • 스프링 -> JPA -> DB
  • JPA는 mysql 뿐만 아니라 dialect 종류가 매우 많다. (oracle, mariadb, msssql, postgresql 등)
  • 추상화 객체가 DB에 달라붙어 있다. 추상화 객체라는 것은 오라클이 될 수도 있고, mysql이 될 수도 있고 사용 안하면 삭제할 수도 있다.

8. JPA는 쉽지만 어렵다.

  • 적응을 해보자 :)
profile
Step by step goes a long way ✨

1개의 댓글

comment-user-thumbnail
2021년 8월 26일

정말 감사합니다 비유가 찰떡이여서 쉽게 이해했네요.

답글 달기