본문 바로가기

JAVA/Spring

스프링부트 JPA 개념잡기

JPA란 무엇인가? +JPA의 장점에 대해서

 

 

1. JPA는 Java Persistence API 이다.

Persistence(영속성)이란 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 말한다.

RAM은 휘발성 데이터를 저장하는 메모리이며, 컴퓨터가 꺼지거나 정전이 되면 데이터는 전부 사라지게 된다.

데이터가 날라가지 않도록 RAM의 소중한 데이터를 비휘발성인 하드디스크에 기록하게 되면 데이터를 영구적으로 저장할 수 있다.

영속성이라는 것, 어떤 데이터가 영구히 기록되게 하는 것이다.

자바에서는 데이터 저장을 파일시스템이나 하드디스크가 아닌 DBMS인 데이터베이스에서 한다.

JPA에서 Java Persistence API라는 것은 자바의 데이터를 영구히 기록할 수 있는 환경을 제공하는 API 라는 것이다.

 

API란?

애플리케이션 프로그래밍 인터페이스를 말한다.

애플리케이션은 프로그램이고, 프로그래밍은 프로그램을 만드는 방법이고, 

그걸 만들게 해주는 인터페이스로 프로그래밍을 하면 프로그램이 만들어진다.

프로그램에는 프로토콜인터페이스라는 개념이 있는데 둘 다 어떠한 약속을 의미하지만 방식이 조금 다르다,

여기서 프로그램을 만들기 위한 인터페이스는 다음과 같다.

 

EX1) A와 B와 C라는 사람이 있는데 B가 힘이 가장 세다. B는 이제부터 나에게 연락을 할 땐 전화를 하지말고 직접 찾아오라는 명령을 내린다. A와 C는 힘이 없어서 B가 말한 규칙을 지켜야 하는 상황이 온다. 

이 규칙을 인터페이스라고 한다. A와 C는 인터페이스에 맞춰서 B에게 직접 찾아가서 연락을 해야 한다.

 

EX2) 어떤 이가 만든 프로그램에는 굉장히 좋은 기능이 몇가지 있고, 다른 사람들과 해당 기능을 공유한다.

대신 프로그램을 만든 사람은 밤 12시에서 새벽 6시까지만 기능을 사용할 수 있다는 인터페이스를 만들 수 있다.

그 사람이 만든 프로그램이기 때문에 다른 사람에게 공유하거나, 공유하지 않을 힘이 있다.

인터페이스는 상하관계가 있는 약속이고, 인터페이스를 지켜서 프로그램을 사용해야하며, 인터페이스를 받아서 프로그램을 짜면 이것이 API이다.

 

JPA의 Java Persistence API란 자바 프로그램을 할 때 영구적으로 데이터를 저장하기 위해 필요한 인터페이스이다.

 

반대로 프로토콜은 A와 B와 C가 있을 때 세명의 권리가 동등하다.

B가 이제부터 나에게 연락하고 싶다면 직접 찾아오라고 한다면 A와 C는 단호하게 싫다고 거절할 수 있다.

월드와이드웹(WWW), 인터넷 세상은 프로토콜로 만들어져있다. 수 많은 프로토콜이 모여서 만들어진게 인터넷인 것이다. B는 A와 C가 싫다고 하면 다른 대안책을 제시해야 하며, 서로에게 가장 잘 맞는 프로토콜을 만든다. (EX. 이메일로 연락하자)

세 명 모두가 동의할 수 있는 약속이 프로토콜이다.

 

 

2. JPA는 ORM 기술이다.

ORM이란? Object Relational Mapping의 약자이다.

오브젝트를 데이터베이스에 연결하는 방법론 같은 것이다.

 

클래스를 만들 때는 모델 클래스가 있다.

예를 들어 건물을 짓는 설계도는 2D로 만들어져 있고, 설계도를 가지고 직접 건물을 짓게 되면 3D로 형성이 된다.

이것을 모델링을 한다고 한다.

모델링 한다는 건, 추상적인 개념을 현실세계에 뽑아내는 것을 말한다.

 

데이터베이스에 team이라는 테이블이 있고, id/name/year라는 데이터를 가진다면

자바 프로그램에서는 이 데이터들을 가져오기도 하고 다른 데이터를 추가로 밀어넣기도 하는데,

(*밀어넣는 것은 dml / 가져오는 것은 select라고 한다.)

데이터를 가져오거나 밀어넣을때 자바가 들고 있는 데이터 타입과 데이터베이스가 들고 있는 데이터 타입은 서로 다르다. (자바는 char 데이터베이스는 varchar 등)

따라서 클래스를 통해 데이터베이스 테이블을 모델링 해야한다. 

실제로 데이터베이스 team 테이블을 모델링 하게 되면 

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

다음과 같이 모델링을 하게 되고, 이것을 데이터베이스 세상의 데이터를 자바 세상에 모델링 한다고 한다.

보통 데이터베이스의 테이블을 먼저 만들고 자바의 클래스를 만들지만 순서를 역으로 바꿀 수도 있다.

오브젝트 클래스를 먼저 만들고, 그것을 통해서 데이터베이스를 자동 생성할 수 있는데 이 때 필요한 것이 JPA가 가지고 있는 인터페이스이다.

인터페이스의 규칙을 지키면 자바의 클래스를 만들어 실행 > 데이터베이스에 테이블을 자동생성 할 수 있게 된다.

이러한 기법을 ORM이라고 한다. *오브젝트를 통한 relation

 

 

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

데이터베이스의 테이블 전체를 스캔하거나 특정한 데이터 하나만 가져오거나,

하나의 데이터를 삭제하거나 수정하는 등의 일들은 자주 일어나는 반복적인 일이다.

이런 일을 할때는 1차적으로 자바 프로그램에서 데이터베이스에게 connection 요청을 한다. 

 

데이터베이스가 신분을 확인하고 세션을 열어주면 둘은 연결이 되고 자바에서 connection을 갖는다.

두번째 요청시에는 쿼리(요청)을 전송할 수 있고 데이터베이스는 쿼리를 통해 어떤 작업을 수행한 뒤 테이블에 있는 데이터를 다시 자바에게 응답하게 되는데, 응답하면 데이터베이스와 자바의 데이터타입이 다르기 때문에 해당 데이터를 받아 자바 오브젝트로 변경해야 한다. 이러한 변경은 단순히 반복적인 노가다인데 이런 일을 JPA가 줄여줄 수 있다.

JPA를 사용하면 전송된 쿼리에 대한 응답이 있을 때 데이터를 받고 그 데이터를 오브젝트로 바꾸고

연결된 세션과의 connection을 끊는 모든 일련의 작업들을 함수 하나로 제공한다.

 

 

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

위에서 살펴봤듯, 영속성이란 어떤 데이터를 영구적으로 저장하게 해주는 것이다.

자바에서는 영구적으로 데이터를 저장할 때 파일이 아닌 데이터베이스에 저장한다.(ex. mysql)

영속성 컨텍스트의 컨텍스트란? 대상에 대한 모든 정보를 가지고 있는 것이다. 

나는 너의 컨텍스트를 가지고 있다 = 나는 너의 모든 것을 다 알고 있다.

컨텍스트는 모든 것에 달라붙을 수 있다. 그리고 어떤 대상에 달라붙는 순간 그 대상의 모든 정보를 알고 있는 것이 컨텍스트이다.

자바가 데이터베이스에 저장해야하는 모든 정보를 알고 있는 것이 영속성 컨텍스트다. 자바 프로그램에서 데이터베이스에 왔다갔다하는 모든 정보를 영속성 컨텍스트가 알고 있다. 

자바는 데이터베이스에 데이터를 저장하고 싶다면 영속성 컨텍스트에 데이터를 던지고, 영속성 컨텍스트는 그 데이터를 데이터베이스에 던진다. 영속성 컨텍스트에 있는 데이터와 데이터베이스의 데이터는 동기화되기 때문에 한쪽에서 삭제하면 삭제된다. 자바와 데이터베이스의 중간에는 영속성 컨텍스트가 있는 것이다. 자바에서 데이터를 변경하면 영속성 컨텍스트의 데이터도 변경된다. 데이터베이스에 변경된 데이터를 넣으면 서로 데이터가 다르기 때문에 insert가 아닌 update가 일어나게 된다. 이런 일들을 해주는 것도 영속성 컨텍스트이다.

즉, 영속성 컨텍스트는 자바가 데이터베이스에 저장하고 가져오는 모든 일련의 정보들을 확인할 수 있고,

자바는 항상 영속성 컨텍스트를 통해서 데이터베이스에 데이터를 저장하고,

데이터베이스에 있는 데이터도 영속성 컨텍스트를 통해서 자바에 전달된다.

영속성 컨텍스트에서 일어나는 일들은 모두 자동적으로 처리 된다.

 

 

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

데이터베이스에 team이라는 테이블과 player라는 테이블이 있고, team은 id/name/year 데이터를,

player는 id/name/team_id라는 데이터를 가지고 있으며 player의 team_id는 team의 id를 참조한다.

이 때, 데이터베이스의 각각의 컬럼은 가질 수 있는 데이터의 타입이 기본 자료형이고 오브젝트는 가지지 못한다.

자바의 관점에서 이것을 모델링 한다면

class team {
	int id;
	String name;
	String year;
}
class player {
	int id;
	String name;
	int teamid;
}

다음과 같다.

player의 id만으로는 team의 name을 알 수 없기 때문에 두번의 select를 하거나 조인을 해야 하는 상황이다.

자바는 기본 자료형 뿐만 아니라 오브젝트도 선언하거나 저장할 수 있기 때문에

class player {
	int id;
	String name;
	int teamid;
	team team; //team 오브젝트
}

이렇게 만들 수가 있지만 데이터베이스와 서로 모순이 생긴다.

ORM(오브젝트 클래스를 먼저 만들고, 그것을 통해서 데이터베이스를 자동 생성)을 하게 되면 

모델을 만들 때 자바가 주도권을 쥐고 있는 모델을 만들 수 있기 때문에 오브젝트 데이터를 넣을 수 있고,

이런 오브젝트 데이터를 select, insert 할 때 JPA가 자동으로 데이터를 매핑해서 넣어준다.

데이터베이스는 객체(오브젝트) 저장이 불가능하지만 자바는 가능하기 때문에, DB와 OOP의 불일치성을 해결하기 위한 방법론을 ORM이 제공해주는 것이다. 

 

 

6. JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다.

class car {
//자동차 클래스
}
class engine {
//잘 만든 엔진 클래스
}

자동차 클래스에서 엔진 클래스를 사용하고 싶은데, 이 때 이것을 상속할 수는 없다.

상속은 자동차가 자식이고 엔진이 부모가 되는 형태인데 자동차의 부모가 엔진이 되는 것은 말이 안된다.

이런 경우 composition이라는 방법을 써서 결합해야 한다.

class car {
//자동차 클래스
	String name;
	String color;
	Engine engine; //컴포지션
}

JPA는 데이터베이스를 먼저 만들고 데이터베이스의 테이블을 통해 car테이블을 모델링 하는게 아닌

클래스를 먼저 만들고 클래스를 토대로 자동 생성해서 데이터베이스 테이블을 만드는 기법이다 (ORM)

 

 

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

스프링은 JPA를 이용해서 데이터베이스에 접근한다.

만약 JPA가 mysql만 지원한다면 데이터베이스는 mysql만 사용 가능하지만,

JPA는 mysql 뿐만 아니라 수많은 방언을 제공해주기 때문에 mysql, 오라클 등등이 될 수 있는

추상화 객체라는 것이 특징이다.

 

 

 

 

 

 

 

 

해당 게시글은 '최주호' 님의 스프링부트 개념정리 강의를 참고하였습니다.

출처 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC/dashboard

 

'JAVA > Spring' 카테고리의 다른 글

[스프링] 패키지 이름, UTF-8  (0) 2022.02.17
스프링 컨테이너  (0) 2022.01.08
web.xml과 FrontController 패턴  (0) 2022.01.06
스프링부트의 동작 원리  (0) 2022.01.06
스프링이란? 스프링의 기초 개념  (0) 2022.01.06