JPA는 자바 진영에서 ORM(Object-Realtion Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. JPA를 구현한 대표적인 오픈소스로 Hibernate가 있다.
ORM(Object-Relation Mapping)
우리가 일반적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑한다는 뜻이며, 기술적으로는 애플리케이션의 객체를 RDB테이블에 자동으로 영속화해주는 것이라고 보면 된다.
장점
- SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
- Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임.
- 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
- 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
- 예를 들어 기존 방식에서 MySQL데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해 보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음.
단점
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음.
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야 할 수도 있음.
- 학습비용이 비쌈
JPA(Java Persistence API)
- Java 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
Hibernate
- JPA의 실제 구현 class를 모아둔 것이 Hibernate이다
- JPA라는 ORM 기술 표준을 구현한 것이 Hibernate 이므로, JPA를 사용하려면 개발자는 Hibernate를 사용하면 된다.
- Hibernate에서 자주 사용하는 것들을 Spring boot가 묶어서 보관하는데 그것이 Spring data jpa이다.
JPA를 사용하는 이유
JPA는 반복적인 CRUD SQL을 처리해 준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만 하면 되고, 예측도 쉽게 할 수 있다. 추가적으로 JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.
JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL이 아닌 객체 중심으로 개발할 수 있다는 것이다. 이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다. 또한 JPA는 패러다임의 불일치도 해결하였다. 예를 들면 JAVA에서는 부모클래스와 자식클래스의 관계 즉, 상속관계가 존재하는데 데이터 베이스에서는 이러한 객체의 상속관계를 지원하지 않는다. (상속 기능을 지원하는 DB도 있지만 객체 상속과는 다름). 이러한 상속관계를 JPA는 아래와 같은 방식으로 해결하였다.
JPA의 동작
기본 구조
- JPA의 동작은 JDBC와 애플리케이션 사이에서 동작하며 개발자가 JPA를 사용하면 JPA가 JDBC API를 사용해 SQL을 호출하여 DB와 통신을 하는 방식으로 동작한다.
- 개발자는 JDBC API를 사용하는 것이 아닌 JPA만을 사용한다.
객체 저장
1 개발자가 JPA에 객체를 넘긴다.
2 JPA는 Member entity를 분석한다.
3 JPA가 분석된 정보를 통해 Insert SQL을 생성한다.
4 JDBC API를 사용하여 SQL문을 DB에 날린다.
객체 조회
1 개발자가 조회하고자 하는 객체의 PK값을 JPA에 넘긴다.
2 JPA는 엔티티의 매핑 정보를 바탕으로 SELECT SQL을 생성한다.
3 JDBC API를 사용하여 SQL문을 DB에 날린다.
4 DB로부터 결과를 받아와 객체에 매핑시킨다.
'Spring' 카테고리의 다른 글
JWT (0) | 2023.05.03 |
---|---|
TDD 란? (0) | 2023.02.23 |
[Spring] AOP란? (0) | 2022.12.16 |
동기와 비동기 방식 (0) | 2022.11.28 |
Ajax (0) | 2022.11.28 |