JPA 개념
- JPA는 JAVA Persistence API이다.
- JPA는 ORM 기술이다.
- JPA는 반복적인 CRUD 작업을 생략하게 해준다.
- JPA는 영속성 컨텍스트를 가지고 있다.
- JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. ( DB 객체저장 불가능 )
- JPA는 OOP관점에서 모델링을 할 수 있게 해준다.( 상속, 컴포지션, 연관관계 )
- 방언 처리가 용이하여 Migration하기 좋음. 유지보수에 좋다.
먼저 영속성에 대해서 알아보자
JPA는 JAVA Persistence API(Application Programing Interface) 의 약어로, Java 프로그램에서 데이터를 영구적으로 저장하고 관리하기 위한 API이다.
보통 컴퓨터의 RAM은 전기로 데이터를 저장하여 전원이 꺼지면 데이터가 손실될 수 있는 휘발성 메모리이다. 반면에 하드 디스크는 전원이 꺼져도 데이터를 유지하는 비휘발성 메모리이다.
JPA는 앞서 말한 하드 디스크에 데이터를 영구적으로 저장하는 개념과 관련이 있습니다. JPA를 사용하면 Java 객체를 데이터베이스의 테이블에 매핑하여 영구적으로 저장할 수 있으며, 이러한 데이터는 DBMS(Database Management System)를 통해 하드 디스크에 보존된다. 이를 통해 Java 애플리케이션은 객체 지향적인 방식으로 데이터를 다루면서도 DBMS를 활용하여 데이터를 안정적으로 보관할 수 있다.
API는 애플리케이션(프로그램) 프로그래밍 인터페이스 이다. 인터페이스를 통해서 프로그래밍을 하면 프로그램이 만들어진다는 뜻이다. 다시 말하자면 JPA는 자바프로그래밍을 할 때 영구적으로 데이터를 저장하기 위해서 필요한 인터페이스이다.
프로그램에 프로토콜과 인터페이스라는 두 가지 개념이 있다.
프로토콜과 인터페이스는 모두 약속을 나타내지만 사용 방식은 다르다.
인터페이스 : 상위 개체가 하위 개체에게 제공하는 규칙이나 계약 / 상하 관계 약속
예를 들어, A, B, C 세 가지 개체가 있다고 가정해보겠다. B가 가장 권력이 강해서 '이제 B에게 연락할 때는 전화하지 말고 직접 찾아와야 한다'는 규칙을 정했다면 A와 C는 B보다 권력이 약하기 때문에 이 규칙을 따르게 된다. 이러한 규칙을 인터페이스라고 한다.
다른 예를 들어보자.
어떤 프로그램을 만들었다고 가정하고 이 프로그램에는 A와 B라는 기능이 있다. 프로그램을 만든 사람은 A 데이터를 사용하고자 할 때는 '밤 12시에서 새벽 6시까지만 이용할 수 있다'는 규칙을 만들었다. 이러한 규칙을 만든 사람은 앞 예시의 B와 마찬가지로 권력이 있는 상태가 된다. 이 시간을 지켜서 인터페이스를 받아 프로그램을 작성한다면 그것이 API가 된다.
프로토콜 : 네트워크나 통신 시스템에서 데이터를 주고받는 규칙의 체계 / 동등한 관계의 약속
예를 들어, A, B, C 세 가지 개체가 있다고 가정해보겠다. 이 셋의 권리가 동등하다. B가 '나에게 연락을 할 때는 전화하지 말고 직접 찾아와' 라는 규칙을 세워도 A C가 싫다고 할 수 있다. 따라서 B는 싫다고 하면 A C가 동의할 수 있는 프로토콜을 만들어야 한다.
다른 예를 들어보자.
두 컴퓨터가 파일을 공유하기 위해서는 파일 공유를 위한 특정한 프로토콜을 준수해야 한다. 이 프로토콜은 데이터를 주고받는 방법, 데이터 포맷, 에러 처리 등을 규정하여 양쪽 시스템이 동등한 조건에서 파일을 공유할 수 있도록 한다.
* DBMS
DBMS는 데이터베이스를 생성, 관리, 조작하는 소프트웨어 시스템을 의미한다. 이러한 시스템은 데이터베이스를 관리하고 데이터에 접근할 수 있는 인터페이스를 제공하며, 데이터의 보안, 무결성, 백업 등을 관리한다. 데이터베이스 시스템은 DBMS에 의해 관리되며, DBMS가 데이터를 효율적으로 저장하고 관리하는 환경에서 동작한다.
ORM은 무엇인가
ORM(Object Relational Mapping) : 오브젝트를 데이터베이스에 연결하는 방법론
건물 설계도를 2D로 작성하고 이를 이용하여 건물을 실제로 지을 때 3D로 만드는 과정을 "모델링"이라고 한다. 모델링은 추상적인 개념이나 설계를 현실 세계에 반영하는 것을 의미한다.
데이터베이스의 테이블은 행과 열로 구성되어 있다. 이를 자바에서 모델링하기 위해선 클래스(class)를 사용한다. 각 테이블은 클래스로 표현되며, 테이블의 열은 클래스의 멤버 변수로 매핑된다.
예를 들어, 데이터베이스에 "Team"이라는 테이블이 있고, 이 테이블은 " Id ", "Name", "Leader" 등의 열을 가지고 있다고 가정해 본다면 이를 자바에서 모델링하기 위해 다음과 같은 클래스를 작성할 수 있습니다.
Team 테이블 (데이터베이스(DB))
Id | int |
Name | varchar |
Leader | varchar |
Team.java(자바)
public class Team {
private int Id;
private String Name;
private String Leader;
}
이것을 DB세상에 있는 데이터를 자바세상에 모델링한다고 말한다.
ORM은 위와 같은 상황이 역전된다. Team.java를 통해서 Team 테이블을 자동 생성할 수 있다. 이 때 필요한 것은 JPA가 가지고 있는 인터페이스다. 즉 이 인터페이스의 규칙을 지키면 내가 클래스를 만들어서 실행을 하면 데이터베이스에 테이블이 자동생성되는 기법을 ORM이라고 하는 것이다.
JPA는 반복적인 CRUD작업을 생략한다.
- Select : 1건 조회
- Select All : 전제 조회
- Insert : 1건 추가
- Update : 1건 수정
- Delete : 1건 삭제
위는 굉장히 자주 일어나는 반복적인 일이다.
- 자바 애플리케이션에서는 데이터베이스에 접속하기 위해 Connection을 요청한다.
- 데이터베이스는 해당 요청을 받고, 인증 및 권한 확인 후에 연결을 수립하여 세션을 연다.
- 연결이 수립되면 자바 애플리케이션에서는 Connection 객체를 통해 데이터베이스와 통신할 수 있다.
- 그 다음부터는 SQL 쿼리를 이용하여 데이터베이스에 요청을 전송할 수 있다.
- 데이터베이스는 전송받은 쿼리를 실행하고, 그 결과를 다시 자바 애플리케이션에 응답한다.
- 응답된 데이터를 자바에서 처리하기 위해 필요한 형태로 변환한다.
JPA를 위의 작업들이 함수 하나로 가능해진다. 그래서 반복적으로 시행되는 CRUD를 단순하게 처리하도록 도와준다.
영속성 컨텍스트란 무엇인가
영속성 개념은 위의 이미지에서 다시 한번 더 확인!
컨텍스트(context) : 대상에 대한 모든 정보를 가지고 있는 것
영속성 컨텍스트 : 자바 애플리케이션이 데이터베이스와 상호작용할 때 필요한 모든 정보를 가지고 있는 것
데이터베이스에 어떤 데이터를 저장하고싶을 때 DB에 다이렉트로 저장하는것이 아니라 영속성 컨텍스트를 거친다.
예를 들어, 자바 애플리케이션이 데이터베이스에 동물 데이터를 저장하려면 영속성 컨텍스트에 해당 데이터를 전달하면 된다. 그러면 영속성 컨텍스트는 해당 동물 데이터를 데이터베이스에 저장하고, 만약 영속성 컨텍스트에 동물데이터를 삭제하면 데이터베이스에서도 삭제된다. 따라서 영속성 컨텍스트안에 있는 객체와 데이터베이스에있는 데이터는 항상 동기화된다.
또한, 영속성 컨텍스트는 데이터베이스에서 데이터를 가져올 때도 사용된다.
예를 들어, 영속성 컨텍스트에 아무 데이터도 없고 데이터베이스에는 과일 데이터가 있는 상황에서, 애플리케이션이 과일 데이터를 필요로 할 때 select 요청을 한다. 이때 영속성 컨텍스트가 해당 데이터를 먼저 확인한다. 데이터가 없다면 데이터베이스에 요청하여 해당 데이터를 가져와 영속성 컨텍스트가 자바 객체로 변환하여 반환한다. 그 결과로 자바의 과일 객체, 영속성 컨텍스트의 과일 데이터, 데이터베이스의 과일 데이터는 동일한 상태가 된다. 그 후 자바 애플리케이션에서 과일 데이터를 변경하면 영속성 컨텍스트에 있는 데이터도 함께 변경된다. 이 변경된 데이터를 commit하여 데이터베이스에 저장하면 원래의 데이터와 변경된 데이터의 상태가 다르기 때문에 update가 발생하게 된다.
이러한 과정에서 영속성 컨텍스트를 통해 자바 애플리케이션이 데이터베이스에 저장하고 가져오는 모든 작업을 확인할 수 있다.
이렇게 영속성 컨텍스트는 모든 메타데이터를 관리하며, 관련 작업은 모두 자동으로 처리된다.
JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공
Team 테이블
id | name | year |
1 | 한화 | 1990 |
2 | NC | 2005 |
Player 테이블
id | name | teamId |
1 | 일이삼 | 1 |
2 | 김스프링 | 1 |
3 | 이부트 | 1 |
4 | 박이론 | 2 |
teamId는 foreing key다.
이것을 모델링 하면
public class Team {
int id;
String name;
String year;
}
public class Player {
int id;
String name;
int teamId;
}
데이터베이스에서는 특정 데이터를 찾기 위해
1. 두 번의 SELECT 쿼리
2. JOIN 연산
을 사용하여 데이터를 가져온다.
컴포지션 (Composition) : 결합
하지만 자바 애플리케이션에서는 아래와 같이 Player클래스에 Team객체를 저장할 수 있다.
public class Player {
int id;
String name;
Team team;
}
위의 Player 클래스를 ORM 기술을 사용하여 데이터베이스의 테이블과 매핑할 때, 클래스 구조를 데이터베이스 테이블과 직접적으로 맞추지 않아도 되므로 DB와 OOP의 불일치성을 해결할 수 있다. 코드 유지보수도 더욱 편리하다.
참고
- OOP는 객체 지향 프로그래밍의 개념을 의미하며, 보통 데이터베이스 테이블과 일치하는 클래스를 만들어야 한다.
- ORM은 객체-관계 매핑 기술을 의미하며, 이를 사용하면 데이터베이스의 테이블과 객체 간의 매핑을 자동으로 처리한다. ORM을 사용하면 데이터베이스 테이블의 변경에 관계 없이 객체 모델을 유지한다.
JPA는 OOP관점에서 모델링이 가능
public class EntityDate {
TimeStamp createDate;
TimeStamp updateDate;
}
public class Car exends EntityDate{
int id;
String name;
String color;
Engine engine;
}
public class Engine extends EntityDate {
int id;
int power;
}
상속 (Inheritance)
Car 테이블은 EntityDate 테이블의 컬럼들을 상속받아 사용할 수 있다.
JPA는 방언 처리가 용이하여 마이그레이션(Migration)하기 좋음
스프링에서 JPA를 사용하여 데이터베이스에 접근할 때, JPA는 MySQL, Oracle, MariaDB, MSSQL 등 다양한 데이터베이스의 방언을 처리할 수 있다. 이를 가능하게 하는 것은 JPA의 추상화 객체입니다. 이 추상화 객체는 데이터베이스에 연결되어 있으며, 데이터베이스의 종류에 관계없이 일관된 방법으로 데이터베이스와 통신할 수 있도록 해준다.
즉, 개발자는 스프링 코드를 수정하지 않고도 JPA를 통해 여러 데이터베이스에 접근할 수 있다. 각 데이터베이스에 맞는 방언 처리는 JPA가 자동으로 처리하므로 개발자는 데이터베이스 종류에 따라 SQL 쿼리를 작성할 필요가 없다.
또한, 마이그레이션 작업도 JPA를 통해 쉽게 수행할 수 있다. 마이그레이션(Migration)은 데이터베이스 스키마의 변경을 관리하고 적용하는 과정을 말한다. 새로운 엔티티를 추가하거나 데이터베이스 구조를 변경할 때, JPA는 Migration 파일을 생성하여 변경 사항을 데이터베이스에 반영한다. 이 과정에서도 데이터베이스의 방언을 처리하여 적절한 SQL을 생성하고 실행한다.
이렇게 JPA를 사용하면 스프링 코드의 수정 없이도 다양한 데이터베이스와 원활하게 상호 작용할 수 있으며, Migration 작업도 쉽게 수행할 수 있다. 따라서 JPA를 통해 스프링 애플리케이션을 개발하면 유연성과 생산성이 향상된다.
JPA 참고 자료 출처 :
스프링 부트 필터와 인터셉터 참고하면 좋을 자료 출처 :
'JPA' 카테고리의 다른 글
@Transactional이란? (0) | 2024.03.26 |
---|---|
Entity와 DTO차이 (2) | 2024.03.26 |